2016-04-26 11 views
1

私は、スプリング統合を使用して既存のサーバに接続するtcpクライアントを実装しようとしています。まだ技術に慣れていないので、私はhttps://github.com/spring-projects/spring-integration-samplesの春の例に従っています。Spring統合によるサーバからクライアントへのリクエストの送信

クライアントがサーバーに接続してから要求を送信し、サーバーから応答を返す単純なケースを実装することができました。しかし、私たちのサーバーが実装されているため、次のような場合を実装する必要があります。クライアントはサーバーに接続し、サーバーからの要求を待ってから応答データで応答する必要があります。

どうすれば実装できますか?ゲートウェイでは、応答データを取得する前に要求を送信する必要があるため、クライアント側でゲートウェイを使用できるようには見えません。次に、入力チャネルとしてtcp-outbound-gatewayのreply-channelを使用してサービスアクティベータを設定することを検討しました。ただし、サービスの実装では応答は受信されません。クライアントからの最初のリクエストを送信すると、チャンネルが開かれたように見えます。

Spring構成:

<int-ip:tcp-connection-factory id="client" 
           type="client" 
           host="localhost" 
           port="12345" 
           single-use="false" 
           so-timeout="10000" 
           deserializer="javaSerializerDeserializer" 
           serializer="javaSerializerDeserializer" /> 
<bean id="javaSerializerDeserializer" 
     class="org.springframework.integration.ip.tcp.serializer.ByteArrayLfSerializer" /> 

<int-ip:tcp-outbound-gateway id="outGateway" 
          request-channel="input" 
          reply-channel="clientBytes2StringChannel" 
          connection-factory="client" 
          request-timeout="10000" 
          reply-timeout="10000" /> 

<int:object-to-string-transformer id="clientBytes2String" 
            input-channel="clientBytes2StringChannel" /> 

<int:service-activator input-channel="clientBytes2StringChannel" ref="thinclientService" /> 
<bean id="thinclientService" class="tcp.service.ThinClientService" /> 

ThinClientService:

@Component 
public class ThinClientService { 
    private static final Logger LOGGER = LoggerFactory.getLogger(ThinClientService.class); 

    public String receive(String recv) { 
     LOGGER.info("*****************Recv: {}", recv); 
     return "echo"; 
    } 
} 

主な方法:

@SpringBootApplication 
public class Application { 
    public static void main(String args[]) throws Exception { 
      GenericXmlApplicationContext context = new GenericXmlApplicationContext(); 
     context.load("classpath:META-INF/beans.xml"); 
     context.registerShutdownHook(); 
     context.refresh(); 

     System.out.println("Running test"); 

     SpringApplication.run(Application.class, args); 
    } 
} 
現在、私は次のことを持っています

データを送信したくない場合でも、このクライアントを強制的にサーバーに接続できますか?

答えて

1

これを自分で把握することができました。私はtcp-outbound-gatewayをclient-mode = "true"のtcp-inbound-gatewayに変更しなければなりませんでした。その後、サービスアクティベータはサーバから送信されたメッセージを受信します。

更新豆の設定:

<int-ip:tcp-connection-factory id="client" 
           type="client" 
           host="localhost" 
           port="12345" single-use="false" so-timeout="10000" deserializer="javaSerializerDeserializer" 
           serializer="javaSerializerDeserializer" /> 
<bean id="javaSerializerDeserializer" 
     class="org.springframework.integration.ip.tcp.serializer.ByteArrayLfSerializer" /> 

<int-ip:tcp-inbound-gateway id="outGateway" 
          request-channel="input" 
          connection-factory="client" 
          client-mode="true" 
          retry-interval="1000" 
          scheduler="reconnectScheduler" /> 

<bean id="reconnectScheduler" class="org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler" /> 

<int:object-to-string-transformer id="clientBytes2String" 
            input-channel="input" output-channel="responseString" /> 

<int:service-activator input-channel="responseString" ref="thinclientService" /> 
<bean id="thinclientService" class="tcp.service.ThinClientService" /> 
+0

素晴らしいことです!だから、自分の答えでさえ受け入れることができます! –

+0

インターフェイスでは、2日後に自分の回答のみを受け入れることができます。 – mdewit

関連する問題