the*_*bus 1 java connection jboss stream wildfly
我正在构建一个通知系统,允许客户端连接到网络服务器,然后收到服务器端事件的通知。我目前使用 Wildfly 16.0 独立版(在 Windows 上)作为 Web 服务器。我使用下面的示例代码得到了服务器端事件。
@GET
@Path("register")
@Produces("text/event-stream")
public void subscribe(@Context SseEventSink sseEventSink,
@HeaderParam(HttpHeaders.LAST_EVENT_ID_HEADER)) {
while (true) {
OutboundSseEvent sseEvent = this.eventBuilder
.data("some data")
.reconnectDelay(3000)
.build();
CompletionStage<?> cs = sseEventSink.send(sseEvent);
cs.whenComplete((x, y) -> {
System.out.println("Completed " + x);
if (y != null) y.printStackTrace();
});
Thread.sleep(5 * 1000);
}
sseEventSink.close();
}
Run Code Online (Sandbox Code Playgroud)
该解决方案适用于最多 120 个连接的客户端,服务器负载最小,之后无法建立新连接。
我使用 ApacheBench 2.3 版进行测试。
ab -A 123:123 -c 120 -n 120 http://127.0.0.1:8080/
Run Code Online (Sandbox Code Playgroud)
如果我的并发连接数超过 120 个,其他人就无法连接。在我看来,存在活动连接或流或线程限制。如果一个用户断开连接,另一个用户可以连接。我尝试在standalone.xml 中的http-listener 上设置最大连接数。这没有效果。我只是简单地为我能找到的每个连接/线程/池选项添加一个零。仍然没有改变。
接下来去哪里看?
小智 5
我认为你没有面临连接限制问题,而是wildfly耗尽了I/O线程。如果您运行 8 核 CPU,它将匹配您提到的约 120 个并发客户端:来自https://wildscribe.github.io/WildFly/18.0/subsystem/io/worker/index.html#attr-task-max-线程
指定worker任务线程池的最大线程数。如果不设置,则使用默认值,计算公式为cpuCount * 16
使用 jboss-cli.sh 增加该值:
/subsystem=io/worker=default:write-attribute(name=task-max-threads, value=1024)
Run Code Online (Sandbox Code Playgroud)
或者在standalone.xml中:
<subsystem xmlns="urn:jboss:domain:io:3.0">
<worker name="default" task-max-threads="1024"/>
<buffer-pool name="default"/>
</subsystem>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8723 次 |
| 最近记录: |