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

无法使用Jersey和Tomcat 7订阅服务器发送的事件

诸葛令
2023-03-14

我部署服务器发送事件资源与泽西2.41/Java7/tomcat 7.

我得到的错误是

2013年12月16日凌晨4:04:40组织。阿帕奇。卡塔琳娜。果心StandardWrapperValve:Servlet。路径为[/trackapp]的上下文中servlet[ServletAdapter]的服务()引发异常[java.lang.UnsupportedOperationException:servlet 2.x容器上不支持异步处理。]使用根本原因java。lang.UnsupportedOperationException:Servlet 2不支持异步处理。x容器。在org。玻璃鱼。运动衫servlet。网络组件3美元。挂起(WebComponent.java:123)在org上。玻璃鱼。运动衫servlet。内部的回复作者。在org上挂起(ResponseWriter.java:109)。玻璃鱼。运动衫服务器ServerRuntime$响应程序。org上的writeResponse(ServerRuntime.java:619)。玻璃鱼。运动衫服务器ServerRuntime$响应程序。org上的processResponse(ServerRuntime.java:381)。玻璃鱼。运动衫服务器ServerRuntime$响应程序。org上的进程(ServerRuntime.java:371)。玻璃鱼。运动衫服务器服务器运行时$1。在org上运行(ServerRuntime.java:262)。玻璃鱼。运动衫内部的错误1美元。在org上调用(Errors.java:271)。玻璃鱼。运动衫内部的错误1美元。在org上调用(Errors.java:267)。玻璃鱼。运动衫内部的错误。在org上处理(Errors.java:315)。玻璃鱼。运动衫内部的错误。org上的进程(Errors.java:297)。玻璃鱼。运动衫内部的错误。org上的进程(Errors.java:267)。玻璃鱼。运动衫过程内部的请求范围。org上的runInScope(RequestScope.java:318)。玻璃鱼。运动衫服务器服务器运行时。org上的进程(ServerRuntime.java:236)。玻璃鱼。运动衫服务器应用程序处理程序。在org上处理(ApplicationHandler.java:983)。玻璃鱼。运动衫servlet。网络组件。服务(WebComponent.java:361)位于org。玻璃鱼。运动衫servlet。ServletContainer。服务(ServletContainer.java:372)位于org。玻璃鱼。运动衫servlet。ServletContainer。服务(ServletContainer.java:335)位于org。玻璃鱼。运动衫servlet。ServletContainer。服务(ServletContainer.java:218)位于org。阿帕奇。卡塔琳娜。果心ApplicationFilterChain。org上的internalDoFilter(ApplicationFilterChain.java:305)。阿帕奇。卡塔琳娜。果心ApplicationFilterChain。doFilter(ApplicationFilterChain.java:210)位于org。阿帕奇。卡塔琳娜。果心标准包装阀。在org上调用(StandardWrapperValve.java:225)。阿帕奇。卡塔琳娜。果心标准连接阀。在org调用(StandardContextValve.java:123)。阿帕奇。卡塔琳娜。验证者。AuthenticatorBase。在org调用(AuthenticatorBase.java:472)。阿帕奇。卡塔琳娜。果心标准阀门。在org上调用(StandardHostValve.java:168)。阿帕奇。卡塔琳娜。阀门。错误报告阀。在org调用(ErrorReportValve.java:98)。阿帕奇。卡塔琳娜。阀门。检修阀。在org上调用(AccessLogValve.java:927)。阿帕奇。卡塔琳娜。果心标准引擎版本。在org上调用(StandardEngineValve.java:118)。阿帕奇。卡塔琳娜。连接器。郊狼适应者。服务(CoyoteAdapter.java:407)位于org。阿帕奇。郊狼。http11。抽象http11处理器。进程(AbstractHttp11Processor.java:1001)位于org。阿帕奇。郊狼。AbstractProtocol$AbstractConnectionHandler。进程(AbstractProtocol.java:585)位于org。阿帕奇。公猫util。网JIoEndpoint$SocketProcessor。在java上运行(JIoEndpoint.java:312)。util。同时发生的线程池执行器。java上的runWorker(ThreadPoolExecutor.java:1145)。util。同时发生的线程池执行器$Worker。在java上运行(ThreadPoolExecutor.java:615)。朗。丝线。运行(Thread.java:744)

我的资源

