【问题标题】:Servlet Endpoint for RabbitMQRabbitMQ 的 Servlet 端点
【发布时间】:2015-07-31 00:12:39
【问题描述】:

我有一个简单的可分发聊天应用程序。它适用于通过 REST API servlet 公开的 MySQL 后端。客户端是用 HTML / JS 编写的,使用带有 SockJS 和 STOMP 协议的 websockets 连接到 RabbitMQ 服务器。我也想通过 java 后端公开 RabbitMQ 服务器,有没有办法用 servlet 来做到这一点?

我找到了一些如何使用 Spring 执行此操作的教程,但我不想仅仅因为这个而重写整个应用程序。也许有一些方法可以只使用我缺少的 Spring AMQP...

我设法使用https://github.com/projectodd/sockjs-servlet 创建了 SockJS servlet 端点,但是当我什么都不知道时,在部署应用程序时构建了一次服务器端点。我想基于 URL 构建端点(例如 localhost/ws/room-4 为 ROOM id#4 创建端点,您可以在其中侦听传入消息)。

【问题讨论】:

  • 那么,你要避免直接使用Rabbitmq,而使用java后端应用程序,对吗?
  • 是的,我不想将 RabbitMQ 暴露给客户端应用程序。我想在 Java 后端收听 RabbitMQ 并将其发送给客户端。我设法使用上面链接的 SockJS servlet 做到了这一点,但就像我说的,我需要根据用户请求创建这些端点,而不仅仅是在部署应用程序时创建一次。

标签: java servlets rabbitmq stomp sockjs


【解决方案1】:

我认为通过java后端应用程序使用RMQ是正确的。这样就可以从 rabbitmq 中移除 STOMP 插件了

现在,当您阅读时,可以使用 spring-framework 轻松做到这一点,因为它包含 http://projects.spring.io/spring-amqp/ 并且还包含许多可以帮助您的功能,例如: DeferredResult 请阅读: https://spring.io/blog/2012/05/07/spring-mvc-3-2-preview-introducing-servlet-3-async-support 我真的建议阅读有关 Spring 的内容。

无论如何,如果您想手动执行此操作:

假设你有一个像yourservlet/createroom= “room4”这样的“创建房间”功能,当你有这个“获取”时,你可以创建匿名和自动删除队列,并将其绑定到routingkey =“room4”,然后只需重定向所消耗的消息这个队列到所有使用相同键连接的 websocket。

例如,如果你想使用 tomcat websocket(这里是一个例子 https://gist.github.com/chitan/3063774 )你可以这样做:

 private class MyMessageInbound extends MessageInbound{
        WsOutbound myoutbound;
        String rouutKey; 

您使用相同的路由密钥注册 websocket。 (routing-key 可以是 roomName)

我在我的项目中使用了类似的情况(不是聊天,而是类似)。

希望对你有帮助

【讨论】:

  • 谢谢,我稍后会尝试,但看起来像我想要的(尤其是要点)。
  • 你在 Tomcat 8 上有一些这样的例子吗?要点使用 Tomcat 7 中的类,这些类现在在 Tomcat 8(我使用)中已弃用...
  • 不,这是因为我建议spring的原因,因为websocket spring是独立的。您可以使用更多的应用程序服务器。我将我的应用程序从标准应用程序迁移到 Spring 应用程序。
  • 这只是一个学校项目,迁移不值得:] 无论如何感谢您的建议。
猜你喜欢
  • 2013-02-04
  • 1970-01-01
  • 2019-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-09
相关资源
最近更新 更多