我想使用Spring Cloud Stream App Starter TCP Source project(maven artifact)以便能够通过套接字/端口接收TCP消息,处理它们然后将结果推送到消息代理(例如RabbitMQ)。
这个TCP源项目似乎完全符合我的要求,但它会自动将收到的消息发送到输出通道。那么,是否有一种干净的方法仍然使用TCP源项目但拦截TCP传入消息以在内部转换它们之前将它们输出到我的消息代理?
答案 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;
}
}