@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public String broadcastMessage(String message) {
    OutboundEvent.Builder eventBuilder = new OutboundEvent.Builder();
    OutboundEvent event = eventBuilder.name("message")
        .mediaType(MediaType.TEXT_PLAIN_TYPE)
        .data(String.class, message)
        .build();

    broadcaster.broadcast(event);
    System.out.println("broadcasting listen [" +message+ "]");

    return "Message was '" + message + "' broadcast.";
}

@GET
@Produces(SseFeature.SERVER_SENT_EVENTS)
@Path("/listen")
public EventOutput listenToBroadcast() {
    System.out.println("will listen");
    final EventOutput eventOutput = new EventOutput();
    this.broadcaster.add(eventOutput);
    return eventOutput;
}

web.xml

<?xml version="1.0" encoding="UTF-8"?>

<web-app version="3.0"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         metadata-complete="false">
    <servlet>
        <servlet-name>ServletAdaptor</servlet-name>
        <servlet-class>
            org.glassfish.jersey.servlet.ServletContainer
        </servlet-class>
        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>net.jigarshah.mse.tracker</param-value>
        </init-param>
        <init-param>
            <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
            <param-value>true</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>ServletAdaptor</servlet-name>
        <url-pattern>/webapi/*</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>

</web-app>

客户端JS

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

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

  document.getElementById("result").innerHTML+=event.data + "<br>";
  };
</script>
</head>
<body>
<div id="result">
test
</div>

共有2个答案

裴俊能
2023-03-14

我也有同样的问题,我的问题是我使用了错误的泽西servlet实现。添加以替换

<dependency>
  <groupId>org.glassfish.jersey.containers</groupId>
  <artifactId>jersey-container-servlet-core</artifactId>
</dependency>

by(注意缺少的-core

<dependency>
  <groupId>org.glassfish.jersey.containers</groupId>
  <artifactId>jersey-container-servlet</artifactId>
</dependency>
燕野
2023-03-14

一种可能性是检查这里列出的maven依赖关系https://jersey.java.net/documentation/latest/modules-and-dependencies.html

您也可以通过泽西岛邮件列表中的这封邮件进行检查https://java.net/projects/jersey/lists/users/archive/2013-11/message/63

希望这有帮助。

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

  • 我有一个signar2.0服务器,托管在IIS7中,带有javascript客户端,目前主要针对Chrome浏览器。 在没有跨域的情况下,信号传输是服务器发送的事件,它工作得很好,效率很高。 我使用Microsoft. Owin. Cors以建议的方式向服务器添加了CORS支持——这使服务器与客户端跨域一起工作——但是,SignalR传输现在是长轮询的;这将在我的服务器上造成更高的负载,因为从服务

  • 我现在正在使用java设计redis pub/sub系统,但遇到了一个问题。我将向您展示细节: 出版商: 发布者是正确的,可以正确工作。 然后让我们转到subscriber类: 在订阅类中,我使用RxJava注入Action,这样我可以更容易地使用它。 但问题是,在我发布了来自publisher的消息后,我可以确认消息可以传输到onMessage方法,日志打印不是我所期望的: 我所期望的是,当我发

  • 概述 客户端代码 概述 建立连接 open事件 message事件 error事件 自定义事件 close方法 数据格式 概述 data:数据栏 id:数据标识符 event栏:自定义信息类型 retry:最大间隔时间 服务器代码 参考链接 概述 传统的网页都是浏览器向服务器“查询”数据,但是很多场合,最有效的方式是服务器向浏览器“发送”数据。比如,每当收到新的电子邮件,服务器就向浏览器发送一个“

  • 概述 客户端代码 概述 建立连接 open事件 message事件 error事件 自定义事件 close方法 数据格式 概述 data:数据栏 id:数据标识符 event栏:自定义信息类型 retry:最大间隔时间 服务器代码 参考链接 概述 传统的网页都是浏览器向服务器“查询”数据,但是很多场合,最有效的方式是服务器向浏览器“发送”数据。比如,每当收到新的电子邮件,服务器就向浏览器发送一个“

  • 我正在尝试在Ruby Grape API上创建服务器发送的事件。问题是,连接似乎总是很快关闭,因为我一直在测试网页上看到连接关闭事件。 客户端连接到服务器,因为我可以看到正在调用的方法,但我想知道为什么连接不是恒定的,为什么我没有收到我使用Thread发送的数据。 以下是我的Ruby代码: 以下是我的Javascript: 编辑:我使用GET方法实现了它(我将Grape::API更改为Sinatr