Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何异步处理SSE事件?_Java_Jakarta Ee_Jax Rs_Server Sent Events_Java Ee 8 - Fatal编程技术网

Java 如何异步处理SSE事件?

Java 如何异步处理SSE事件?,java,jakarta-ee,jax-rs,server-sent-events,java-ee-8,Java,Jakarta Ee,Jax Rs,Server Sent Events,Java Ee 8,最理想的情况是,我希望能够这样做 Request request = new Request("http://someendpoint") request.onMessage(payload -> System.out.println(payload)) request.onError(error -> error.printStackTrace()) request.onClose(() -> System.out.println("closed")) request.onC

最理想的情况是,我希望能够这样做

Request request = new Request("http://someendpoint")
request.onMessage(payload -> System.out.println(payload))
request.onError(error -> error.printStackTrace())
request.onClose(() -> System.out.println("closed"))
request.onConnect(isReconnect -> System.out.println("connected"))
显然不一定要完全像那样,只是觉得这会有助于解释我想做什么


我看到在泽西岛有人对此表示支持。我想找到一个替代方案,但如果没有其他可用的话,我会使用它。

SSE在JavaEE8中通过JAX-RS2.1在包中提供。与同步或异步的请求和响应不同,SSE本质上是异步的

有关sse的演示,请参见David Delabassee。您的代码(仅限于客户端)如下所示:

Client client = ClientBuilder.newClient();
WebTarget target = client.target("http://someendpoint");

SseEventSource eventSource = SseEventSource.target(target)
                                           .reconnectingEvery(5, TimeUnit.SECONDS)
                                           .build();
eventSource.register(payload -> System.out.println(payload),   // Consumer<InboundSseEvent>
                     error -> error.printStackTrace(),         // Consumer<Throwable>
                     () -> System.out.println("no more events"));
eventSource.open();
// and eventually
eventSource.close();
Client-Client=ClientBuilder.newClient();
WebTarget=client.target(“http://someendpoint");
SSEventSource eventSource=SSEventSource.target(目标)
.重新连接(5,时间单位。秒)
.build();
eventSource.register(有效负载->系统.out.println(有效负载),//消费者
错误->错误。printStackTrace(),//消费者
()->System.out.println(“无更多事件”);
eventSource.open();
//最终
eventSource.close();
没有用于(重新)连接和关闭的内置处理程序,但是您可以自定义一些具有相同效果的处理程序

JAX-RS 2.1在(至少)中实现:

  • 2.26,包含在Glassfish 5和Payara 5 alpha/快照/预发布中
  • 4.0.0.Beta1(发布时间不到一个月),据报道它可以在Wildfly 10及以上版本上工作,但我认为只有Wildfly 12能够实现完整的JavaEE 8(公告会随着时间的推移而变化…)

我希望您知道,当您在一个问题上悬赏时,您将损失50个声誉点。如果您寻找特定于“Apache HTTP组件”的内容,您应该将您的问题标记为这样的内容。考虑删除不相关的标签,也就是说,在你的问题中,我看不到任何特定的KOTLIN。正确地标记你的问题会提高引起知道答案的人注意的机会。@Holger我已经删除了Kotlin标记,之前忘记删除了。它不必特定于Apache HTTP组件。我不想使用Jersey的唯一原因是它也是一个完整的HTTP客户端,而且我已经在使用Apache了。很抱歉给您带来混乱。@ezzzCash您会收到一个确认框,告诉您奖金点数已被删除,并且无论何时您尝试发放奖金,奖金点数都无法恢复。如果这是一个好问题,那么悬赏会吸引更多的选票,因此会有一些补偿。如果“没有用于(重新)连接和关闭的内置处理程序,
reconnectingEvery()
做什么?另外,我不能直接使用JAX-RS吗,当我尝试创建一个新的客户端时,我得到了
java.lang.ClassNotFoundException:org.glassfish.jersey.client.JerseyClientBuilder
@CalebBassham,我的意思是没有“重新连接时”事件处理程序,您可以插入(每次重新连接时执行的代码),比如“收到事件时”或“收到错误时”@CalebBassham不知道你所说的“直接使用JAX-RS”是什么意思。JAX-RS是一个规范,您必须使用一个实现它的库,比如Jersey或RESTEasy。看起来您正在使用Jersey,但是如果您对代码有特定问题,请提出新问题。如果你想的话,你可以在这里给我链接。当我说“直接使用它”时,我的意思是像得到maven依赖项一样,只使用它而不是球衣或其他东西。当我试图打开SSEventSource时,它会给我一个异常。我的问题是,我是否必须使用Jersey(或其他实现)才能使用JAX-RS?