在Quarkus中,服务器发送的事件(Server-Sent Events,简称SSE)可以使用JAX-RS API来实现。要设置SSE的事件名称,您可以使用OutboundSseEvent.Builder
类来构建一个具有特定名称的事件。
以下是一个简单的例子,展示了如何在Quarkus中为SSE设置事件名称:
javaimport javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import javax.ws.rs.sse.OutboundSseEvent; import javax.ws.rs.sse.Sse; import javax.ws.rs.sse.SseEventSink; import javax.enterprise.context.ApplicationScoped; @Path("/sse") @ApplicationScoped public class SseResource { @GET @Path("/stream") @Produces(MediaType.SERVER_SENT_EVENTS) public void stream(@Context SseEventSink eventSink, @Context Sse sse) { try (SseEventSink sink = eventSink) { // 创建一个具有特定名称的事件构建器 OutboundSseEvent.Builder eventBuilder = sse.newEventBuilder(); // 构建一个事件,并设置事件名称为 "message-event" OutboundSseEvent event = eventBuilder .name("message-event") .data(String.class, "这是一条服务器发送的消息") .build(); // 发送事件 sink.send(event); } } }
在这个例子中,当客户端连接到/sse/stream
端点时,服务器会构建一个SSE事件,并设置事件名称为"message-event"
。然后使用eventSink
将构建的事件发送给客户端。
设置事件名称是很有用的,因为客户端可以监听特定名称的事件,并根据不同的事件类型执行不同的操作。在JavaScript中,客户端代码可能会像下面这样:
javascriptconst evtSource = new EventSource("/sse/stream"); evtSource.addEventListener("message-event", function(event) { console.log("Received message-event: ", event.data); }); // 监听连接打开事件 evtSource.onopen = function(event) { console.log("Connection to server opened."); }; // 监听连接错误事件 evtSource.onerror = function(event) { console.error("EventSource failed:", event); };
在该JavaScript客户端代码中,我们监听了名为"message-event"
的事件,并在收到此类事件时在控制台打印消息内容。其他事件,如连接打开或错误事件,也可以被相应地处理。
2024年6月29日 12:07 回复