2017-07-26 14 views
13

Tôi khá mới trong WSO2 ESB và tôi có thực hiện một bộ xử lý tin nhắn tùy chỉnh với hành vi cụ thể này : thực hiện một thao tác sau đó một phần tử được truy xuất từ ​​kho lưu trữ thư và trước khi chuỗi liên quan đến bộ xử lý tin nhắn này được thực hiện.Làm thế nào để thực hiện một SamplingService tùy chỉnh cho một bộ xử lý tin nhắn tùy chỉnh? Log sau đó một phần tử được lấy ra và trước khi trình tự được thực hiện

Tôi cố gắng giải thích chi tiết.

Đây là ESB định nghĩa xử lý thông điệp của tôi:

<?xml version="1.0" encoding="UTF-8"?> 
<!---<messageProcessor class="org.apache.synapse.message.processor.impl.sampler.SamplingProcessor" messageStore="transferFromMessageStore" name="transferFromMessageProcessor" xmlns="http://ws.apache.org/ns/synapse">--> 
<messageProcessor class="com.mycompany.toolkit.messageprocessor.SamplingProcessorHeaderRateLimitation" messageStore="transferFromMessageStore" name="transferFromMessageProcessor" xmlns="http://ws.apache.org/ns/synapse"> 
    <parameter name="sequence">transferProcessorSequence</parameter> 
    <parameter name="interval">1000</parameter> 
    <parameter name="is.active">true</parameter> 
    <parameter name="concurrency">1</parameter> 
</messageProcessor> 

Nó lấy một số yếu tố (tài liệu XML) hình thành transferFromMessageStore (một hàng đợi) và vượt qua đối tượng này đến transferProcessorSequence.xml chuỗi sử dụng nó. Như bạn có thể thấy tại thời điểm này, tôi đã triển khai bộ xử lý tin nhắn tùy chỉnh SamplingProcessorHeaderRateLimit chỉ cần mở rộng lớp org.apache.synapse.message.processor.impl.sampler.SamplingProcessor WSO2. Tại thời điểm này, nó chỉ hiển thị nhật ký khi phương thức init() được thực hiện. Tôi triển khai nó trên máy chủ Carbon của tôi và nó hoạt động.

Here bạn có thể tìm thấy toàn bộ mã dự án.

Ok nhưng từ những gì tôi đã hiểu để có được những hành vi mong muốn tôi không phải chỉ đơn giản là mở rộng lớp SamplingProcessor vì để làm được thực hiện tùy chỉnh giữa mỗi tiêu thụ thông điệp và công văn đến trình tự, cần phải mở rộng các lớp SamplingService lớp học, số này one.

Tôi nghĩ rằng mình cần ghi đè thực hiện() hoặc tìm nạp (MessageConsumer msgConsumer).

Tại thời điểm này, bạn cũng nên chèn nhật ký, thứ gì đó ghi vào tệp nhật ký mỗi khi phần tử được truy xuất từ ​​cửa hàng thư và trước khi chuỗi liên quan đến bộ xử lý thư được thực hiện.

Có thể không?

Vì vậy, chính Doubs chính của tôi là:

1) Có tôi để tạo ra một lớp mở rộng lớp SamplingService vào cùng một dự án mà tôi đang thực hiện xử lý thông báo tùy chỉnh của tôi (hành vi này đã được sử dụng chỉ dành cho bộ xử lý tin nhắn cụ thể này trong dự án ESO2 WSO2 của tôi, tất cả bộ xử lý tin nhắn khác được sử dụng trong dự án này phải sử dụng triển khai SamplingService chuẩn).

2) Một nghi ngờ khác liên quan đến cách tùy chỉnh Thực hiện lấy mẫu thực hiện này được chuyển đến bộ xử lý tin nhắn tùy chỉnh của tôi. Vào lớp WSSP của SamplingProcessor (cách liên kết việc triển khai bộ xử lý thông điệp tùy chỉnh cụ thể với việc triển khai SamplingService tùy chỉnh xử lý vòng đời của nó).

+0

2 câu hỏi tại sao bạn không ghi đè phương thức getTask (nó đã bảo vệ modifer) trong com.mycompany.toolkit.messageprocessor.SamplingProcessorHeaderRateLimitation và trả về lớp của riêng bạn mở rộng SamplingService? – simar

+0

@simar Bạn có ý nghĩa gì? Tại thời điểm này tôi đã ghi đè lên phương thức getTask() chỉ cần đưa vào nó một số thông điệp tường trình \ println (chỉ để kiểm tra puropose). Vấn đề là tôi không bao giờ có được kết quả đầu ra này vào các tệp nhật ký của mình (ngược lại tôi có được bản ghi phương thức init()). Vì vậy, có vẻ như với tôi rằng phương thức getTask() này không bao giờ được thực hiện vì một lý do nào đó. bạn có một số ý tưởng về nó? Có lẽ là công cụ sửa đổi được bảo vệ? – AndreaNobili

+0

