Jakarta ee 是否可以在CDI2/JAXRS 2.1/Java EE8中将CDI事件桥接到JAXRS SSE?
泽西岛的SSE在JAXRS 2.1中是标准化的。最后,我尝试了SSE特性 我认为它可以用于以下场景Jakarta ee 是否可以在CDI2/JAXRS 2.1/Java EE8中将CDI事件桥接到JAXRS SSE?,jakarta-ee,jax-rs,cdi,server-sent-events,weld,Jakarta Ee,Jax Rs,Cdi,Server Sent Events,Weld,泽西岛的SSE在JAXRS 2.1中是标准化的。最后,我尝试了SSE特性 我认为它可以用于以下场景 客户端用户单击一些链接,服务器将接收到它并向客户端发送一些通知 服务器本身向客户机发送一些消息,例如完成一些批处理作业等 我的想法是使用CDI事件来处理域事件,并查看是否可能使用@观察CDI事件并通过SSE将其发送给客户端 我写了一些代码来尝试它 消息有效负载类 public class Message implements Serializable { private String
- 客户端用户单击一些链接,服务器将接收到它并向客户端发送一些通知
- 服务器本身向客户机发送一些消息,例如完成一些批处理作业等
@观察CDI事件并通过SSE将其发送给客户端
我写了一些代码来尝试它
消息有效负载类
public class Message implements Serializable {
private String body;
public Message() {
}
public Message(String body) {
this.body = body;
}
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
}
用于发送消息的rest资源
@Path("mesages")
@RequestScoped
public class MessageResource {
@Inject
Event<Message> messageEvent;
@POST
@Consumes(MediaType.APPLICATION_JSON)
public Response send(Message message) {
messageEvent.fire(message);
return Response.ok().build();
}
}
顺便说一句:我使用的是Glassfish v5,完整的代码是
更新:刚刚尝试了SSE广播
,它与CDI事件一起工作
@Path("broadcastEvents")
@Singleton
public class BroadcastResource {
@Context
private Sse sse;
private volatile SseBroadcaster sseBroadcaster;
@PostConstruct
public void init() {
this.sseBroadcaster = sse.newBroadcaster();
}
@GET
//@Path("register")
@Produces(MediaType.SERVER_SENT_EVENTS)
public void register(@Context SseEventSink eventSink) {
eventSink.send(sse.newEvent("welcome!"));
sseBroadcaster.register(eventSink);
}
@POST
//@Path("broadcast")
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public void broadcast(@FormParam("event") String event) {
sseBroadcaster.broadcast(sse.newEvent(event));
}
public void eventStreamCdi(@Observes Message msg) {
sseBroadcaster.broadcast(
sse.newEventBuilder()
.mediaType(MediaType.APPLICATION_JSON_TYPE)
.id(UUID.randomUUID().toString())
.name("message from cdi")
.data(msg)
.build()
);
}
}
但是,如何让它作为第一种情况与单个SseEventSink
一起工作?SseEventSink
仅对给定的请求有效。因此,唯一的方法是用要处理的事件传播接收器。@JohnAment是的,如果我添加一个额外的CDIBean来汇集eventsink,它就会工作。我已经更新了。它的行为有点像SSEBadcaster
,SSEventSink
仅对给定的请求有效。因此,唯一的方法是用要处理的事件传播接收器。@JohnAment是的,如果我添加一个额外的CDIBean来汇集eventsink,它就会工作。我已经更新了。它的行为有点像SSE播音员
。
@Path("broadcastEvents")
@Singleton
public class BroadcastResource {
@Context
private Sse sse;
private volatile SseBroadcaster sseBroadcaster;
@PostConstruct
public void init() {
this.sseBroadcaster = sse.newBroadcaster();
}
@GET
//@Path("register")
@Produces(MediaType.SERVER_SENT_EVENTS)
public void register(@Context SseEventSink eventSink) {
eventSink.send(sse.newEvent("welcome!"));
sseBroadcaster.register(eventSink);
}
@POST
//@Path("broadcast")
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public void broadcast(@FormParam("event") String event) {
sseBroadcaster.broadcast(sse.newEvent(event));
}
public void eventStreamCdi(@Observes Message msg) {
sseBroadcaster.broadcast(
sse.newEventBuilder()
.mediaType(MediaType.APPLICATION_JSON_TYPE)
.id(UUID.randomUUID().toString())
.name("message from cdi")
.data(msg)
.build()
);
}
}