Jakarta ee 是否可以在CDI2/JAXRS 2.1/Java EE8中将CDI事件桥接到JAXRS 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

泽西岛的SSE在JAXRS 2.1中是标准化的。最后,我尝试了SSE特性

我认为它可以用于以下场景

  • 客户端用户单击一些链接,服务器将接收到它并向客户端发送一些通知
  • 服务器本身向客户机发送一些消息,例如完成一些批处理作业等
我的想法是使用CDI事件来处理域事件,并查看是否可能使用
@观察
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()
        );
    }
}