2015-10-18 18 views
5

Tôi đã hỏi/làm rõ-to-làm liên quan đến tính năng SI cổng:Xuân Tích hợp cổng reply kênh khi phương thức hoàn trả là khoảng trống

Nếu giao diện cửa ngõ của tôi được định nghĩa như sau:

public interface MyGateway{ 
    public void myGatewayMethod(Message<?> inMessage); 
} 

Và tôi cấu hình cổng được định nghĩa như sau:

<int:gateway id="mySvcGateway" 
       service-interface="com.myCompany.myPkg.MyGateway" 
       error-channel="globalExceptionHandlerChannel"> 

     <int:method name="myGatewayMethod" request-channel="myGatewayReqChannel" />  
    </int:gateway> 

câu hỏi của tôi/làm rõ-to-làm là:

1) Vì phương thức giao diện cổng dịch vụ trả về vô hiệu, hạt proxy Gateway vẫn tìm kiếm phản hồi trên "kênh trả lời mặc định" hoặc "kênh trả lời" do người dùng xác định?

2) Nói cách khác, tôi vẫn cần phải đề cập đến reply-channel="nullChannel" (hoặc default-reply-channel="nullChannel")?

HOẶC

vì phương thức trả về bị vô hiệu, cổng tự động sẽ hiểu không để nghe kênh trả lời?

3) Tôi vẫn có thể thêm reply-timeout thuộc tính vào cấu hình này HOẶC nó sẽ không có ý nghĩa vì không có trả lời mong đợi?

Trong bối cảnh tương tự, nếu tôi thêm một phương pháp khác để phục vụ phương pháp giao diện như sau:

public interface MyGateway{ 
     public void myGatewayMethod(Message<?> inMessage); 
     public Object myGatewayMethod2(Message<?> inMessage); 
    } 

và thêm phương pháp này trong cấu hình cổng của tôi như sau:

<int:gateway id="mySvcGateway" 
        service-interface="com.myCompany.myPkg.MyGateway" 
        error-channel="globalExceptionHandlerChannel"> 

      <int:method name="myGatewayMethod" request-channel="myGatewayReqChannel" /> 
<int:method name="myGatewayMethod2" request-channel="myGatewayReqChannel2" /> 
     </int:gateway> 

4) Trong này trường hợp tôi tin rằng tôi cần phải xác định reply-channel, đúng không?

5) default-reply-channel có thể không hoạt động đối với trường hợp này vì một cổng phương thức mong đợi phản hồi chứ không phải cho câu trả lời khác, đúng không?

6) Nếu có, thì đối với phương thức trả về khoảng trống, tôi có cần đề cập rõ ràng reply-channel="nullChannel" không?

Nhờ xác nhận.

+0

Ai đó có thể giúp tôi giải thích rõ hơn? Artem/Garry - Tìm kiếm loại của bạn! Cảm ơn nhiều ! – lbvirgo

+0

OK, Lalit. Tôi đang gắn dấu sao cho câu hỏi của bạn và hãy xem hôm nay :-) –

Trả lời

3

Lalit!

Cảm ơn một loạt câu hỏi lớn và tôi ngạc nhiên khi tất cả chúng đều nằm trong phương thức void của cổng.

Câu trả lời hợp lý nhanh chóng cho tất cả trong số họ là:

Vì chúng ta không nói bất cứ điều gì trong Reference Manual về vấn đề này, không có lo lắng cho một cấu hình như vậy và nó sẽ làm việc như mong đợi bởi
niềm tin vào Tích hợp mùa xuân.

Tôi đang đùa một chút, nhưng mọi trò đùa đều là một phần của sự thật.

Bây giờ chúng ta hãy nhìn vào mã nguồn của GatewayProxyFactoryBean:

private Object invokeGatewayMethod(MethodInvocation invocation, boolean runningOnCallerThread) throws Exception { 
    .......... 
    boolean shouldReply = returnType != void.class; 
    .................. 
     Object[] args = invocation.getArguments(); 
     if (shouldReply) { 
      response = shouldReturnMessage ? gateway.sendAndReceiveMessage(args) : gateway.sendAndReceive(args); 
     } 
     else { 
      gateway.send(args); 
      response = null; 
     } 
    } 
    return (response != null) ? this.convert(response, returnType) : null; 
} 

đâu MessagingGatewaySupport.send() đại biểu đến

this.messagingTemplate.convertAndSend(requestChannel, object, this.historyWritingPostProcessor); 

đó là void, quá, và chỉ cần gọi vào cuối MessageChannel.send().

Như bạn có thể đoán phương pháp này không quan tâm đến tất cả các số replyChannelreplyTimeout. Một cách hợp lý, nó giả định rằng các tùy chọn đó sẽ chỉ bị bỏ qua cho phương pháp void và bất kỳ phương pháp nào khác không ảnh hưởng đến các phương thức khác với void loại trả về.

Hy vọng tôi rõ ràng.

+0

Nhiều tx Artem; làm rõ của bạn là tinh thể rõ ràng! Nhưng sau đó làm thế nào tôi có thể đạt được các chức năng thời gian ra cho các phương pháp void tương tự như những gì "replyTimeout" cung cấp cho phương pháp không void? Tôi không muốn các chủ đề của tôi bị mắc kẹt không cần thiết trong thời gian xử lý dài. Ngoài ra, tôi muốn tránh sử dụng bất kỳ loại bộ điều hợp kênh trong nước nào. – lbvirgo

+0

Chúng ta cần thời gian chờ chính xác trong trường hợp 'async', khi chúng ta đợi câu trả lời. Nếu trường hợp trả lời yêu cầu của bạn được đồng bộ hóa thì sẽ không có bất kỳ thời gian chờ nào liên quan. Đối với Thread bị mắc kẹt, nó không quan trọng nếu nó chỉ là 'send' hoặc' send' một phần của 'sendAndReceive'. Hãy thử tưởng tượng trường hợp sử dụng của bạn mà không có SI và bạn sẽ thấy rằng không có bất kỳ công cụ nào để giúp bạn ngăn chặn chính Thread. –

+0

Đôi khi chúng ta có thể làm cho cuộc sống của chúng ta dễ dàng bằng cách tránh những phức tạp không cần thiết! :) Cảm ơn Artem! – lbvirgo

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