2012-02-08 30 views
15

trong khi 'chơi xung quanh' bằng Camel sử dụng Spring DSL, tôi đã gặp phải vấn đề sau. Giả sử các dòng chảy thông điệp mong đợi trông như thế này:Apache Camel: biến cửa hàng để sử dụng sau này

  1. Client gửi thông điệp HTTP POST với cơ thể XML để Camel
  2. CAMEL proxy nhắn HTTP POST về phía máy chủ, với URI hơi thích nghi sử dụng thông tin từ cơ thể XML nhận (ví dụ: sử dụng XPath để lọc ra một tham số nhất định)
  3. sau CAMEL đã nhận được trả lời, CAMEL gửi thông điệp HTTP PUT về phía máy chủ, sử dụng các thông số ra khỏi cơ thể XML nhận được trong 1

Vì vậy, một cái gì đó như:

<route> 
    <from uri="..."> 
    <to uri="..."> 
    <to uri="..."> 
</route> 

Câu hỏi: làm cách nào để lưu trữ thông số trong Spring DSL ở bước 1 để tôi có thể sử dụng chúng trong bước 3 sau?

Vì vậy, tôi muốn trích xuất các thông số XML ra khỏi cơ thể XML của thông điệp nhận được ở bước 1 và đặt chúng vào các biến, mà tôi thì sau này có thể sử dụng để soạn thông điệp được gửi đi trong bước 3.

Để trích xuất các tham số, tôi đã nghĩ đến việc sử dụng XPATH. Điều đó có vẻ ok, nhưng tôi chỉ không thấy làm thế nào để đưa đầu ra của XPATH vào một biến và sau đó sử dụng biến đó sau này ... (cú pháp ??)

Lưu ý: như bạn thấy, sự phát triển của tôi kiến thức khá hạn chế ... xin lỗi vì điều đó. Nhưng nó sẽ vẫn tuyệt vời nếu ai đó có thể giúp với điều này :).

Trả lời

18

bạn có thể thiết lập lưu trữ dữ liệu trong Exchange tính hoặc tiêu đề thư như thế này ...

.setHeader("ID", XPathBuilder.xpath("/order/@id", String.class)) 
.setProperty("ID", XPathBuilder.xpath("/order/@id", String.class)) 

và sau đó lấy chúng trong một bean/xử lý từ Sở Giao dịch như thế này ...

String propId = (String) exchange.getProperty("ID"); 
String headerId = (String) exchange.getIn().getHeader("ID");      } 
+2

Cảm ơn đã cho câu trả lời. Tuy nhiên, bất kỳ cơ hội để có được cùng một mã nhưng cho Spring DSL (XML ký hiệu)? Chúc mừng. – opstalj

+0

Trong khi đó, tôi lại được mã hóa bằng Java DSL và nó hoạt động độc đáo. Cảm ơn một lần nữa.Tôi có thêm 1 câu hỏi: sự khác nhau giữa việc sử dụng setHeader và setProperty là gì? – opstalj

+3

Đọc chương này để tìm hiểu về các khái niệm Camel, và bạn sẽ biết sự khác biệt giữa các thuộc tính và tiêu đề: http://manning.com/ibsen/chapter1sample.pdf –

2

tôi để lại cho bạn một số ví dụ:

<setHeader headerName="token"> 
    <constant>someValue</constant> 
</setHeader> 

<setHeader headerName="userName"> 
    <simple>${properties:userName}</simple> //from config 
</setHeader> 

<setProperty propertyName="bodyBkp"> 
    <simple>${in.body}</simple> 
</setProperty> 

<setProperty propertyName="orderNumber"> 
    <xpath resultType="String">//item[1]/orderNumber/text()</xpath> 
</setProperty> 

Getter

${exchangeProperty[orderNumber]} 

${in.headers.token} 

Documentation

Kiểm tra đơn giản ngôn ngữ biểu hiện: http://camel.apache.org/simple.html

Đôi khi nhìn vào trường hợp thử nghiệm của Camel có thể hữu ích là tốt, đặc biệt đối với mùa xuân DSL:

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