Java 如何增加Wildfly中的最大连接、流和线程数?
我正在构建一个通知系统,它允许客户端连接到web服务器,然后通过服务器端事件得到通知。我目前使用Wildfly 16.0单机版(在Windows上)作为web服务器。我使用下面的示例代码处理了服务器端事件Java 如何增加Wildfly中的最大连接、流和线程数?,java,jboss,stream,connection,wildfly,Java,Jboss,Stream,Connection,Wildfly,我正在构建一个通知系统,它允许客户端连接到web服务器,然后通过服务器端事件得到通知。我目前使用Wildfly 16.0单机版(在Windows上)作为web服务器。我使用下面的示例代码处理了服务器端事件 @GET @Path("register") @Produces("text/event-stream") public void subscribe(@Context SseEventSink sseEventSink, @HeaderParam(
@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();
}
如果我的并发连接数超过120,其他人就无法连接。在我看来,存在一个活动连接或流或线程限制。如果一个用户断开连接,则另一个用户无法连接。我试图在standalone.xml中的http侦听器上设置最大连接数。这没有效果。我并没有简单地为我能找到的每个连接/线程/池选项添加一个零。不过,没有变化
下一步要看哪里?您可以将
max connections
connections属性添加到http listner
标记中。e、 g
<http-listener name="default" max-connections="1000" socket-binding="http" redirect-socket="https" enable-http2="true"/>
使用此选项,您将能够增加最大连接数。您可以将
max connections
connections属性添加到http listner
标记中。e、 g
<http-listener name="default" max-connections="1000" socket-binding="http" redirect-socket="https" enable-http2="true"/>
有了它,您将能够增加最大连接数。我认为您的连接已经用完,因为
subscribe
方法永远不会返回,因为while(true){…}
循环
以下是我的作品:
@Singleton
@Path("")
public class BroadcastService {
@Context
private Sse sse;
private SseBroadcaster broadcaster;
@PostConstruct
void initialise() {
this.broadcaster = sse.newBroadcaster();
}
@PreDestroy
void shutdown() {
this.broadcaster.close();
}
@GET
@Path("register")
@Produces(MediaType.SERVER_SENT_EVENTS)
public void subscribe(@Context SseEventSink sseEventSink) {
this.broadcaster.register(sseEventSink);
}
@Schedule(second = "*/5", minute = "*", hour = "*", persistent = false)
public void broadcastData() {
OutboundSseEvent sseEvent = this.sse.newEventBuilder()
.data("some data")
.reconnectDelay(3000)
.build();
this.broadcaster.broadcast(sseEvent);
}
}
我测试了:
ab -c 2000 -n 4000 http://127.0.0.1:8080/sse-demo/register
并且仍然能够:
curl http://127.0.0.1:8080/sse-demo/register
retry: 3000
data: some data
retry: 3000
data: some data
我相信您正在耗尽连接,因为
subscribe
方法永远不会返回,因为while(true){…}
循环
以下是我的作品:
@Singleton
@Path("")
public class BroadcastService {
@Context
private Sse sse;
private SseBroadcaster broadcaster;
@PostConstruct
void initialise() {
this.broadcaster = sse.newBroadcaster();
}
@PreDestroy
void shutdown() {
this.broadcaster.close();
}
@GET
@Path("register")
@Produces(MediaType.SERVER_SENT_EVENTS)
public void subscribe(@Context SseEventSink sseEventSink) {
this.broadcaster.register(sseEventSink);
}
@Schedule(second = "*/5", minute = "*", hour = "*", persistent = false)
public void broadcastData() {
OutboundSseEvent sseEvent = this.sse.newEventBuilder()
.data("some data")
.reconnectDelay(3000)
.build();
this.broadcaster.broadcast(sseEvent);
}
}
我测试了:
ab -c 2000 -n 4000 http://127.0.0.1:8080/sse-demo/register
并且仍然能够:
curl http://127.0.0.1:8080/sse-demo/register
retry: 3000
data: some data
retry: 3000
data: some data
我认为您没有面临连接限制问题,而是wildfly耗尽了I/O线程。如果您运行8核CPU,它将与您提到的大约120个并发客户端相匹配:从 指定辅助任务线程池的最大线程数。如果未设置,则使用由公式cpuCount*16计算的默认值 使用jboss-cli.sh增加值:
/subsystem=io/worker=default:write-attribute(name=task-max-threads, value=1024)
或者在standalone.xml中:
<subsystem xmlns="urn:jboss:domain:io:3.0">
<worker name="default" task-max-threads="1024"/>
<buffer-pool name="default"/>
</subsystem>
我认为您没有面临连接限制问题,而是wildfly耗尽了I/O线程。如果您运行8核CPU,它将与您提到的大约120个并发客户端相匹配:从 指定辅助任务线程池的最大线程数。如果未设置,则使用由公式cpuCount*16计算的默认值 使用jboss-cli.sh增加值:
/subsystem=io/worker=default:write-attribute(name=task-max-threads, value=1024)
或者在standalone.xml中:
<subsystem xmlns="urn:jboss:domain:io:3.0">
<worker name="default" task-max-threads="1024"/>
<buffer-pool name="default"/>
</subsystem>
什么版本的Windows?例如,Windows 10并不意味着服务器操作系统,它的限制比Windows服务器操作系统低。Windows的哪个版本?例如,Windows 10并不意味着作为服务器O/S,它的限制将低于Windows服务器O/S。