2015-10-18 10 views
5
私が質問/明確化・ツー・メイクSIゲートウェイ機能に関するまし

春統合ゲートウェイは、チャネルを返信

私のゲートウェイインターフェイスは、以下のように定義されている場合:

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

そして、私の以下のように定義されたゲートウェイの設定:

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

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

私の質問/明確化・ツー・メイクは、次のとおりです。

1)ゲートウェイサービスインタフェースメソッドがvoidを返すので、ゲートウェイプロキシBeanは引き続き「default-reply-channel」またはユーザ定義の「reply-channel」で応答を探しますか?

2)言い換えれば、まだreply-channel="nullChannel"(またはdefault-reply-channel="nullChannel")と言及する必要はありますか?

OR

メソッドの戻り値がvoidであるため、ゲートウェイが自動的に返信チャネルを聞くために何を理解していないのだろうか?

3)まだこの設定にreply-timeout属性を追加することはできますか?返答が期待されないので意味がありませんか?これで

<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):同様の文脈において

、私は以下のようにサービスインターフェース方法で別のメソッドを追加した場合:

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

と以下のように私のゲートウェイの設定では、このメソッドを追加私はreply-channelを正しく定義する必要があると信じていますか?

5)default-reply-channelは、1つのメソッドゲートウェイが応答を期待しており、他の正しいものではないため、このケースでは機能しない可能性があります。

6)はいの場合は、voidを返すメソッドに対して、reply-channel="nullChannel"を明示的に指定する必要がありますか?

ご確認いただきありがとうございます。

+0

上記の説明に誰かが助けてくれますか? Artem/Garry - あなたの親切なattnをお探しですか?どうもありがとう ! – lbvirgo

+0

OK、Lalit。私はあなたの質問を主演して今日見て:-) –

答えて

3

Lalit!

ありがとうございました。ありがとうございました。私はそれらのすべてがゲートウェイのvoidメソッドの周りにあることに驚いています。

それらのすべてに簡単に合理的な答えは次のとおりです。

我々はこの問題に関するリファレンスマニュアル何で言っていないので、このような構成のための心配はありませんし、
で期待通りに動作するはずです 春の統合の信念。

私は少し冗談を言っていますが、すべての冗談は真実の一部です。

今度は、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; 
} 

場合は、あまりにも、voidで、ちょうど最後MessageChannel.send()に呼び出す

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

からMessagingGatewaySupport.send()委譲します。

この方法では、replyChannelとはまったく気にしません。

論理的には、これらのオプションはvoidメソッドで無視され、default-*は他のメソッドではvoid戻りタイプのものには影響しません。

希望です。

+0

多くのtx Artem;あなたの明確化ははっきりしています!しかし、どのようにして、voidメソッドのタイムアウト機能を、「replyTimeout」が非voidメソッドと同様のものにすることができますか?私はスレッドが不必要に長い処理時間のために立ち往生しないようにしたい。また、私はあらゆる種類のインバウンド・チャネル・アダプターの使用を避けたいと考えています。 – lbvirgo

+0

私たちが応答を待つとき、 'async'の場合にタイムアウトが必要です。リクエスト - リプライのケースが同期の場合、タイムアウトは発生しません。スタックされたスレッドの場合、 'sendAndReceive'の' send'または 'send'だけであれば問題ありません。 SIなしでユースケースを想像してみると、スレッド自体を停止するのに役立つツールはないことがわかります。 –

+0

不必要な複雑さを避けることによって、私たちの生活を楽にすることができます。 :)ありがとうArtem! – lbvirgo

関連する問題