gpt4 book ai didi

java - 没有返回服务器端事件

转载 作者:行者123 更新时间:2023-12-01 09:08:59 25 4
gpt4 key购买 nike

我正在尝试实现服务器端事件。我通过 Jersey/Grizzly 的 RESTful Web 服务公开了非常简单的资源。我尝试使用 SseBroadcaster 广播这些事件。每当数据项进入并添加到内部列表时,就会创建一个事件。客户端应打开与 URL/events 的连接以接收事件。

@Path("sensordataelements")
public class SensorDataResource {

private SseBroadcaster broadcaster = new SseBroadcaster();

@GET
@Path("events")
@Produces(SseFeature.SERVER_SENT_EVENTS)
public EventOutput getServerSentEvents() {
final EventOutput eventOutput = new EventOutput();
broadcaster.add(eventOutput);
return eventOutput;
}
@POST
@Path("/addraw")
@Produces(MediaType.APPLICATION_JSON)
public Response addRawSensorData(String elementBody) {
... data processing stuff ...
cList.add(
new SensorDataElement.SensorDataElementBuilder().id()
.sensorReading(tmpValue)
.build()
);
OutboundEvent evt = new OutboundEvent.Builder()
.data(Float.class, Float.valueOf(tmpValue))
.build();
broadcaster.broadcast(evt);

return Response.status(201).build();
}
...

我尝试连接

curl -v http://localhost:8080/sensordataapp/sensordataelements/events

连接正常,但我没有收到任何事件。我看了一些例子,但感觉这应该可行。我错过了什么?

谢谢!

最佳答案

默认情况下,会为每个请求创建资源类的新实例。这意味着将为每个请求创建一个新的广播公司,这不是您想要的。如果你想让资源类成为Singleton,你可以简单地用@Singleton注释该类

@Singleton
@Path("sensordataelements")
public class SensorDataResource {
...
}

现在,只会为整个应用程序创建资源类的一个实例,并且它将为所有请求共享。

另一种选择是,如果您注入(inject)广播器,则可以将其作为单例注入(inject),而不是自己实例化它。无论资源类是否是单例,它仍然会被注入(inject)相同的广播器实例。为此,您可以在 ResourceConfig 子类中执行类似以下操作

public class AppConfig extends ResourceConfig {
public AppConfig() {
register(new AbstractBinder() {
@Override
public void configure() {
bind(new SseBroadcaster()).to(SseBroadcaster.class);
}
});
}
}

然后在您的资源类中,将其注入(inject)

@Path("sensordataelements")
public class SensorDataResource {

@Inject
private SseBroadcaster broadcaster;

另请参阅:

关于java - 没有返回服务器端事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41041928/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com