/** * Factory method for create and configure a new session. * @param connectHeaders headers for the STOMP CONNECT frame * @param handler the handler for the STOMP session * @return the created session */ protected ConnectionHandlingStompSession createSession( @Nullable StompHeaders connectHeaders, StompSessionHandler handler) { connectHeaders = processConnectHeaders(connectHeaders); DefaultStompSession session = new DefaultStompSession(handler, connectHeaders); session.setMessageConverter(getMessageConverter()); session.setTaskScheduler(getTaskScheduler()); session.setReceiptTimeLimit(getReceiptTimeLimit()); return session; }
/** * Determine whether heartbeats are enabled. * <p>Returns {@code false} if {@link #setDefaultHeartbeat defaultHeartbeat} * is set to "0,0", and {@code true} otherwise. */ public boolean isDefaultHeartbeatEnabled() { long[] heartbeat = getDefaultHeartbeat(); return (heartbeat[0] != 0 && heartbeat[1] != 0); }
/** * {@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); }
@Test public void isDefaultHeartbeatEnabled() throws Exception { assertArrayEquals(new long[] {10000, 10000}, this.stompClient.getDefaultHeartbeat()); assertTrue(this.stompClient.isDefaultHeartbeatEnabled()); this.stompClient.setDefaultHeartbeat(new long[] {0, 0}); assertFalse(this.stompClient.isDefaultHeartbeatEnabled()); }
@Override protected StompHeaders processConnectHeaders(@Nullable StompHeaders connectHeaders) { connectHeaders = super.processConnectHeaders(connectHeaders); if (connectHeaders.isHeartbeatEnabled()) { Assert.state(getTaskScheduler() != null, "TaskScheduler must be set if heartbeats are enabled"); } return connectHeaders; }
private void scheduleReconnect(Throwable e) { this.epoch.incrementAndGet(); this.connecting = this.connected = false; if (e != null) { this.logger.error("STOMP connect error for " + this, e); } if (this.applicationEventPublisher != null) { this.applicationEventPublisher.publishEvent( new StompConnectionFailedEvent(this, e)); } // cancel() after the publish in case we are on that thread; a send to a QueueChannel would fail. if (this.reconnectFuture != null) { this.reconnectFuture.cancel(true); this.reconnectFuture = null; } TaskScheduler taskScheduler = this.stompClient.getTaskScheduler(); if (taskScheduler != null) { this.reconnectFuture = taskScheduler.schedule(this::connect, new Date(System.currentTimeMillis() + this.recoveryInterval)); } else { this.logger.info("For automatic reconnection the stompClient should be configured with a TaskScheduler."); } }
@Test public void processConnectHeadersDefault() throws Exception { StompHeaders connectHeaders = this.stompClient.processConnectHeaders(null); assertNotNull(connectHeaders); assertArrayEquals(new long[] {10000, 10000}, connectHeaders.getHeartbeat()); }
/** * Factory method for create and configure a new session. * @param connectHeaders headers for the STOMP CONNECT frame * @param handler the handler for the STOMP session * @return the created session */ protected ConnectionHandlingStompSession createSession( @Nullable StompHeaders connectHeaders, StompSessionHandler handler) { connectHeaders = processConnectHeaders(connectHeaders); DefaultStompSession session = new DefaultStompSession(handler, connectHeaders); session.setMessageConverter(getMessageConverter()); session.setTaskScheduler(getTaskScheduler()); session.setReceiptTimeLimit(getReceiptTimeLimit()); return session; }
@Test public void processConnectHeadersWithExplicitHeartbeat() throws Exception { StompHeaders connectHeaders = new StompHeaders(); connectHeaders.setHeartbeat(new long[] {15000, 15000}); connectHeaders = this.stompClient.processConnectHeaders(connectHeaders); assertNotNull(connectHeaders); assertArrayEquals(new long[] {15000, 15000}, connectHeaders.getHeartbeat()); }
/** * Further initialize the StompHeaders, for example setting the heart-beat * header if necessary. * @param connectHeaders the headers to modify * @return the modified headers */ protected StompHeaders processConnectHeaders(@Nullable StompHeaders connectHeaders) { connectHeaders = (connectHeaders != null ? connectHeaders : new StompHeaders()); if (connectHeaders.getHeartbeat() == null) { connectHeaders.setHeartbeat(getDefaultHeartbeat()); } return connectHeaders; }
@Test public void testDoConnectFailure() throws Exception { StompClientSupport stompClient = mock(StompClientSupport.class); stompClient.setTaskScheduler(new ConcurrentTaskScheduler()); AbstractStompSessionManager sessionManager = new AbstractStompSessionManager(stompClient) {
/** * Factory method for create and configure a new session. * @param connectHeaders headers for the STOMP CONNECT frame * @param handler the handler for the STOMP session * @return the created session */ protected ConnectionHandlingStompSession createSession( @Nullable StompHeaders connectHeaders, StompSessionHandler handler) { connectHeaders = processConnectHeaders(connectHeaders); DefaultStompSession session = new DefaultStompSession(handler, connectHeaders); session.setMessageConverter(getMessageConverter()); session.setTaskScheduler(getTaskScheduler()); session.setReceiptTimeLimit(getReceiptTimeLimit()); return session; }
@Override protected StompHeaders processConnectHeaders(@Nullable StompHeaders connectHeaders) { connectHeaders = super.processConnectHeaders(connectHeaders); if (connectHeaders.isHeartbeatEnabled()) { Assert.state(getTaskScheduler() != null, "TaskScheduler must be set if heartbeats are enabled"); } return connectHeaders; }
@Test public void defaultHeartbeatValue() throws Exception { assertArrayEquals(new long[] {10000, 10000}, this.stompClient.getDefaultHeartbeat()); }
/** * {@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); }
/** * Factory method for create and configure a new session. * @param connectHeaders headers for the STOMP CONNECT frame * @param handler the handler for the STOMP session * @return the created session */ protected ConnectionHandlingStompSession createSession( @Nullable StompHeaders connectHeaders, StompSessionHandler handler) { connectHeaders = processConnectHeaders(connectHeaders); DefaultStompSession session = new DefaultStompSession(handler, connectHeaders); session.setMessageConverter(getMessageConverter()); session.setTaskScheduler(getTaskScheduler()); session.setReceiptTimeLimit(getReceiptTimeLimit()); return session; }
@Override protected StompHeaders processConnectHeaders(@Nullable StompHeaders connectHeaders) { connectHeaders = super.processConnectHeaders(connectHeaders); if (connectHeaders.isHeartbeatEnabled()) { Assert.state(getTaskScheduler() != null, "TaskScheduler must be set if heartbeats are enabled"); } return connectHeaders; }
/** * Determine whether heartbeats are enabled. * <p>Returns {@code false} if {@link #setDefaultHeartbeat defaultHeartbeat} * is set to "0,0", and {@code true} otherwise. */ public boolean isDefaultHeartbeatEnabled() { long[] heartbeat = getDefaultHeartbeat(); return (heartbeat[0] != 0 && heartbeat[1] != 0); }
/** * {@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); }
/** * Further initialize the StompHeaders, for example setting the heart-beat * header if necessary. * @param connectHeaders the headers to modify * @return the modified headers */ protected StompHeaders processConnectHeaders(@Nullable StompHeaders connectHeaders) { connectHeaders = (connectHeaders != null ? connectHeaders : new StompHeaders()); if (connectHeaders.getHeartbeat() == null) { connectHeaders.setHeartbeat(getDefaultHeartbeat()); } return connectHeaders; }