2012-02-10 34 views
7

Tôi muốn để có được các loại sau đây của định tuyến:Apache Camel: Tôi có thể đặt nhiều câu lệnh trong phần khi có câu lệnh lựa chọn có điều kiện không?

  1. HTTP nhắn POST với cơ thể XML vào CAMEL
  2. tôi lưu trữ một số thông số của cơ thể XML
  3. Thông điệp được chuyển đến một bên ngoài endpoint
  4. các thiết bị đầu cuối bên ngoài (bên ngoài máy chủ) trả lời

-> tại thời điểm này, tôi muốn kiểm tra xem câu trả lời từ các thiết bị đầu cuối bên ngoài là một HTTP 20 0 OK chứa tham số XML bằng SUCCESS. -> nếu có, thì tôi muốn sử dụng một số thông số được lưu trữ để xây dựng một thông báo HTTP mới (phương pháp = PUT thời gian này) và gửi đến một điểm cuối bên ngoài

Vấn đề mà tôi hiện đang có, là như sau:

.choice() 
.when(simple("${in.headers.CamelHttpResponseCode} == 200")) 
    // now I want do a few things, eg: check also the XML body via xpath 
    // and change the message to be sent out (change Method to PUT, ...) 
    .to("http://myserver.com") 
.otherwise() 
    // if no 200 OK, I want the route to be stopped ... not sure how ? 
.end() 

Câu hỏi: bạn có ý tưởng thêm các câu lệnh bổ sung này trong trường hợp mã phản hồi HTTP là 200 OK không? Có vẻ như khi nào không cho phép tôi thêm các câu lệnh bổ sung ... (Tôi gặp lỗi trong IDE Eclipse của tôi).

Xin cảm ơn trước.

Lưu ý: có thể là tôi phải định tuyến thư trong trường hợp 200 OK khớp với 'điểm cuối mới' và sau đó tạo mới từ tuyến với điểm cuối mới này không? Ví dụ:

.choice() 
    .when(simple("${in.headers.CamelHttpResponseCode} == 200")) 
     .to("mynewendpoint") 
    .otherwise() 
     // if no 200 OK, I want the route to be stopped ... not sure how ? 
    .end(); 

from("mynewendpoint"). 
    .setHeader(etc etc) 
    .to("http://myserver.com") 

Trong trường hợp thứ hai, làm thế nào chính xác tôi nên xác định 'điểm mới' này?

Trả lời

20

Trong các ngôn ngữ lập trình DSL như Java, bạn có thể tạo các vị từ cùng nhau. Tôi đăng một blog entry cách đây vài năm về vấn đề này tại địa chỉ: http://davsclaus.blogspot.com/2009/02/apache-camel-and-using-compound.html

Ví dụ có hai vị từ

Predicate p1 = header("hl7.msh.messageType").isEqualTo("ORM"): 
Predicate p2 = header("hl7.msh.triggerEvent").isEqualTo("001"); 

Bạn có thể chuỗi chúng lại với nhau, sử dụng và hay hay.

Predicate isOrm = PredicateBuilder.and(p1, p2); 

Và sau đó bạn có thể sử dụng isOrm trong con đường

from("hl7listener") 
    .unmarshal(hl7format) 
    .choice() 
     .when(isOrm).beanRef("hl7handler", "handleORM") 
     .otherwise().beanRef("hl7handler", "badMessage") 
    .end() 
    .marshal(hl7format); 
+0

Siêu! Cảm ơn. – opstalj

+0

Bất kỳ lý do nào tại sao 'Predicate isOrm = PredicateBuilder.and (tiêu đề (" hl7.msh.messageType "). IsEqualTo (" ORM "), tiêu đề (" hl7.msh.triggerEvent "). IsEqualTo (" 001 "));' sẽ không hoạt động? Một cái gì đó về cách thức và khi nó được đánh giá? – Antares42

+0

Có cách nào để sử dụng PredicateBuilder này trong kế hoạch chi tiết không? – Yannick

4

vâng, bạn có thể có nhiều câu lệnh giữa .Khi() và .otherwise() và bạn luôn có thể gọi .endChoice() để kết thúc một cách rõ ràng mỗi khối có điều kiện ...

cho câu hỏi khác của bạn, bạn có thể sử dụng camel-direct để kết hợp nhiều tuyến đường, v.v ...

+0

Cảm ơn. Tôi phải có một lỗi cú pháp trước đây, tôi thực sự có thể chỉ cần nhập nhiều câu lệnh giữa .when() và .otherwise(). – opstalj

Các vấn đề liên quan