7

是否可以让服务器向所有连接的客户端发送消息而无需等待它们的任何操作?让我解释一下 :-) 我一直在阅读文档/示例,但没有发现任何东西可以满足我的需求:流程总是一样的;客户端连接(例如:对 Rest API 的 GET 调用),连接被挂起,直到收到新的 API 调用(例如:POST 调用),服务器只是等待(或者至少这是我所理解的)。我的用例完全不同:我希望服务器在新数据可用时发送一些“通知”。这将是我的用例(非常简单):

  1. 客户端 A 连接到服务器
  2. 由于目前没有可用的新数据,连接已暂停
  3. 服务器收到通知,有来自外部源的新数据可用并将其广播给客户端 A
  4. 转到第 2 步

到目前为止,我所取得的成就是成功建立了连接。下一步是解决此服务器问题。我必须说这项技术对我来说是全新的,所以我可能误解了某些东西的工作原理。如果是这样,请告诉我!

这是我的堆栈:

  • 春季 3.2.0 发布
  • 泽西 1.8
  • 大气球衣 1.0.13
  • 雄猫 7.0.40

谢谢大家!

更新:遵循之后,我收到此警告,我不知道如何摆脱:

2013-06-04 09:40:36,284 WARN [org.atmosphere.cpr.AtmosphereFramework] - Failed using comet support: org.atmosphere.container.Tomcat7AsyncSupportWithWebSocket, error: Tomcat failed to detect this is a Comet application because context.xml is missing or the Http11NioProtocol Connector is not enabled.
If that's not the case, you can also remove META-INF/context.xml and WEB-INF/lib/atmosphere-compat-tomcat.jar Is the Nio or Apr Connector enabled?
2013-06-04 09:40:36,285 WARN [org.atmosphere.cpr.AtmosphereFramework] - Using org.atmosphere.container.Tomcat7BIOSupportWithWebSocket

我遵循了此处评论的应用程序结构,所以这应该不是问题。我注意到通过将传输更改为“websocket”而不是“长轮询”显示没有错误。服务器最终发送数据艰难:)

4

1 回答 1

0

我按照您的链接对代码进行了一些修改。

当您在第 3 步“服务器收到通知,新数据可从外部源获得并将其广播到客户端 A”时,您必须编写如下行:

BroadcasterFactory.getDefault().lookup("/*").broadcast(response);

起初我使用了从我的 ActiveMQ 队列接收到的 TextMessage,但我收到了这个错误,所以我使用了 Jackson 类作为对象响应,一切正常。

严重:未找到 Java 类 org.apache.activemq.command.ActiveMQTextMessage 和 Java 类型类 org.apache.activemq.command.ActiveMQTextMessage 和 MIME 媒体类型 application/json 的消息正文编写器 2014 年 6 月 3 日 11:32 :21 AM com.sun.jersey.spi.container.ContainerResponse write SEVERE:已注册的与 MIME 媒体类型兼容的消息正文编写器是:application/json (JSONJAXBElementProvider, JSONArrayProvider, JSONObjectProvider, JSONRootElementProvider, JSONListElementProvider, ...)

于 2014-06-03T09:48:54.267 回答