如何使用Spring Cloud Stream app starter TCP处理消息

时间:2017-02-20 14:13:11

标签: java spring tcp spring-cloud-stream

我想使用Spring Cloud Stream App Starter TCP Source project(maven artifact)以便能够通过套接字/端口接收TCP消息,处理它们然后将结果推送到消息代理(例如RabbitMQ)。

这个TCP源项目似乎完全符合我的要求,但它会自动将收到的消息发送到输出通道。那么,是否有一种干净的方法仍然使用TCP源项目但拦截TCP传入消息以在内部转换它们之前将它们输出到我的消息代理?

1 个答案:

答案 0 :(得分:1)

请参阅aggregation

您使用源和处理器创建聚合应用。

  

Spring Cloud Stream支持将多个应用程序聚合在一起,直接连接其输入和输出通道,并避免通过代理交换消息的额外成本。从Spring Cloud Stream 1.0版开始,仅支持以下类型的应用程序进行聚合:

     

来源,汇,处理器......

     

可以通过创建一系列互连的应用程序将它们聚合在一起,其中序列中元素的输出通道连接到下一个元素的输入通道(如果存在)。序列可以从源或处理器开始,它可以包含任意数量的处理器,并且必须以处理器或接收器结束。

修改

作为解决Source自动装配问题的一种方法,您可以尝试类似......

@EnableBinding(Source.class)
@EnableConfigurationProperties(TcpSourceProperties.class)
public class MyTcpSourceConfiguration {

    @Autowired
    private Source channels;

    @Autowired
    private TcpSourceProperties properties;

    @Bean
    public TcpReceivingChannelAdapter adapter(
            @Qualifier("tcpSourceConnectionFactory") AbstractConnectionFactory connectionFactory) {
        TcpReceivingChannelAdapter adapter = new TcpReceivingChannelAdapter();
        adapter.setConnectionFactory(connectionFactory);
        adapter.setOutputChannelName("toMyProcessor");
        return adapter;
    }

    @ServiceActivator(inputChannel = "toMyProcessor", outputChannel = Source.OUTPUT)
    public byte[] myProcessor(byte[] fromTcp) {
        ...
    }

    @Bean
    public TcpConnectionFactoryFactoryBean tcpSourceConnectionFactory(
            @Qualifier("tcpSourceDecoder") AbstractByteArraySerializer decoder) throws Exception {
        TcpConnectionFactoryFactoryBean factoryBean = new TcpConnectionFactoryFactoryBean();
        factoryBean.setType("server");
        factoryBean.setPort(this.properties.getPort());
        factoryBean.setUsingNio(this.properties.isNio());
        factoryBean.setUsingDirectBuffers(this.properties.isUseDirectBuffers());
        factoryBean.setLookupHost(this.properties.isReverseLookup());
        factoryBean.setDeserializer(decoder);
        factoryBean.setSoTimeout(this.properties.getSocketTimeout());
        return factoryBean;
    }

    @Bean
    public EncoderDecoderFactoryBean tcpSourceDecoder() {
        EncoderDecoderFactoryBean factoryBean = new EncoderDecoderFactoryBean(this.properties.getDecoder());
        factoryBean.setMaxMessageSize(this.properties.getBufferSize());
        return factoryBean;
    }

}