收到消息的spring集成回调

时间:2017-03-13 14:12:00

标签: java spring spring-integration

春季与春季融合还是新手,请耐心等待。 =)

我已经设置了一个使用TCP连接到远程服务器的客户端。一旦建立连接,服务器就会发送消息。使用ngrep我已经验证连接已启动,并且消息是从服务器发送的。

使用网关接口" gw"我可以成功收到消息。但是,我想要做的是在收到消息时触发com.example.Client.onMessage方法。我的理解是,使用ServiceActivator可以实现这一点,如下所示。这是真的还是我必须使用自己的专用线程进行阻塞接收?感谢。

配置       

  <bean id="javaDeserializer"
      class="org.springframework.integration.ip.tcp.serializer.ByteArrayLfSerializer" />

  <int-ip:tcp-connection-factory id="client"
    type="client" host="localhost" port="12000"
    single-use="false" so-timeout="10000" so-keep-alive="true" deserializer="javaDeserializer"
    serializer="javaSerializer"/>

  <int:gateway id="gw" service-interface="com.example.Interface"
    default-request-channel="input" default-reply-channel="replies" />

  <int:channel id="input" />

  <int:channel id="replies">
    <int:queue />
  </int:channel>

  <int-ip:tcp-outbound-channel-adapter
    id="outboundClient" channel="input" connection-factory="client" />

  <int-ip:tcp-inbound-channel-adapter
    id="inboundClient" channel="replies" connection-factory="client"
    client-mode="true" retry-interval="10000" auto-startup="true" />

  <int:service-activator input-channel="input" output-channel="replies" ref="com.example.Client" method="onMessage" />

ServiceActivator

@EnableIntegration
@IntegrationComponentScan
@MessageEndpoint
public class Client {

    @ServiceActivator
    public void onMessage(byte[] received) {
        //Not called
    }
}

1 个答案:

答案 0 :(得分:1)

    必须在@EnableIntegration上配置
  1. @IntegrationComponentScan@Configuration。一般的Spring注释配置原则:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/beans.html#beans-java。虽然拥有XML配置,但根本不需要这些注释。

  2. 如果您希望从TCP接收<service-activator>的消息,则必须将input-channel配置为replies

  3. 现在你的配置太乱了:input频道有几个订阅者。在这种情况下,他们通过循环方式接收传入的消息。

  4. 如果我理解正确,您应该删除所有<int:gateway>人员,然后执行第2步。虽然目前尚不清楚如何向input频道发送消息......