2016-09-22 98 views
2

我有一個接受SUBSCRIBE請求的Spring Websocket Stomp應用程序。從Spring Websocket程序發送STOMP ERROR

在應用我有一個訂閱處理,也就是

@Component 
public class SubscribeStompEventHandler implements ApplicationListener<SessionSubscribeEvent> { 

    @Override 
    public void onApplicationEvent(SessionSubscribeEvent event) {} 
} 

,我用它來驗證訂閱。

我會檢查onApplicationEvent中的內容,並從此函數發回STOMP ERROR消息給客戶端。

我發現這個配方How to send ERROR message to STOMP clients with Spring WebSocket?但我需要了解如何獲取出站通道。

我也試過下面的代碼:

public void sendStompError(SimpMessagingTemplate simpMessagingTemplate, String sessionId, String topic, String errorMessage) { 

    StompHeaderAccessor headerAccessor = StompHeaderAccessor.create(StompCommand.ERROR); 
    headerAccessor.setMessage(errorMessage); 
    headerAccessor.setSessionId(sessionId); 
    headerAccessor.setLeaveMutable(true); 
    simpMessagingTemplate.convertAndSendToUser(sessionId, topic, new byte[0], headerAccessor.getMessageHeaders());  
} 

,我試圖話題是一些subsciption話題和/隊列/錯誤的話題。但是我沒有看到消息傳播到客戶端。

在客戶端,我用:

​​

,我的目標是有功能(錯誤)調用時我送STOMP錯誤。

請指教我如何發送適當的STOMP ERROR,例如通過獲取Outboundchannel。

回答

5

您可以發送ERROR消息是這樣的:

StompHeaderAccessor headerAccessor = StompHeaderAccessor.create(StompCommand.ERROR); 
headerAccessor.setMessage(error.getMessage()); 
headerAccessor.setSessionId(sessionId); 
this.clientOutboundChannel.send(MessageBuilder.createMessage(new byte[0], headerAccessor.getMessageHeaders())); 

以下是剛夠來注入clientOutboundChannel

@Autowired 
@Qualifier("clientOutboundChannel") 
private MessageChannel clientOutboundChannel; 

只是因爲clientOutboundChannel bean是在AbstractMessageBrokerConfiguration聲明。

UPDATE

STOMP錯誤總是關閉連接?我正在得到這個效果。代碼1002.

是的。見StompSubProtocolHandler.sendToClient()

 if (StompCommand.ERROR.equals(command)) { 
      try { 
       session.close(CloseStatus.PROTOCOL_ERROR); 
      } 
      catch (IOException ex) { 
       // Ignore 
      } 
     } 
+0

工作就像一個魅力。 –

+0

Artem,請你澄清一下:STOMP ERROR總是關閉連接?我正在得到這個效果。代碼1002. –

+0

請參閱和更新我的答案。 –

相關問題