编程语言
首页 > 编程语言> > java – spring websockets:向脱机用户发送消息 – 消息代理中未排队的消息

java – spring websockets:向脱机用户发送消息 – 消息代理中未排队的消息

作者:互联网

我有一个使用消息代理(activemq)的spring和websockets的webapp.

这是我的配置类:

@Configuration
@EnableWebSocketMessageBroker
@EnableScheduling
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
    config.enableStompBrokerRelay("/topic","/queue/");
    config.setApplicationDestinationPrefixes("/app");
 }

@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
    registry.addEndpoint("/hello").withSockJS();
 }

}

我有一个计划的任务,不断将消息推送到用户名“StanTheMan”:

@Scheduled(fixedDelay = 1000)
public void sendGreetings() {
   HelloMessage hello = new HelloMessage();
   hello.setContent("timeStamp:" + System.currentTimeMillis());
   String queueMapping = "/queue/greetings";    
   template.convertAndSendToUser(
                     "DannyD",
                     queueMapping,
                     hello);

}

目前,如果用户没有通过websocket连接到服务器 – 他的所有消息都没有为他安排,他们只是丢弃了.每当他连接时 – 他都会收到新的消息.
我可以以任何方式将“convertAndSendToUser”消息“转发给离线用户”吗?我希望将已过期时间的邮件排入队列,以便以后再次连接并且过期时间未结束时可以推送脱机用户.

我怎么能实现这一目标?显然使用真正的消息代理(activemq)应该有助于实现这一点,但如何?

谢谢!

解决方法:

实际上,此功能仅可用于向(当前)连接的用户发送消息.

我们计划提供更好的方法来跟踪失败的消息(见SPR-10891).在此期间,您可以将UserSessionRegistry注入到@Scheduled组件中,并检查getSessionIds方法是否返回非空Set.这表明用户已连接.

一种替代方法可能是使用您自己的约定来为每个用户可以订阅的队列名称(可能基于他们的用户名或其他足够独特的东西),以便接收持久性消息. ActiveMQ STOMP page有一个关于持久消息和到期时间的部分.

标签:spring-websocket,java,spring,websocket,activemq
来源: https://codeday.me/bug/20190830/1770693.html