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

Spring Integration--适用于大容量应用的可靠TCP

党源
2023-03-14

我的服务器配置:

<task:executor id="myTaskExecutor"
    pool-size="4-8"
    queue-capacity="0"
    rejection-policy="CALLER_RUNS" />

<int-ip:tcp-connection-factory id="serverTcpConFact"
    type="server"
    port="60000"
    using-nio="true"
    single-use="false"
    so-timeout="300000"
    task-executor="myTaskExecutor" />

<int-ip:tcp-inbound-channel-adapter id="tcpInboundAdapter"
    channel="tcpInbound"
    connection-factory="serverTcpConFact" />

<channel id="tcpInbound" />

<service-activator input-channel="tcpInbound"
    ref="myService"
    method="test" />

<beans:bean id="myService" class="org.test.tcpserver.MyService" />

由于连接工厂的默认任务执行器是无界的,所以我使用池任务执行器来防止内存不足错误。

用于负载测试的简单客户端:

public class TCPClientTest {
    static Socket socket;
    static List<Socket> sl = new ArrayList<>();
    static DataOutputStream out;

    public static void main(String[] args) throws Exception {
        for (int i = 0; i < 10000; i++) {
            socket = new Socket("localhost", 60000);
            sl.add(socket);
            out = new DataOutputStream(socket.getOutputStream());
            out.writeBytes("connection " + i + "\r\n");
            System.out.println("Using connection #" + i);
        }
        System.in.read();
    }
}
public class MyService {
    public void test(byte[] input) {
        System.out.println("Received: " + new String(input));
    }
}

资料来源

共有1个答案

夹谷星剑
2023-03-14

我明白是什么问题了,请打开一个JIRA问题。

问题是执行器中的caller_runs拒绝策略具有0长度队列。

有一个线程处理所有IO事件(通常是MyTaskExecutor-1);当读取事件激发时,他排队执行以读取数据;读取器线程将执行排队以组装数据(它将阻塞,直到一个完整的消息到达(在您的情况下由CRLF终止)。

TRACE: [May-18 10:43:38,923][myTaskExecutor-1] tcp.connection.TcpNioServerConnectionFactory - Port 60000 SelectionCount: 2
DEBUG: [May-18 10:43:38,923][myTaskExecutor-1] tcp.connection.TcpNioConnection - localhost:58509:60000:bdc36c59-c31b-470e-96c3-6270e7c46a2f Reading...
DEBUG: [May-18 10:43:38,924][myTaskExecutor-1] tcp.connection.TcpNioConnection - localhost:58509:60000:bdc36c59-c31b-470e-96c3-6270e7c46a2f Running an assembler
TRACE: [May-18 10:43:38,924][myTaskExecutor-1] tcp.connection.TcpNioConnection - localhost:58509:60000:bdc36c59-c31b-470e-96c3-6270e7c46a2f Nio message assembler running...
DEBUG: [May-18 10:43:38,926][myTaskExecutor-1] tcp.serializer.ByteArrayCrLfSerializer - Available to read:0
 类似资料:
  • 问题内容: 我试图分裂循环即 使用multiprocessing.Process,它对于较小的N值效果很好。当我使用较大的N值时,就会出现问题。在p.join()之前或期间发生了一些奇怪的事情,并且程序没有响应。如果我将print i放在函数f的定义中,而不是q.put(i),则一切正常。 我将不胜感激任何帮助。这是代码。 问题答案: 您正在尝试无限制地增加队列,并且您正在加入一个等待队列中有空间

  • 我有定义了left、right和top约束的NSTextField(没有设置bottom约束)。我需要NSTextField增长,如果内容不能容纳在其中,并减少大小,如果有未使用的空间。 现在我有了:如果NSTextField有多行文本或太多内容,它会以奇怪的行为自动扩展,而且NSTextField在窗口调整大小时不会减小自己的大小。 在Swift上,我还没有找到任何简单的解决方案来解决这个问题(

  • 我正在使用JSON API插件与我的wordpress页面,get_recent_posts json的数组大小约为250个帖子。例如,当我调用 http://www.example.org/api/get_recent_posts/ 在浏览器中查看这些帖子时,我得到一个空白页面,控制台中没有错误。但是,如果我限制例如 http://www.example.org/api/get_recent_p

  • 问题内容: 前一段时间,我阅读了这篇文章,该文章展示了一种在Swing中实现可调整鼠标大小的组件的方法。 作者使用null的LayoutManager以便进行绝对的组件定位。我知道不应该使用null布局,所以我的问题是: 是否有已经实现的LayoutManager允许组件的绝对定位,还是我必须自己实现它? 问题答案: 布局管理器实际上执行3件事: 设置组件的位置。由于您需要能够拖动组件,因此您不希

  • 考虑以下几点: 为什么第一个版本是编译错误,当我已经声明lambda是可变的,并通过值捕获(我认为是它的副本)? 使用clang(x86_64-apple-darwin14.3.0)和Visual C(vc120)进行测试,这是错误消息的来源。

  • 我使用的OptaPlanner有两个规划变量,其中一个定义为nullable=true。遵循会议示例(为简单起见),假设Room可以为空,但Time不能为空。 我在非空的变量上定义了一个约束,但似乎只有当可空的变量不为空时,惩罚才起作用,否则会失败。 下面是我的代码片段: 在我的约束提供者类中,我定义了以下约束来确保一个人不能参加两个单独的会议: 当创建两个具有非空值的对象时,如果假设同一个人同时