Call log.info() chỉ hiển thị khi bạn đăng nhập đúng cấu hình để hiển thị trong tập tin. Call System.out.println chỉ hiển thị trong bảng điều khiển.Bạn đã thử chạy trong chế độ giao diện điều khiển và tìm thông báo println trong phương thức getTask chưa? Bạn có tryiend để chạy wsoesb trong chế độ gỡ lỗi và thử gỡ lỗi để xem những gì đang xảy ra sai? – simar

Trả lời

1
1) Have I to create a class extending the SamplingService class into the same project in which I am implementing my custom message processor (this behavior have to be used only for this specific message processor in my WSO2 ESB project, all the other message processor used in this project have to use the standard SamplingService implementation). 

tùy chỉnh của bạn SamplingProcessorHeaderRateLimitation sẽ chỉ tiêu thụ thông điệp đến để transferFromMessageStore và sẽ bơm thông điệp mà nó tiêu thụ và chế biến chỉ đến chuỗi transferProcessorSequence. Tất cả các đường dẫn khác sẽ không được xử lý bởi bộ xử lý thư này.

2) Another doubt is related about how this custom SamplingService implementation is passed to my custom message processor. Into the the SamplingProcessor WSO2 class (how to associate a specific custom message processor implementation with a custom SamplingService implementation handling its lifecycle). 

Nếu bạn nhìn vào Source Code bạn thực hiện SamplingProcessorHeaderRateLimitation.getTask() Bạn đã gắn liền với tùy chỉnh của bạn SamplingService2 với tùy chỉnh của bạn SamplingProcessorHeaderRateLimitation

@Override 
protected Task getTask() { 
    logger.info("getTask() START"); 
    System.out.println("getTask() START"); 
    logger.info("getTask() END"); 
    System.out.println("getTask() END"); 
    return (Task) new SamplingService2(this, synapseEnvironment, CONCURRENCY, SEQUENCE, isProcessorStartAsDeactivated()); 
} 
+0

Sự nghi ngờ của tôi là: bạn có thể thấy tôi đặt một số logger \ println khi phương thức getTask() bắt đầu và nó trả về nhưng nhật ký này không xuất hiện trong tệp nhật ký (khác với nhật ký được đưa vào phương thức init() hiện diện trong tệp nhật ký của tôi). Vì vậy, có vẻ như với tôi rằng vì một lý do nào đó phương thức getTask() này không bao giờ được thực hiện (nó chỉ là một hypotesis) và nó vẫn đang sử dụng việc thực hiện SamplingService tiêu chuẩn. Bạn có một số ý tưởng thêm về nó? Cảm ơn – AndreaNobili

+0

Đã xảy ra lỗi ở đây (nguồn thanh toán cuối cùng từ github). SamplingService2 không phải là impelementing Task interface vì vậy nó không thể được cast vào Task. Nó giả sử để ném ClassCastException – simar

0

Bạn đã cấu hình công tác trong XML?

<task name="CheckPrice" class="org.wso2.esb.tutorial.tasks.PlaceStockOrderTask"> 
    <trigger interval="5000"/> 
</task> 

hoặc

<task name="CheckPrice" class="org.wso2.esb.tutorial.tasks.PlaceStockOrderTask"> 
    <trigger interval="5000" count="10"/> 
</task> 
0

Q1:

Có tôi để tạo ra một lớp mở rộng lớp SamplingService vào cùng một dự án trong đó tôi đang thực hiện xử lý thông báo tùy chỉnh của tôi (hành vi này chỉ được sử dụng cho bộ xử lý tin nhắn cụ thể trong dự án ESO2 WSO2 của tôi, al l bộ xử lý tin nhắn khác được sử dụng trong dự án này phải sử dụng triển khai SamplingService tiêu chuẩn).

<messageProcessor class="com.mycompany.toolkit.messageprocessor.SamplingProcessorHeaderRateLimitation" messageStore="transferFromMessageStore" name="transferFromMessageProcessor" xmlns="http://ws.apache.org/ns/synapse"> 
<parameter name="sequence">transferProcessorSequence</parameter> 

xử Custom và dịch vụ sẽ được chỉ được sử dụng khi nó được quy định như lớp xử lý, như trên trong ví dụ của bạn.

Q2:

nghi ngờ khác là có liên quan về cách tùy chỉnh này SamplingService thực hiện được thông qua để xử lý thông báo tùy chỉnh của tôi. Vào lớp SamplingProcessor WSO2 (cách liên kết một triển khai thực hiện bộ lọc thông báo tùy chỉnh cụ thể với triển khai thực hiện SamplingService tùy chỉnh xử lý vòng đời của nó).

Bạn có thể trực tiếp mở rộng/thực hiện ScheduledMessageProcessor hơn SamplingProcessor, vì nó chỉ thực hiện getTask() và khởi điểm đối tượng trong phương pháp init(). Ngoài ra, lớp SamplingService2 của bạn sẽ mở rộng giao diện Task, ManagedLifecycle.

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