Spring integration 使用spring集成监听TCP提要
我想连接到两个不同的TLS加密TCP提要,并读取和发送json数据。当然会以某种方式处理传入的数据。它不一定需要在spring集成中处理,但可以放在队列中或其他任何地方 我不想硬编码主机和端口,因为我在运行时从调用的RESTAPI获取它们 我发送的内容不一定会生成回复,我也不一定期望从我发送的数据中得到回复 我在用spring集成实现这一点上有点困难。 我通过以下方式获得了某种效果,但并不完全有效:Spring integration 使用spring集成监听TCP提要,spring-integration,Spring Integration,我想连接到两个不同的TLS加密TCP提要,并读取和发送json数据。当然会以某种方式处理传入的数据。它不一定需要在spring集成中处理,但可以放在队列中或其他任何地方 我不想硬编码主机和端口,因为我在运行时从调用的RESTAPI获取它们 我发送的内容不一定会生成回复,我也不一定期望从我发送的数据中得到回复 我在用spring集成实现这一点上有点困难。 我通过以下方式获得了某种效果,但并不完全有效: public static IntegrationFlow RegisterFeedFl
public static IntegrationFlow RegisterFeedFlow(final IntegrationFlowContext flowContext,
final String id, final String host, final int port) {
IntegrationFlow feedFlow = f -> f
.handle(Tcp
.outboundGateway(Tcp.netClient(host, port).serializer(TcpCodecs.crlf())
.deserializer(TcpCodecs.lengthHeader1()))
.remoteTimeout(m -> 5000))
.transform(Transformers.objectToString()).handle(System.out::println);
flowContext.registration(feedFlow).id(id).register();
return feedFlow;
}
这里缺少的是:
@springboot应用程序
公共类Gitter66应用程序{
公共静态void main(字符串[]args){
run(Gitter66Application.class,args);
}
@豆子
公共TcpConnectionFactoryFactoryBean privateFeedClient(){
TcpConnectionFactoryFactoryBean fb=新的TcpConnectionFactoryFactoryBean(“客户”);
fb.setHost(“localhost”);
fb.设置端口(1234);
fb.setSerializer(TcpCodecs.crlf());
setDeserializer(TcpCodecs.lengthHeader1());
fb.setSslContextSupport(新的DefaultTcpSSLContextSupport(“keystore.ks”),
“trustStore.ks”、“keystrepassword”、“trustStorePassword”);
返回fb;
}
@豆子
公共TcpConnectionFactoryFactoryBean privateFeedServer(){
TcpConnectionFactoryFactoryBean fb=新的TcpConnectionFactoryFactoryBean(“服务器”);
fb.设置端口(1234);
fb.setSerializer(TcpCodecs.lengthHeader1());
setDeserializer(TcpCodecs.crlf());
fb.setSslContextSupport(新的DefaultTcpSSLContextSupport(“keystore.ks”),
“trustStore.ks”、“keystrepassword”、“trustStorePassword”);
返回fb;
}
@豆子
公共集成流流出(AbstractClientConnectionFactory cf){
返回f->f.handle(Tcp.outboundAdapter(cf));
}
@豆子
公共集成流程流入(AbstractServerConnectionFactory cf){
返回IntegrationFlows.from(Tcp.inboundAdapter(cf))
.transform(Transformers.objectToString())
.handle(System.out::println)
.get();
}
@豆子
public ApplicationRunner(@Qualifier(“flowOut.input”)MessageChannel){
返回参数->{
发送(新的通用消息(“foo”);
};
}
}
结果:
GenericMessage [payload=foo, headers={ip_tcp_remotePort=62471, ...
编辑
当然,您可以像在问题中一样动态地注册流。要动态注册工厂,请执行以下操作:
private TcpConnectionFactoryFactoryBean privateFeedClient(字符串主机,int端口){
TcpConnectionFactoryFactoryBean fb=新的TcpConnectionFactoryFactoryBean(“客户”);
fb.setHost(主机);
fb.设置端口(端口);
fb.setSerializer(TcpCodecs.crlf());
setDeserializer(TcpCodecs.lengthHeader1());
fb.setSslContextSupport(新的DefaultTcpSSLContextSupport(“keystore.ks”),
“trustStore.ks”、“keystrepassword”、“trustStorePassword”);
返回fb;
}
专用TcpConnectionFactoryFactoryBean专用FeedServer(int端口){
TcpConnectionFactoryFactoryBean fb=新的TcpConnectionFactoryFactoryBean(“服务器”);
fb.设置端口(1234);
fb.setSerializer(TcpCodecs.lengthHeader1());
setDeserializer(TcpCodecs.crlf());
fb.setSslContextSupport(新的DefaultTcpSSLContextSupport(“keystore.ks”),
“trustStore.ks”、“keystrepassword”、“trustStorePassword”);
返回fb;
}
@豆子
公共应用程序运行程序(通用应用程序上下文上下文){
返回参数->{
TCPConnectionFactoryBean服务器=privateFeedServer(1234);
registerBean(“服务器”,tcpcConnectionFactoryBean.class,
()->服务器);
TcpConnectionFactoryFactoryBean客户端=privateFeedClient(“本地主机”,1234);
registerBean(“客户端”,tcpcConnectionFactoryBean.class,
()->客户);
//注册流
};
}
使用此解决方案,我将如何A)动态设置主机和端口B)创建第二个提要客户端(我们称之为publicFeedClient)?context.registerBean的第一个参数是我将在@限定符中输入的内容,以获取bean,对吗?我甚至可以这样使用@Bean
注释,还是必须通过应用程序上下文获取Bean?我还在这里学习Spring。您不能使用@Bean
进行动态注册。您应该从上下文中获取bean,以便它由Spring正确初始化。