1

こんにちは私はSpring Integrationを使用して次のフローを実装しようとしています。 RESTサービスを公開し、ペイロードを操作し、変更されたペイロードをJMSに書き込み、RESTサービスに応答します。Spring統合:RESTからJMSへの統合でタイムアウトエラーが発生する

@Bean 
public IntegrationFlow httpInputFlow() { 
    return IntegrationFlows 
      .from(Http.inboundGateway(“/company”) 
        .requestMapping(r -> r 
          .methods(HttpMethod.POST)) 
        .requestPayloadType(com.poc.model.Company.class)) 
      .transform(jsonToObjectTransformer()) 
      .channel(requestChannel()) 
      .get(); 
} 

@Bean 
@Transformer(inputChannel=“requestChannel”, outputChannel=“responseChannel”) 
ObjectToJsonTransformer jsonToObjectTransformer() { 
    return new ObjectToJsonTransformer(); 
} 
@Bean 
public DirectChannel requestChannel() { 
    return MessageChannels.direct().get(); 
} 
@Bean 
public DirectChannel responseChannel() { 
    return MessageChannels.direct().get(); 
} 
@Bean 
IntegrationFlow outboundFlow() throws Exception { 
    return IntegrationFlows.from(responseChannel()) .handle(Jms.outboundAdapter(connectionFactory()).destination(“samplequeue”)) 
      .get(); 
} 

要求ペイロードがキューに到達しています。ただし、RESTサービスは応答なしでタイムアウトします。変換されたペイロードをキューに入れる必要があり、残りのサービスの応答にも送信されます。利用可能な例が見つかりませんでした。

何か助けていただければ幸いです。

答えて

1

publishSubscribeである必要があります。bridgeサブスクライバーを追加すると、HTTP受信ゲートウェイに返信することができます。片方向のコンポーネントのJms.outboundAdapter()で、返信はしません。これでフローが停止し、エントリポイントに応答しません。

ご利用の場合は次のように書くことができます。

@Bean 
public IntegrationFlow httpInputFlow() { 
    return IntegrationFlows 
      .from(Http.inboundGateway("/company") 
        .requestMapping(r -> r 
          .methods(HttpMethod.POST)) 
        .reqestPayloadType(com.poc.model.Company.class)) 
      .transform(jsonToObjectTransformer()) 
      .publishSubscribeChannel(subscribers -> 
        subscribers.subscribe(f -> f 
         .handle(Jms.outboundAdapter(connectionFactory()).destination("samplequeue")))) 
      .bridge(null) 
      .get(); 
} 

publishSubscribeChannel()は、必要なチャネルを提供します。 subscribers.subscribe()これに最初のサブスクライバとしてJms.outboundAdapter()を追加します。 .bridge()は、publishSubscribeChannel()に最後の(ここでは2番目の)サブスクライバとして追加されます。

Http.inboundGateway()が入力されたreplyChannelヘッダーに返信するBridgeHandlerの背後にあるアイデア。

+0

感謝Artem、これを試してみましょう。 – jack

+0

ブリッジハンドラを.bridge()で渡す方法をアドバイスできますか?ブリッジメソッドは、Consumer >を引数として想定しています。サンプルはxmlにあり、java dslではありません。 – jack

+0

は '.brdige(null)'でなければなりません。 Java DSLを5.0のSpring Integration Coreに移行した後、引数なしで '.bridge()'を追加しました。 –

関連する問題