1

我有几个问题,一是如何使用 spring websockets 和消息传递。所以我有一个与外部 Web 服务生产者端点接口的程序,它将数据有效负载发送到我的 Web 服务消费者端点。在我的程序的另一端,我会将这些数据负载路由到多个 websocket 连接(stomp 和 sockjs)。外部 Web 服务生产者在每个数据负载中为每个查询请求提供订阅 ID,因此我的方法是使用 SimpMessagingTemplate 将它们发送回代理,该模板具有它自己的唯一目的地(即 /user/{subscriptionId}/subscribe)。这样,如果进行了重复查询,我可以将每个 websocket 客户端订阅到现有目标,否则仅向外部 Web 服务生产者请求新的订阅。

  1. 如何从不同的组件(例如我的 Web 服务使用者)访问我的 SimpMessagingTemplate,以便我可以将数据有效负载发送到我的消息代理?我是否只是将我的 SimpMessagingTemplate 声明为静态并在存储模板对象的控制器中声明一个 getter 函数?

  2. 如何获取所有已知目的地的列表以及每个目的地的 stomp 客户端订阅者数量?外部 Web 服务生产者为每个订阅设置终止时间,所以如果目的地仍有订阅者,我想实现自动续订请求。我想我可以自己使用 Maps/Caches 跟踪它,并在每次打开或关闭 websocket 会话时更新它们,但我更喜欢使用 spring要做到这一点,需要诸如 RabbitMQ 或 ActiveMQ 之类的特色代理。

4

1 回答 1

1

找到了我需要的答案:

  1. 我需要做的就是使用 spring 自动装配支持,bean 将被注入初始化的对象

    @Autowired 私有 SimpMessagingTemplate

  2. 为此需要一个功能齐全的经纪人,但是对于我想做的事情,我认为这将是太多工作并且基本上不需要。我决定我将使用 java 地图/缓存自己使用 3rd 方 Web 服务实现我自己的订阅检查。即使使用 java 反编译器插件,我也通过在 java .class 文件中的 eclipse 中设置断点来进行艰苦的设置,并发现所有这些信息都可以在 DefaultSubscriberRegistry 类中找到。虽然我无法使用 Spring 提供的 api 访问它,但我可以放心,它正在由应用程序正确处理。当客户端订阅或断开我的应用程序时,注册表的内部映射/缓存中的信息会相应地添加和删除。

    公共类 SubscribeEvent 实现 ApplicationListener

于 2016-03-02T15:36:58.617 回答