2012-08-09 27 views
5

tình hình hiện tại của tôi:Mule 3: Kiểm soát cho dù một dòng chảy được phép được thực hiện

Tôi hiện đang có một ứng dụng Mule ESB với ba dòng thông điệp quá trình xuất phát từ hai nguồn khác nhau, ba dòng này được gắn lại với nhau sử dụng hàng đợi VM.

dòng # 1:

Inbound (Endpoint # 1) -> (Thực hiện xử lý tin nhắn và biến đổi) -> Outbound (Endpoint # 3)

luồng # 2:

Inbound (Endpoint # 2) -> (Thực hiện xử lý và biến đổi thư) -> Outbound (Endpoint # 3)

Dòng # 3

Inbound (Endpoint # 3) -> (Thực hiện xử lý tin nhắn và biến đổi, làm công cụ) -> Outbound

Vấn đề/Vấn đề:

Bây giờ những gì tôi muốn làm là giới thiệu một phần tư flow, Flow # 4, nhận thông tin trạng thái từ một điểm cuối trong và dựa vào thông tin này có thể ngăn chặn luồng # 3 được thực thi/ngăn không cho xử lý các thông điệp gửi đến của nó.

Nói cách khác, điều tôi muốn là chạy Flow # 4 khi khởi động ứng dụng ESB (giống như tất cả các luồng dường như tự động làm) và dựa trên thông tin trạng thái mà nó nhận được từ thư đến , ngăn chặn/cho phép hoặc bật/tắt Luồng số 3 từ bao giờ xử lý thư từ Endpoint # 3.

Sau đây là những gì tôi lý tưởng yêu cầu:

Yêu cầu:

  1. Phải có khả năng để thực hiện chủ yếu thông qua XML dòng chảy con la, không POJO thêm/tùy chỉnh các đối tượng Java.
  2. Luồng 4 phải được thực hiện khi khởi động ứng dụng ESB và chỉ cần xử lý thông báo gửi đến đầu tiên.
  3. Lý tưởng nhất, tôi không muốn Dòng số 3 có nguồn nội bộ tổng hợp hoặc phải đánh giá mọi thông điệp gửi đến trạng thái của một số biến toàn cầu.

Cách tốt nhất để hoàn thành những gì tôi muốn làm là gì?

Nếu không có giải pháp thực sự tốt, thì nếu tôi phải bỏ qua yêu cầu # 3 thì cách tốt nhất để thực hiện biến toàn cầu được chia sẻ giữa hai luồng độc lập không được liên kết với nhau bởi một số đi -> đầu cuối vào trong cấu hình XML? Tôi đã thử sử dụng các thuộc tính phiên, nhưng chúng yêu cầu các luồng được gắn với nhau như một luồng con hoặc bởi một điểm cuối.

Cảm ơn.

+0

Tôi sắp đề xuất # 3, nghĩa là. bằng cách sử dụng một biến toàn cục trong sổ đăng ký Mule. Tại sao điều này không được chấp nhận? Ngoài ra, mặc dù không cần lớp Java tùy chỉnh, một số kịch bản MEL/Groovy sẽ là. –

+0

Vâng, một lần nữa các yêu cầu, đặc biệt là # 3 chỉ là những gì tôi muốn lý tưởng. Nhưng nếu không có giải pháp tốt hơn hoặc cách để thực hiện các hành vi mong muốn thì đó là phương sách cuối cùng của tôi. Biến toàn cầu như thế này sẽ được thực hiện như thế nào trong cấu hình XML? Làm thế nào để khai báo trên toàn cầu một biến trong XML ngoài luồng và tham chiếu nó trong các luồng? Cảm ơn. – MikeCompSciGeek

Trả lời

6

Sử dụng một tính chất toàn cầu và một vài biểu MEL để thực hiện điều này:

<global-property name="gate_open" value="true" /> 

<flow name="gated-flow"> 
    <vm:inbound-endpoint path="gated.in" /> 
    <expression-filter expression="#[app.registry.gate_open]" /> 
    ... 
</flow> 


<flow name="gate-controller"> 
    <vm:inbound-endpoint path="gate.in" /> 
    <expression-component> 
     app.registry.gate_open = false 
    </expression-component> 
</flow> 

gửi bất kỳ thông điệp tới vm://gate.in sẽ đóng cổng và gated-flow sẽ ngừng xử lý các thông điệp mà nó nhận được.

Bạn có thể sử dụng bất kỳ giao thức nào bạn muốn thay vì VM.

+0

Tuyệt vời, cảm ơn! Đó là đơn giản hơn và sạch hơn một giải pháp hơn tôi nghĩ nó sẽ được. – MikeCompSciGeek

+0

Dường như điều này được thiết kế để chỉ chấp nhận một thông báo: cả hai luồng đều nhận được thông báo từ điểm kết thúc và một luồng sẽ đóng luồng khác. Tôi đã tự hỏi nếu điều này có thể tạo ra một điều kiện chủng tộc, trong đó một trong hai điều khó chịu có thể xảy ra: 1) dòng điều khiển tắt luồng trước khi thông điệp đầu tiên là quá trình hoặc 2) một tin nhắn thứ hai có thể trượt qua trước khi thông điệp đầu tiên trong dòng điều khiển có cơ hội thay đổi giá trị biến. – Rondo

+1

"cả hai luồng đều nhận được thông báo từ điểm cuối": âm, chúng nghe hai hàng đợi VM khác nhau: 'gated.in' và' gate.in'. –