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

Urb*_*leg 3 java spring activemq-classic websocket spring-websocket

我有一个使用消息代理(activemq)的带弹簧和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();
 }

}
Run Code Online (Sandbox Code Playgroud)

我有一个计划的任务,不断将消息推送到用户名"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);

}
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢!

Ros*_*hev 6

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

我们计划提供更好的方法来跟踪失败的消息(参见SPR-10891).与此同时,作为一种解决方法,您可以将其UserSessionRegistry注入@Scheduled组件并检查getSessionIds方法是否返回非空Set.这表明用户已连接.

一种替代方法可能是将您自己的约定用于每个用户可以订阅的队列名称(可能基于其用户名或其他足够独特的名称),以便接收持久性消息.该ActiveMQ的STOMP页对持久性消息和过期时间段.