春季经纪人频道访问

时间:2016-02-16 19:27:45

标签: java spring-websocket spring-messaging

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

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

  2. 如何获取所有已知目的地的列表以及每个目的地的stomp客户端订户数量?外部Web服务生产者为每个订阅设置终止时间,因此如果仍有目标订阅者,我希望实现自动续订请求。我想我可以使用Maps / Caches自己跟踪它并在每次打开或关闭websocket会话时更新它们,但是如果可能的话我更喜欢使用spring来实现它,因为它可以最大限度地减少我的风险并且可能更不容易出错,或者可能是完整的像RabbitMQ或ActiveMQ这样的特色经纪人是必要的。

1 个答案:

答案 0 :(得分:1)

找到我需要的答案:

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

    @Autowired 私人SimpMessagingTemplate

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

    公共类SubscribeEvent实现ApplicationListener