[英]spring websockets: sending a message to an offline user - messages not enqueued in message broker
我有一個使用消息代理 (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 頁面有一個關於持久消息和過期時間的部分。
這是消息代理的默認行為。 而且您還沒有將 ActiveMQ 代理設置為默認代理,因此 Spring 正在設置一個內存中代理。
為了實現您想要的設置/將您的 activeMQ 詳細信息提供給您的 spring websocket 消息代理。 由於 Spring 不提供這些設置,您必須在 ActiveMQ 端進行所有持久性設置。 .
要為 spring websocket 消息代理設置 ActiveMQ,您還需要啟用 stomp 並使用它:
registry.enableStompBrokerRelay("/topic").setRelayHost("hostName").setRelayPort("00000");
有關更多信息結帳: http : //docs.spring.io/spring/docs/4.0.0.RELEASE/javadoc-api/org/springframework/messaging/simp/config/StompBrokerRelayRegistration.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.