private RemoteEndpoint getRemoteEndpoint() throws IOException { try { return getNativeSession().getRemote(); } catch (WebSocketException ex) { throw new IOException("Unable to obtain RemoteEndpoint in session " + getId(), ex); } }
@Override public void ping() throws IOException { session.getRemote().sendString(WebsocketMessages.PING); }
@Override public void send(ByteBuffer data) throws IOException { session.getRemote().sendBytes(data); }
@Override public void complete(boolean success) { session.getRemote().sendStringByFuture("{ \"command\": \"complete\", \"success\": " + success + " }"); } }
@Override public void sendBinary(final ByteBuffer data) throws IOException { session.getRemote().sendBytes(data); }
@Override public void sendString(final String message) throws IOException { session.getRemote().sendString(message); }
@Override public void send(final Message msg) { LOGGER.debug("{} send message: {}", sessionName(), msg); session.getRemote().sendBytesByFuture(ByteBuffer.wrap(MessageEncoding.encodeMessage(msg))); }
@Override public void sendText(final ByteBuffer data, final SuccessCallback success, final OnError err) { requireNonNull(data, NO_DATA_TO_SEND); RemoteEndpoint remote = session.getRemote(); CharBuffer buffer = StandardCharsets.UTF_8.decode(data); // we need a TextFrame with ByteBuffer :( remote.sendString(buffer.toString(), callback(log, success, err)); }
@Override public void sendText(final byte[] data, final SuccessCallback success, final OnError err) { requireNonNull(data, NO_DATA_TO_SEND); RemoteEndpoint remote = session.getRemote(); remote.sendString(new String(data, StandardCharsets.UTF_8), callback(log, success, err)); }
@Override public void sendBytes(final ByteBuffer data, final SuccessCallback success, final OnError err) { requireNonNull(data, NO_DATA_TO_SEND); RemoteEndpoint remote = session.getRemote(); remote.sendBytes(data, callback(log, success, err)); }
@Override public void sendText(final String data, final SuccessCallback success, final OnError err) { requireNonNull(data, NO_DATA_TO_SEND); RemoteEndpoint remote = session.getRemote(); remote.sendString(data, callback(log, success, err)); }
private void send(Message message) { for (int retries = 1; retries <= systemEnvironment.getWebsocketSendRetryCount(); retries++) { try { LOG.debug("{} attempt {} to send message: {}", sessionName(), retries, message); session.getRemote().sendBytesByFuture(ByteBuffer.wrap(MessageEncoding.encodeMessage(message))); break; } catch (Throwable e) { try { LOG.debug("{} attempt {} failed to send message: {}.", sessionName(), retries, message); if (retries == systemEnvironment.getWebsocketSendRetryCount()) { bomb(e); } Thread.sleep(2000L); } catch (InterruptedException ignored) { } } } }
@Signature public void sendPartialText(String text, boolean isLast) throws IOException { getWrappedObject().getRemote().sendPartialString(text, isLast); }
@Signature public void flush() throws IOException { getWrappedObject().getRemote().flush(); }
@Signature public void batchMode(BatchMode mode) { getWrappedObject().getRemote().setBatchMode(mode); }
@Signature public BatchMode batchMode() { return getWrappedObject().getRemote().getBatchMode(); }
@Override public TransportConnection connect( HostnamePort address ) throws Exception { URI target = uriGenerator.apply( address ); client = clientSupplier.get(); client.start(); Session session; try { session = client.connect( this, target ).get( 10, SECONDS ); } catch ( Exception e ) { throw new IOException( "Failed to connect to the server within 10 seconds", e ); } server = session.getRemote(); return this; }
@Override protected boolean sendMessage(WebSocketMessage message) throws IOException { ByteBuffer buffer = message.getPayload().asByteBuffer(); if (WebSocketMessage.Type.TEXT.equals(message.getType())) { getSendProcessor().setReadyToSend(false); String text = new String(buffer.array(), StandardCharsets.UTF_8); getDelegate().getRemote().sendString(text, new SendProcessorCallback()); } else if (WebSocketMessage.Type.BINARY.equals(message.getType())) { getSendProcessor().setReadyToSend(false); getDelegate().getRemote().sendBytes(buffer, new SendProcessorCallback()); } else if (WebSocketMessage.Type.PING.equals(message.getType())) { getDelegate().getRemote().sendPing(buffer); } else if (WebSocketMessage.Type.PONG.equals(message.getType())) { getDelegate().getRemote().sendPong(buffer); } else { throw new IllegalArgumentException("Unexpected message type: " + message.getType()); } return true; }
@OnWebSocketConnect public void onConnect(Session session) throws Exception { this.session = session; socketHealthService.register(this); LOGGER.debug("{} connected", sessionName()); session.getRemote().sendString(consoleLogCharsetJSONMessage); long start = parseStartLine(session.getUpgradeRequest()); LOGGER.debug("{} sending logs for {} starting at line {}.", sessionName(), jobIdentifier, start); try { handler.process(this, jobIdentifier, start); } catch (IOException e) { if ("Connection output is closed".equals(e.getMessage())) { LOGGER.debug("{} client (likely, browser) closed connection prematurely.", sessionName()); close(); // for good measure } else { throw e; } } }
@Test public void shouldWaitForAcknowledgementWhileSendingMessages() throws Exception { final Message message = new Message(Action.reportCurrentStatus); when(session.getRemote()).thenReturn(new FakeWebSocketEndpoint(new Runnable() { @Override public void run() { handler.acknowledge(new Message(Action.acknowledge, message.getAcknowledgementId())); } })); Thread sendThread = new Thread(new Runnable() { @Override public void run() { handler.sendAndWaitForAcknowledgement(message); } }); sendThread.start(); assertThat(sendThread.isAlive(), is(true)); sendThread.join(); assertThat(sendThread.isAlive(), is(false)); }