我有一个使用消息代理(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)应该有助于实现这一点,但是如何实现?
谢谢!
答案 0 :(得分:6)
实际上,此功能只能用于向(当前)连接的用户发送消息。
我们计划提供更好的方法来跟踪失败的消息(请参阅SPR-10891)。在此期间,您可以将UserSessionRegistry
注入@Scheduled组件并检查getSessionIds方法是否返回非空Set。这表明用户已连接。
一种替代方法可能是将您自己的约定用于每个用户可以订阅的队列名称(可能基于其用户名或其他足够独特的名称),以便接收持久性消息。 ActiveMQ STOMP page有一个关于持久消息和到期时间的部分。
答案 1 :(得分:-1)
这是邮件代理的默认行为。 并且您没有将ActiveMQ代理设置为默认代理,因此Spring正在设置内存代理。
要实现您想要的设置/将您的activeMQ详细信息提供给spring websocket消息代理。由于Spring不提供这些设置,您必须在ActiveMQ端执行所有持久性设置。
要为spring websocket消息代理设置ActiveMQ,您还需要启用stomp并使用它:
registry.enableStompBrokerRelay("/topic").setRelayHost("hostName").setRelayPort("00000");