2016-08-14 5 views
3

Я использую this guide реализовать простой Stomp клиента:Как ждать Spring WebSocketStompClient для подключения

WebSocketClient webSocketClient = new StandardWebSocketClient(); 
WebSocketStompClient stompClient = new WebSocketStompClient(webSocketClient); 

ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler(); 
taskScheduler.afterPropertiesSet(); 
stompClient.setTaskScheduler(taskScheduler); // for heartbeats 

stompClient.setMessageConverter(new StringMessageConverter()); 

StompSessionHandler sessionHandler = new MySessionHandler(); 
stompClient.connect("ws://server/endpoint", sessionHandler); 

// WAITING HERE 

Когда соединение завершает он должен сообщить MySessionHandler асинхронно:

public class MySessionHandler extends StompSessionHandlerAdapter 
{ 
    @Override 
    public void afterConnected(StompSession session, StompHeaders connectedHeaders) 
    { 
     // WAITING FOR THIS 
    } 
} 

Так вопрос является : как линия WAITING HERE должна ждать строки WAITING FOR THIS? Есть ли определенный весомый способ сделать это? Если нет, какой общий способ Java подходит здесь лучше всего?

ответ

2

Может быть java.util.concurrent.CountDownLatch может решить вашу проблему, как это:

CountDownLatch latch = new CountDownLatch(1); 
StompSessionHandler sessionHandler = new MySessionHandler(latch); 
stompClient.connect("ws://server/endpoint", sessionHandler); 
// wait here till latch will be zero 
latch.await(); 

И ваша MySessionHandler реализация:

public class MySessionHandler extends StompSessionHandlerAdapter { 
    private final CountDownLatch latch; 

    public MySessionHandler(final CountDownLatch latch) { 
     this.latch = latch; 
    } 

    @Override 
    public void afterConnected(StompSession session, 
           StompHeaders connectedHeaders) { 
     try { 
      // do here some job 
     } finally { 
      latch.countDown(); 
     } 
    } 
} 
3

Решение с защелкой работ. Позже я обнаружил, что connect функция возвращает ListenableFuture<StompSession>, поэтому мы можем ждать сессии, которая будет создана, как это:

ListenableFuture<StompSession> future = 
       stompClient.connect("ws://server/endpoint", sessionHandler); 
StompSession session = future.get(); // <--- this line will wait just like afterConnected() 
+0

future.get() даст вам объект сеанса, который вы должны были получить от afterConnect .. – rxx

0

Вам не нужно не защелкой, ничего, метод afterConnected будет выполняться только тогда, когда соединение тверда.

Мой пример:

URI stompUrlEndpoint = new URI("localhost:8080/Serv/enpoint"); 

ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler(); 
//Calls initialize() after the container applied all property values. 
taskScheduler.afterPropertiesSet(); 

StandardWebSocketClient webSocketClient = new StandardWebSocketClient(); 
List<Transport> transports = new ArrayList<>(2); 

transports.add(new WebSocketTransport(webSocketClient)); 

SockJsClient sockJsClient = new SockJsClient(transports); 

WebSocketStompClient stompClient = new WebSocketStompClient(sockJsClient); 

stompClient.setMessageConverter(new SimpleMessageConverter());   // default converter: SimpleMessageConverter 

// Configure a scheduler to use for heartbeats and for receipt tracking. 
stompClient.setTaskScheduler(taskScheduler); 

StompSessionHandlerImp stompSessionHandlerImp = new StompSessionHandlerImp(); 

ListenableFuture<StompSession> stompSessionFuture2 = stompClient.connect(stompUrlEndpoint.toString(), stompSessionHandlerImp); 


try { 
      stompSession = stompSessionFuture.get(10, TimeUnit.SECONDS); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (ExecutionException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (TimeoutException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 


     private class StompSessionHandlerImp extends StompSessionHandlerAdapter { 
      private StompSession session; 


      @Override 
      public void afterConnected(StompSession session, StompHeaders connectedHeaders) { 
      this.session = session; 

      session.setAutoReceipt(true); 
      session.subscribe("/user/queue/bancaria.readcard", new StompFrameHandler() { 
      ... 
     } 
} 

}

 Смежные вопросы

  • Нет связанных вопросов^_^