Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 服务器发送事件不适用于服务器_Java_Jersey_Servlet 3.0_Server Sent Events_Jersey 2.0 - Fatal编程技术网

Java 服务器发送事件不适用于服务器

Java 服务器发送事件不适用于服务器,java,jersey,servlet-3.0,server-sent-events,jersey-2.0,Java,Jersey,Servlet 3.0,Server Sent Events,Jersey 2.0,我正在尝试使用泽西岛的JavaScript SSE。我的资源中有以下代码。我在Java7和Tomcat7上托管。我没有得到任何错误。但我在第页也没有看到数据 我调用/broadcast发布数据。它确实显示了信息。但没有任何事情发生在客户身上。在Firefox中,我确实看到了多次触发的/broadcast事件 这是我使用的参考资料。 我的Index.html代码如下所示 <script type="text/javascript"> var url = "webapi/broadca

我正在尝试使用泽西岛的JavaScript SSE。我的资源中有以下代码。我在Java7和Tomcat7上托管。我没有得到任何错误。但我在第页也没有看到数据

我调用
/broadcast
发布数据。它确实显示了信息。但没有任何事情发生在客户身上。在Firefox中,我确实看到了多次触发的
/broadcast
事件

这是我使用的参考资料。

我的Index.html代码如下所示

<script type="text/javascript">
var url = "webapi/broadcast";
//var url="http://localhost:8080/trackapp/webapi/broadcast/listen";
var source=new EventSource(url);
source.onerror=function(event)
{
console.log("error [" + source.readyState + "]");
};

source.onopen = function(event){
    console.log("eventsource opened!");
    };

source.onmessage=function(event)
  {
    console.log(event.data);

  document.getElementById("result").innerHTML+=event.data + "<br>";
  };
</script>

var url=“webapi/broadcast”;
//变量url=”http://localhost:8080/trackapp/webapi/broadcast/listen";
var source=新事件源(url);
source.onerror=函数(事件)
{
log(“错误[“+source.readyState+”]”);
};
source.onopen=函数(事件){
log(“eventsource已打开!”);
};
source.onmessage=函数(事件)
{
console.log(事件数据);
document.getElementById(“结果”).innerHTML+=event.data+“
”; };
以下是一个可能对您有所帮助的示例:


您也可以参考此页面,查看您的浏览器是否支持EventSource API

我遇到了相同的问题,并通过不设置事件名称解决了它(我不知道为什么,但这似乎是解决方案)。。。这是密码

OutboundEvent.Builder eventBuilder = new OutboundEvent.Builder();

//WARNING: IF I SET THE NAME OF THE EVENT IT DOES NOT WORK
//eventBuilder.name("message"); 

eventBuilder.mediaType(MediaType.APPLICATION_JSON_TYPE);
eventBuilder.data(EventData.class, data);
OutboundEvent event = eventBuilder.build();
该方法设置SSE事件字段的值。因此,它不被视为消息,不能使用.onmessage处理程序监听。解决方案是简单地使用
addEventListener
方法注册侦听器方法

此代码应与上面的Jersey示例一起使用

<script type="text/javascript">
    var url = "webapi/broadcast";
    var source=new EventSource(url);
    source.addEventListener(
        "message",
        function(event){
            console.log(event.data);
            document.getElementById("result").innerHTML+=event.data + "<br>"; },
        false);
</script>

var url=“webapi/broadcast”;
var source=新事件源(url);
source.addEventListener(
“信息”,
功能(事件){
console.log(事件数据);
document.getElementById(“结果”).innerHTML+=event.data+“
”;}, 假);

我发现本文有助于理解SSE在浏览器端的工作原理:。

我必须做以下工作,才能使它与tomcat 7.0.69和java 1.8以及jersey 2.22.2一起工作,如果它涉及到任何主体的使用,我只需共享它

  • 在Pom文件中添加以下依赖项:

      <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-servlet-core</artifactId>
        <version>2.22.2</version>
      </dependency>
    
      <dependency>
        <groupId>org.glassfish.jersey.core</groupId>
        <artifactId>jersey-client</artifactId>
        <version>2.22.2</version>
      </dependency>
    <!-- If you use json -->
      <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-processing</artifactId>
        <version>2.22.2</version>
      </dependency>
    <dependency>
          <groupId>org.glassfish.jersey.containers</groupId>
          <!-- if your container implements Servlet API older than 3.0, use "jersey-container-servlet-core"  -->
          <artifactId>jersey-container-servlet</artifactId>
          <version>2.22.2</version>
        </dependency>
    
        <dependency>
          <groupId>org.glassfish.jersey.media</groupId>
          <artifactId>jersey-media-sse</artifactId>
          <version>2.22.2</version>
        </dependency>
    
    
    org.glassfish.jersey.containers
    “version=“3.0”>
    

  • Jersey Servlet容器应该是异步支持的,因此将其添加到web.xml中的Jersey Servlet中:
  • true

  • 如果使用任何筛选器,请确保它也支持异步:

    true


  • 您可以尝试在命令行上使用curl吗?有时浏览器会缓存响应。@Salil您可以提供如何使用curl执行此订阅的示例吗?这是一个命令行实用程序,默认情况下在大多数Unix/Linux(包括Mac OS X)上提供。在客户端,当未发送命名事件时,它会触发
    eventSource.onmessage
    处理程序。当设置一个处理程序时,您应该设置
    eventSource.addEventListener('eventnamehere',函数(ev){}
    第一个链接无效,第二个链接返回503
      <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-servlet-core</artifactId>
        <version>2.22.2</version>
      </dependency>
    
      <dependency>
        <groupId>org.glassfish.jersey.core</groupId>
        <artifactId>jersey-client</artifactId>
        <version>2.22.2</version>
      </dependency>
    <!-- If you use json -->
      <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-processing</artifactId>
        <version>2.22.2</version>
      </dependency>
    <dependency>
          <groupId>org.glassfish.jersey.containers</groupId>
          <!-- if your container implements Servlet API older than 3.0, use "jersey-container-servlet-core"  -->
          <artifactId>jersey-container-servlet</artifactId>
          <version>2.22.2</version>
        </dependency>
    
        <dependency>
          <groupId>org.glassfish.jersey.media</groupId>
          <artifactId>jersey-media-sse</artifactId>
          <version>2.22.2</version>
        </dependency>