当前位置: 首页 > 知识库问答 >
问题:

如何使用spring集成创建异步singleton socket服务器?

许高峻
2023-03-14

我想使用sping-集成实现以下目标:拥有一个不断接收和写入数据的单例开放套接字,asyncrhon!

这意味着我必须打开一个不断从单个套接字读取的套接字,分派每个消息进行异步处理,并通过套接字异步返回响应。

如何实现这种异步模式?

特别是:如何使用序列化器/反序列化器?据我所知,序列化程序只在新的套接字连接上调用,所以在我的情况下,只在第一条消息的开头调用一次?

@Configuration
public class SocketConfig {
    @Bean
    public TcpConnectionFactoryFactoryBean tcpFactory(MyConverter converter) {
        TcpConnectionFactoryFactoryBean fact = new TcpConnectionFactoryFactoryBean();
        fact.setType("server");
        fact.setPort(PORT);
        fact.setUsingNio(true); //should I use true or false?
        fact.setSingleUse(false); //keep socket constantly open
        fact.setSerializer(converter);
        fact.setDeserializer(converter);
        return fact;
    }

    @Bean
    public TcpInboundGateway serverGateway(
            @Qualifier("tcpFactory") TcpConnectionFactoryFactoryBean factory,
            @Qualifier("serverChannel") MessageChannel serverChannel) throws Exception {
        TcpInboundGateway g = new TcpInboundGateway();
        g.setConnectionFactory(factory.getObject());
        g.setRequestChannel(serverChannel);
        return g;
    }

}

@MessageEndpoint
public class SocketEndpoint {

    @ServiceActivator(inputChannel = "serverChannel")
    public Object run(Object obj) {

    }
}


@Service
public class MyConverter implements Serializer<Object>, Deserializer<Object> {
    //read from socket
    @Override
    public Object deserialize(InputStream inputStream) {
    }

    //send back to socket
    @Override
    public void serialize(Object message, OutputStream outputStream) {
    }
}

共有1个答案

融泓
2023-03-14

网关用于单个请求/响应对。

如果您需要为单个请求发送多个响应,则必须使用协作通道适配器,如留档中所述。

协作适配器也可以用于(服务器端或客户端)完全异步通信(而不是请求/回复语义学)。

在服务器端,必须小心填充ip\U connectionId标头,因为它用于将消息与连接关联起来。来自入站适配器的消息将自动设置标头。如果希望构造其他要发送的消息,则需要设置标头。可以从传入消息中捕获标头值。

 类似资料:
  • 我有一个使用Spring Boot设计的RestFul Webservice。 web服务相当繁重,因为它必须在启动时进行大量的数据库调用,并且有些端到其他端进行大量的IO操作来提供结果。 我想让Restful Api成为异步的,这样它就可以更有伸缩性,而且它花时间来提供它的结果。 我甚至实现了这一点,但我无法测试这是否是异步的。 如果我想要 如果向url/all发出请求

  • 本文向大家介绍使用docker创建集成服务lnmp环境,包括了使用docker创建集成服务lnmp环境的使用技巧和注意事项,需要的朋友参考一下 在掌握了docker的基本命令之后,我也是想着去用docker做一点实际的配套环境,就拿自己最常用的lnmp环境来做测试。配套环境运行的顺序依次是mysql->php->nginx,至于为什么,在下面会解释。 1.MySQL 之后服务运行的镜像如无特别的提

  • 我有一个Web服务,每个版本将有多个版本和多个类。我想在启动时动态创建服务激活器,这样我就可以减少配置量,从而更容易维护。开发人员可以放入一个新类,SI会自动拾取它。 我编码了一个Application Listener: 稍后在路由器中,我有以下代码: 但当路由器尝试路由时,我会出现以下错误: 我该怎么做?我需要动态创建服务激活器,并在以后将消息路由到这些激活器。 没有办法在ServiceAct

  • 我试图使用Java配置创建一个Spring4 RESTFul服务,并将其部署到Tomcat。但我无法到达终点。我错过了什么?这就是我所拥有的。 我被派往Tomcat。Tomcat开始很好。我试着点击它http://localhost:8080/api/greetings,它给了我404。我错过了什么? 谢了!

  • 我正在使用与Spring集成。我有一个入站网关web服务,当有人调用它时,它将自动解析为JAXB生成的类。 但是当我调试到源代码中时,我看到使用DOM的。我认为它会使用SAX将XML数据绑定到Java对象,SAX更快。为什么默认情况下使用DOM?如何将其配置为使用SAX? 当我检查文件时 解组器需要源的实例。如果消息负载不是源的实例,将尝试转换。当前为字符串、文件和组织。w3c。多姆。支持文档有效

  • 我正在尝试如何在使用Eureka的Spring Boot应用程序上构建集成测试。说我有考试 我的代码路径中有该 api 调用: 这将NPE。发现客户端返回为空。如果我直接启动 Spring 启动应用程序并自己使用 API,代码工作正常。我在任何地方都没有特定的个人资料用法。我需要为发现客户端配置一些特殊的 wrt Eureka 以进行测试吗?