Kir*_* S. 4 java concurrency spring multithreading spring-websocket
我正在使用本指南来实现一个简单的 Stomp 客户端:
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
Run Code Online (Sandbox Code Playgroud)
当连接完成时,它应该MySessionHandler异步报告:
public class MySessionHandler extends StompSessionHandlerAdapter
{
@Override
public void afterConnected(StompSession session, StompHeaders connectedHeaders)
{
// WAITING FOR THIS
}
}
Run Code Online (Sandbox Code Playgroud)
所以问题是:线路WAITING HERE应该如何等待线路WAITING FOR THIS?是否有特定的 Spring 方式来执行此操作?如果不是,哪种通用 Java 方式最适合这里?
也许 ajava.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();
Run Code Online (Sandbox Code Playgroud)
你的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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
带闩锁的解决方案有效。后来我发现connect函数返回ListenableFuture<StompSession>,所以我们可以像这样等待会话被创建:
ListenableFuture<StompSession> future =
stompClient.connect("ws://server/endpoint", sessionHandler);
StompSession session = future.get(); // <--- this line will wait just like afterConnected()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7572 次 |
| 最近记录: |