Spring integration 使用spring集成监听TCP提要

Spring integration 使用spring集成监听TCP提要,spring-integration,Spring Integration,我想连接到两个不同的TLS加密TCP提要,并读取和发送json数据。当然会以某种方式处理传入的数据。它不一定需要在spring集成中处理,但可以放在队列中或其他任何地方 我不想硬编码主机和端口,因为我在运行时从调用的RESTAPI获取它们 我发送的内容不一定会生成回复,我也不一定期望从我发送的数据中得到回复 我在用spring集成实现这一点上有点困难。 我通过以下方式获得了某种效果,但并不完全有效: public static IntegrationFlow RegisterFeedFl

我想连接到两个不同的TLS加密TCP提要,并读取和发送json数据。当然会以某种方式处理传入的数据。它不一定需要在spring集成中处理,但可以放在队列中或其他任何地方

我不想硬编码主机和端口,因为我在运行时从调用的RESTAPI获取它们

我发送的内容不一定会生成回复,我也不一定期望从我发送的数据中得到回复

我在用spring集成实现这一点上有点困难。 我通过以下方式获得了某种效果,但并不完全有效:

    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;
    }
这里缺少的是:

  • TLS
  • 因为我使用的是Tcp.outboundGateway(),所以它总是希望我发送的数据得到回复。我不要这个
  • 我假设我可以通过在.serializer()和.deserializer()中放入一些内容来自动编码和解码json。这个假设正确吗

    我将如何正确地实现这一点

    @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正确初始化。