当前位置: 首页 > 知识库问答 >
问题:

Java服务器未使用OutboundsEvent/JAX-RS server sent event(SSE)服务发送消息事件

白镜
2023-03-14

我已经在Java服务器中设置了SSE(服务器发送事件)。客户端构建在VueJS上,并使用EventSource包从服务器接收事件。我正在使用EventSourcePolyfill npm包https://www.npmjs.com/package/event-source-polyfill在客户端上。这个包允许我们在请求中发送授权头(针对我们的安全方案)。

客户端向我们的SSE服务发送请求并接收一个类型为“open”的单个事件。SSE然后不发送进一步的事件或发送事件并且浏览器不会检测到它们。为什么会这样?修复建议?没有错误消息。

这种行为发生在Chrome、Firefox和Edge中,因此可能与浏览器无关。

Our client method...
    testSSE() {
      console.log("in testSSE()");
      console.log("apikey: " + store.user.apikey);
      var EventSource = EventSourcePolyfill;

      const evtSource = new EventSource(
        "http://localhost:8081/api/ssetest/test",
        { headers: { Authorization: "Bearer " + store.user.apikey } }
      );
      evtSource.onmessage = function(event) {
        console.log("received message");
        console.log("event.data: " + event.data);
      };

       //This is the only function that gets hit
      evtSource.addEventListener("open", function(event) {
        console.log("open event");
        console.log(Object.keys(event));
        console.log(event.type);
      });
      evtSource.addEventListener("message", function(event) {
        console.log("message event");
      });
      evtSource.addEventListener("stringEvent", function(event) {
        console.log("received ping event");
        console.log("event.data: " + event.data);
      });
      evtSource.onerror = function(err) {
        console.error("EventSource failed:", JSON.stringify(err));
      };
    }

这是我们的服务器代码@路径(“ssetest”)公共类SSETESService扩展了SecureService{

@GET
@Path("/test")
@Produces("text/event-stream")
public void runTest(@Context Sse sse, @Context SseEventSink sseEventSink)
         {
    int lastEventId = 0;// ..;
    while (lastEventId < 10) {
        OutboundSseEvent stringEvent = sse.newEventBuilder()
                .name("" + lastEventId)
                .mediaType(MediaType.APPLICATION_JSON_TYPE)
                .data("hello world")
                .id(String.valueOf(lastEventId))
                .reconnectDelay(4000) // .comment("price change")
                .build();
        sseEventSink.send(stringEvent);
        lastEventId++;
        TimeUnit.SECONDS.sleep(1);

    }
}

}

Browser console output...
[![enter image description here][1]][1]


  [1]: https://i.stack.imgur.com/iR57U.png

共有1个答案

秦宏硕
2023-03-14

我也有类似的问题。将@products value转换为“application/stream json”为我解决了这个问题。

 类似资料:
  • 我想要实现的是: user1向服务器发送消息(一个简单的POST请求) 服务器部分是(events.php) 我在(true)时尝试了无限循环以避免3秒的轮询。我也尝试过没有那个无限循环。只有发送消息的用户收到事件。 我理解这种做法并不好。但是,将SSE用于聊天应用程序的最佳实践是什么? 如何向所有用户发送事件?

  • 我无法理解HTML5s服务器发送的事件是否真的适合ReST体系结构。我知道并非HTML5/HTTP的所有方面都需要适合ReST架构。但我想从专家那里知道HTTP的哪一半是SSE(ReSTful的一半还是另一半!)。 一种观点是它是ReSTful的,因为客户端向服务器发出了一个“初始”HTTP GET请求,其余的只能看作是不同内容类型的部分内容响应(“文本/事件流”) 发送的请求不知道有多少响应将作

  • 您好,我正在React中开发一个web应用程序,它使用Nginx从Express服务器接收SSE数据。 JS服务器 索引:JS const events=新事件源('https://api.myDomain.com/events', ); axios。post(<代码>https://api.myDomain.com/addCart,{客户端:this.state.clientId,购物车:car

  • 我正在尝试使用泽西岛的JavaScript SSE。我的资源中有以下代码。我在Java7和Tomcat 7上托管。我没有收到任何错误。但我也没有在页面上看到数据。 我调用发布数据。它确实显示信息。但客户什么都没有。在Firefox中,我确实看到事件多次触发。 这是我使用的参考。https://jersey.java.net/documentation/latest/sse.html 我的Index

  • 我正在编写自己的websocket服务器和客户端。我成功地处理了握手并建立了联系。 现在我正在编写send_message函数,它创建了一个合适的框架。下面的例子只是为了这个问题,它不是我最终打算写的,这只是我尝试给我相同的结果的许多方法中的一种。 输入:以上函数应发送 第一个字节 第一位设置为1-,表示这是消息的最后一帧 第二、第三和第四个-所有的零,对于这个例子来说是不相关的 以下四位-000

  • 我有一个ASP。net core 3.1服务器项目,它有一个非常简单的API发送单向服务器发送事件(SSE),如下所示: 现在,我想通过C#UWP客户端接收这些事件。很遗憾,我只收到第一个事件: 如何在UWP中创建行为以始终监听该连接并接收我可以进一步处理的事件?