/** * Connect to the given WebSocket URL and notify the given * {@link org.springframework.messaging.simp.stomp.StompSessionHandler} * when connected on the STOMP level after the CONNECTED frame is received. * @param url the url to connect to * @param handler the session handler * @param uriVars the URI variables to expand into the URL * @return a ListenableFuture for access to the session when ready for use */ public ListenableFuture<StompSession> connect(String url, StompSessionHandler handler, Object... uriVars) { return connect(url, null, handler, uriVars); }
@Test public void heartbeatDefaultValueSetWithoutScheduler() throws Exception { WebSocketStompClient stompClient = new WebSocketStompClient(mock(WebSocketClient.class)); stompClient.setDefaultHeartbeat(new long[] {5, 5}); try { stompClient.processConnectHeaders(null); fail("Expected IllegalStateException"); } catch (IllegalStateException ex) { // ignore } }
@Test public void heartbeatDefaultValueWithScheduler() throws Exception { WebSocketStompClient stompClient = new WebSocketStompClient(mock(WebSocketClient.class)); stompClient.setTaskScheduler(mock(TaskScheduler.class)); assertArrayEquals(new long[] {10000, 10000}, stompClient.getDefaultHeartbeat()); StompHeaders connectHeaders = stompClient.processConnectHeaders(null); assertArrayEquals(new long[] {10000, 10000}, connectHeaders.getHeartbeat()); }
@Override public void start() { if (!isRunning()) { this.running = true; if (getWebSocketClient() instanceof Lifecycle) { ((Lifecycle) getWebSocketClient()).start(); } } }
/** * {@inheritDoc} * <p>Also automatically sets the {@link #setDefaultHeartbeat defaultHeartbeat} * property to "10000,10000" if it is currently set to "0,0". */ @Override public void setTaskScheduler(@Nullable TaskScheduler taskScheduler) { if (!isDefaultHeartbeatEnabled()) { setDefaultHeartbeat(new long[] {10000, 10000}); } super.setTaskScheduler(taskScheduler); }
/** * An overloaded version of * {@link #connect(String, WebSocketHttpHeaders, StompSessionHandler, Object...)} * that accepts a fully prepared {@link java.net.URI}. * @param url the url to connect to * @param handshakeHeaders the headers for the WebSocket handshake * @param connectHeaders headers for the STOMP CONNECT frame * @param sessionHandler the STOMP session handler * @return a ListenableFuture for access to the session when ready for use */ public ListenableFuture<StompSession> connect(URI url, @Nullable WebSocketHttpHeaders handshakeHeaders, @Nullable StompHeaders connectHeaders, StompSessionHandler sessionHandler) { Assert.notNull(url, "'url' must not be null"); ConnectionHandlingStompSession session = createSession(connectHeaders, sessionHandler); WebSocketTcpConnectionHandlerAdapter adapter = new WebSocketTcpConnectionHandlerAdapter(session); getWebSocketClient().doHandshake(adapter, handshakeHeaders, url).addCallback(adapter); return session.getSessionFuture(); }
public static void main(String... argv) { WebSocketClient webSocketClient = new StandardWebSocketClient(); WebSocketStompClient stompClient = new WebSocketStompClient(webSocketClient); stompClient.setMessageConverter(new MappingJackson2MessageConverter()); stompClient.setTaskScheduler(new ConcurrentTaskScheduler()); String url = "ws://127.0.0.1:8080/hello"; StompSessionHandler sessionHandler = new MySessionHandler(); stompClient.connect(url, sessionHandler); new Scanner(System.in).nextLine(); //Don't close immediately. } }
@Bean @ConditionalOnMissingBean(WebSocketStompClient.class) public WebSocketStompClient stompClient(WebSocketClient webSocketClient, MessageConverter messageConverter, @Qualifier("proxyStompClientTaskScheduler") TaskScheduler taskScheduler) { int bufferSizeLimit = 1024 * 1024 * 8; WebSocketStompClient client = new WebSocketStompClient(webSocketClient); client.setInboundMessageSizeLimit(bufferSizeLimit); client.setMessageConverter(messageConverter); client.setTaskScheduler(taskScheduler); client.setDefaultHeartbeat(new long[]{0, 0}); return client; }
@Bean public WebSocketStompClient stompClient(TaskScheduler taskScheduler) { WebSocketStompClient webSocketStompClient = new WebSocketStompClient(webSocketClient()); webSocketStompClient.setTaskScheduler(taskScheduler); webSocketStompClient.setReceiptTimeLimit(5000); webSocketStompClient.setMessageConverter(new StringMessageConverter()); return webSocketStompClient; }
@Bean public WebSocketStompClient stompClient(TaskScheduler taskScheduler) { WebSocketStompClient webSocketStompClient = new WebSocketStompClient(webSocketClient()); webSocketStompClient.setMessageConverter(new MappingJackson2MessageConverter()); webSocketStompClient.setTaskScheduler(taskScheduler); return webSocketStompClient; }
WebSocketClient transport = new StandardWebSocketClient(); WebSocketStompClient stompClient = new WebSocketStompClient(transport); MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter(); stompClient.setMessageConverter(converter); StompSessionHandler handler = new WSClient(); //custom implementation String url = "ws://{URL}/ws/websocket"; stompClient.connect(url, handler);
@Before public void setUp() throws Exception { logger.debug("Setting up before '" + this.testName.getMethodName() + "'"); this.wac = new AnnotationConfigWebApplicationContext(); this.wac.register(TestConfig.class); this.wac.refresh(); this.server = new TomcatWebSocketTestServer(); this.server.setup(); this.server.deployConfig(this.wac); this.server.start(); WebSocketClient webSocketClient = new StandardWebSocketClient(); this.stompClient = new WebSocketStompClient(webSocketClient); this.stompClient.setMessageConverter(new StringMessageConverter()); }
@Override public void onReadInactivity(final Runnable runnable, final long duration) { Assert.state(getTaskScheduler() != null, "No TaskScheduler configured"); this.lastReadTime = System.currentTimeMillis(); this.inactivityTasks.add(getTaskScheduler().scheduleWithFixedDelay(() -> { if (System.currentTimeMillis() - this.lastReadTime > duration) { try { runnable.run(); } catch (Throwable ex) { if (logger.isDebugEnabled()) { logger.debug("ReadInactivityTask failure", ex); } } } }, duration / 2)); }
/** * Class constructor. Sets {@link #setDefaultHeartbeat} to "0,0" but will * reset it back to the preferred "10000,10000" when a * {@link #setTaskScheduler} is configured. * @param webSocketClient the WebSocket client to connect with */ public WebSocketStompClient(WebSocketClient webSocketClient) { Assert.notNull(webSocketClient, "WebSocketClient is required"); this.webSocketClient = webSocketClient; setDefaultHeartbeat(new long[] {0, 0}); }
@Test public void heartbeatDefaultValue() throws Exception { WebSocketStompClient stompClient = new WebSocketStompClient(mock(WebSocketClient.class)); assertArrayEquals(new long[] {0, 0}, stompClient.getDefaultHeartbeat()); StompHeaders connectHeaders = stompClient.processConnectHeaders(null); assertArrayEquals(new long[] {0, 0}, connectHeaders.getHeartbeat()); }
@Override public void stop() { if (isRunning()) { this.running = false; if (getWebSocketClient() instanceof Lifecycle) { ((Lifecycle) getWebSocketClient()).stop(); } } }
/** * {@inheritDoc} * <p>Also automatically sets the {@link #setDefaultHeartbeat defaultHeartbeat} * property to "10000,10000" if it is currently set to "0,0". */ @Override public void setTaskScheduler(@Nullable TaskScheduler taskScheduler) { if (!isDefaultHeartbeatEnabled()) { setDefaultHeartbeat(new long[] {10000, 10000}); } super.setTaskScheduler(taskScheduler); }
/** * An overloaded version of * {@link #connect(String, WebSocketHttpHeaders, StompSessionHandler, Object...)} * that accepts a fully prepared {@link java.net.URI}. * @param url the url to connect to * @param handshakeHeaders the headers for the WebSocket handshake * @param connectHeaders headers for the STOMP CONNECT frame * @param sessionHandler the STOMP session handler * @return a ListenableFuture for access to the session when ready for use */ public ListenableFuture<StompSession> connect(URI url, @Nullable WebSocketHttpHeaders handshakeHeaders, @Nullable StompHeaders connectHeaders, StompSessionHandler sessionHandler) { Assert.notNull(url, "'url' must not be null"); ConnectionHandlingStompSession session = createSession(connectHeaders, sessionHandler); WebSocketTcpConnectionHandlerAdapter adapter = new WebSocketTcpConnectionHandlerAdapter(session); getWebSocketClient().doHandshake(adapter, handshakeHeaders, url).addCallback(adapter); return session.getSessionFuture(); }
@Override public void onWriteInactivity(final Runnable runnable, final long duration) { Assert.state(getTaskScheduler() != null, "No TaskScheduler configured"); this.lastWriteTime = System.currentTimeMillis(); this.inactivityTasks.add(getTaskScheduler().scheduleWithFixedDelay(() -> { if (System.currentTimeMillis() - this.lastWriteTime > duration) { try { runnable.run(); } catch (Throwable ex) { if (logger.isDebugEnabled()) { logger.debug("WriteInactivityTask failure", ex); } } } }, duration / 2)); }
/** * Class constructor. Sets {@link #setDefaultHeartbeat} to "0,0" but will * reset it back to the preferred "10000,10000" when a * {@link #setTaskScheduler} is configured. * @param webSocketClient the WebSocket client to connect with */ public WebSocketStompClient(WebSocketClient webSocketClient) { Assert.notNull(webSocketClient, "WebSocketClient is required"); this.webSocketClient = webSocketClient; setDefaultHeartbeat(new long[] {0, 0}); }