javax.websocket.SendHandler Java Examples

The following examples show how to use javax.websocket.SendHandler. You can vote up the ones you like or vote down the ones you don't like, and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example #1
Source File: WsRemoteEndpointImplClient.java    From Tomcat7.0.67 with Apache License 2.0 6 votes vote down vote up
@Override
protected void doWrite(SendHandler handler, ByteBuffer... data) {
    long timeout = getSendTimeout();
    if (timeout < 1) {
        timeout = Long.MAX_VALUE;

    }
    SendHandlerToCompletionHandler sh2ch =
            new SendHandlerToCompletionHandler(handler);
    try {
        channel.write(data, 0, data.length, timeout, TimeUnit.MILLISECONDS,
                null, sh2ch);
    } catch (IllegalStateException ise) {
        sh2ch.failed(ise, null);
    }
}
 
Example #2
Source File: SessionBasedAttachedClient.java    From pnc with Apache License 2.0 6 votes vote down vote up
@Override
public void sendMessage(Object messageBody, MessageCallback callback) {

    String message;
    try {
        message = mapperProvider.getMapper().writeValueAsString(messageBody);
    } catch (JsonProcessingException e) {
        throw new IllegalArgumentException("Could not convert object to JSON", e);
    }
    session.getAsyncRemote().sendText(message, new SendHandler() {
        @Override
        public void onResult(SendResult sendResult) {
            if (!sendResult.isOK()) {
                callback.failed(SessionBasedAttachedClient.this, sendResult.getException());
            } else {
                callback.successful(SessionBasedAttachedClient.this);
            }
        }
    });
}
 
Example #3
Source File: RemoteP2PConnection.java    From jReto with MIT License 6 votes vote down vote up
@Override
public void writeData(ByteBuffer data) {
	if (!this.isConnected()) {
		System.err.println("attempted to write before connection is open.");
		return;
	}
	new Thread(() -> 
	this.dataSession.getAsyncRemote().sendBinary(data, new SendHandler() {
		@Override
		public void onResult(SendResult arg0) {
			RemoteP2PConnection.this.executor.execute(new Runnable() {
				@Override
				public void run() {
					if (RemoteP2PConnection.this.handler != null) RemoteP2PConnection.this.handler.onDataSent(RemoteP2PConnection.this);
				}
			});
		}
	})).start();
}
 
Example #4
Source File: WsRemoteEndpointImplClient.java    From tomcatsrc with Apache License 2.0 6 votes vote down vote up
@Override
protected void doWrite(SendHandler handler, ByteBuffer... data) {
    long timeout = getSendTimeout();
    if (timeout < 1) {
        timeout = Long.MAX_VALUE;

    }
    SendHandlerToCompletionHandler sh2ch =
            new SendHandlerToCompletionHandler(handler);
    try {
        channel.write(data, 0, data.length, timeout, TimeUnit.MILLISECONDS,
                null, sh2ch);
    } catch (IllegalStateException ise) {
        sh2ch.failed(ise, null);
    }
}
 
Example #5
Source File: TestWsSessionSuspendResume.java    From Tomcat8-Source-Read with MIT License 6 votes vote down vote up
void addMessage(String message) {
    if (messages.size() == count) {
        ((WsSession) session).suspend();
        session.getAsyncRemote().sendText(messages.toString(), new SendHandler() {

            @Override
            public void onResult(SendResult result) {
                ((WsSession) session).resume();
                Assert.assertTrue(result.isOK());
            }
        });
        messages.clear();
    } else {
        messages.add(message);
    }
}
 
Example #6
Source File: WebSocketSessionRemoteEndpoint.java    From quarkus-http with Apache License 2.0 6 votes vote down vote up
private void sendObjectImpl(final Object o, final SendHandler callback) {
    try {
        if (o instanceof String) {
            sendText((String) o, callback);
        } else if (o instanceof byte[]) {
            sendBinary(ByteBuffer.wrap((byte[]) o), callback);
        } else if (o instanceof ByteBuffer) {
            sendBinary((ByteBuffer) o, callback);
        } else if (encoding.canEncodeText(o.getClass())) {
            sendText(encoding.encodeText(o), callback);
        } else if (encoding.canEncodeBinary(o.getClass())) {
            sendBinary(encoding.encodeBinary(o), callback);
        } else {
            // TODO: Replace on bug is fixed
            // https://issues.jboss.org/browse/LOGTOOL-64
            throw new EncodeException(o, "No suitable encoder found");
        }
    } catch (Exception e) {
        callback.onResult(new SendResult(e));
    }
}
 
Example #7
Source File: WebsocketStressTestCase.java    From quarkus-http with Apache License 2.0 6 votes vote down vote up
@Override
public void run() {
    session.getAsyncRemote().sendText("t-" + thread + "-m-" + count.get(), new SendHandler() {
        @Override
        public void onResult(SendResult result) {
            if (!result.isOK()) {
                try {
                    result.getException().printStackTrace();
                    session.close();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
            if (count.incrementAndGet() != NUM_REQUESTS) {
                executor.submit(SendRunnable.this);
            } else {
                executor.submit(new Runnable() {
                    @Override
                    public void run() {
                        session.getAsyncRemote().sendText("close");
                    }
                });
            }
        }
    });
}
 
Example #8
Source File: WsRemoteEndpointImplBase.java    From Tomcat8-Source-Read with MIT License 5 votes vote down vote up
public OutputBufferSendHandler(SendHandler completion,
        long blockingWriteTimeoutExpiry,
        ByteBuffer headerBuffer, ByteBuffer payload, byte[] mask,
        ByteBuffer outputBuffer, boolean flushRequired,
        WsRemoteEndpointImplBase endpoint) {
    this.blockingWriteTimeoutExpiry = blockingWriteTimeoutExpiry;
    this.handler = completion;
    this.headerBuffer = headerBuffer;
    this.payload = payload;
    this.mask = mask;
    this.outputBuffer = outputBuffer;
    this.flushRequired = flushRequired;
    this.endpoint = endpoint;
}
 
Example #9
Source File: WsRemoteEndpointImplBase.java    From Tomcat7.0.67 with Apache License 2.0 5 votes vote down vote up
public TextMessageSendHandler(SendHandler handler, CharBuffer message,
        boolean isLast, CharsetEncoder encoder,
        ByteBuffer encoderBuffer, WsRemoteEndpointImplBase endpoint) {
    this.handler = handler;
    this.message = message;
    this.isLast = isLast;
    this.encoder = encoder.reset();
    this.buffer = encoderBuffer;
    this.endpoint = endpoint;
}
 
Example #10
Source File: WsRemoteEndpointImplBase.java    From Tomcat7.0.67 with Apache License 2.0 5 votes vote down vote up
void endMessage(SendHandler handler, SendResult result) {
    boolean doWrite = false;
    MessagePart mpNext = null;
    synchronized (messagePartLock) {

        fragmented = nextFragmented;
        text = nextText;

        mpNext = messagePartQueue.poll();
        if (mpNext == null) {
            messagePartInProgress = false;
        } else if (!closed){
            // Session may have been closed unexpectedly in the middle of
            // sending a fragmented message closing the endpoint. If this
            // happens, clearly there is no point trying to send the rest of
            // the message.
            doWrite = true;
        }
    }
    if (doWrite) {
        // Actual write has to be outside sync block to avoid possible
        // deadlock between messagePartLock and writeLock in
        // o.a.coyote.http11.upgrade.AbstractServletOutputStream
        writeMessagePart(mpNext);
    }

    wsSession.updateLastActive();

    // Some handlers, such as the IntermediateMessageHandler, do not have a
    // nested handler so handler may be null.
    if (handler != null) {
        handler.onResult(result);
    }
}
 
Example #11
Source File: WsRemoteEndpointImplBase.java    From Tomcat7.0.67 with Apache License 2.0 5 votes vote down vote up
public void sendStringByCompletion(String text, SendHandler handler) {
    if (text == null) {
        throw new IllegalArgumentException(sm.getString("wsRemoteEndpoint.nullData"));
    }
    if (handler == null) {
        throw new IllegalArgumentException(sm.getString("wsRemoteEndpoint.nullHandler"));
    }
    stateMachine.textStart();
    TextMessageSendHandler tmsh = new TextMessageSendHandler(handler,
            CharBuffer.wrap(text), true, encoder, encoderBuffer, this);
    tmsh.write();
    // TextMessageSendHandler will update stateMachine when it completes
}
 
Example #12
Source File: WsRemoteEndpointImplBase.java    From Tomcat7.0.67 with Apache License 2.0 5 votes vote down vote up
public void sendBytesByCompletion(ByteBuffer data, SendHandler handler) {
    if (data == null) {
        throw new IllegalArgumentException(sm.getString("wsRemoteEndpoint.nullData"));
    }
    if (handler == null) {
        throw new IllegalArgumentException(sm.getString("wsRemoteEndpoint.nullHandler"));
    }
    StateUpdateSendHandler sush = new StateUpdateSendHandler(handler);
    stateMachine.binaryStart();
    startMessage(Constants.OPCODE_BINARY, data, true, sush);
}
 
Example #13
Source File: WsRemoteEndpointImplServer.java    From Tomcat7.0.67 with Apache License 2.0 5 votes vote down vote up
@Override
protected void doWrite(SendHandler handler, ByteBuffer... buffers) {
    this.handler = handler;
    this.buffers = buffers;
    // This is definitely the same thread that triggered the write so a
    // dispatch will be required.
    onWritePossible(true);
}
 
Example #14
Source File: MessagePart.java    From Tomcat8-Source-Read with MIT License 5 votes vote down vote up
public MessagePart( boolean fin, int rsv, byte opCode, ByteBuffer payload,
        SendHandler intermediateHandler, SendHandler endHandler,
        long blockingWriteTimeoutExpiry) {
    this.fin = fin;
    this.rsv = rsv;
    this.opCode = opCode;
    this.payload = payload;
    this.intermediateHandler = intermediateHandler;
    this.endHandler = endHandler;
    this.blockingWriteTimeoutExpiry = blockingWriteTimeoutExpiry;
}
 
Example #15
Source File: WsRemoteEndpointImplServer.java    From Tomcat8-Source-Read with MIT License 5 votes vote down vote up
/**
 *
 * @param t             The throwable associated with any error that
 *                      occurred
 * @param useDispatch   Should {@link SendHandler#onResult(SendResult)} be
 *                      called from a new thread, keeping in mind the
 *                      requirements of
 *                      {@link javax.websocket.RemoteEndpoint.Async}
 */
private void clearHandler(Throwable t, boolean useDispatch) {
    // Setting the result marks this (partial) message as
    // complete which means the next one may be sent which
    // could update the value of the handler. Therefore, keep a
    // local copy before signalling the end of the (partial)
    // message.
    SendHandler sh = handler;
    handler = null;
    buffers = null;
    if (sh != null) {
        if (useDispatch) {
            OnResultRunnable r = new OnResultRunnable(sh, t);
            AbstractEndpoint<?> endpoint = socketWrapper.getEndpoint();
            Executor containerExecutor = endpoint.getExecutor();
            if (endpoint.isRunning() && containerExecutor != null) {
                containerExecutor.execute(r);
            } else {
                // Can't use the executor so call the runnable directly.
                // This may not be strictly specification compliant in all
                // cases but during shutdown only close messages are going
                // to be sent so there should not be the issue of nested
                // calls leading to stack overflow as described in bug
                // 55715. The issues with nested calls was the reason for
                // the separate thread requirement in the specification.
                r.run();
            }
        } else {
            if (t == null) {
                sh.onResult(new SendResult());
            } else {
                sh.onResult(new SendResult(t));
            }
        }
    }
}
 
Example #16
Source File: WebSocketSessionRemoteEndpoint.java    From quarkus-http with Apache License 2.0 5 votes vote down vote up
@Override
public void sendObject(final Object data, final SendHandler handler) {

    if (handler == null) {
        throw JsrWebSocketMessages.MESSAGES.handlerIsNull();
    }
    if (data == null) {
        throw JsrWebSocketMessages.MESSAGES.messageInNull();
    }
    sendObjectImpl(data, handler);
}
 
Example #17
Source File: WsRemoteEndpointImplBase.java    From Tomcat8-Source-Read with MIT License 5 votes vote down vote up
void endMessage(SendHandler handler, SendResult result) {
    boolean doWrite = false;
    MessagePart mpNext = null;
    synchronized (messagePartLock) {

        fragmented = nextFragmented;
        text = nextText;

        mpNext = messagePartQueue.poll();
        if (mpNext == null) {
            messagePartInProgress.release();
        } else if (!closed){
            // Session may have been closed unexpectedly in the middle of
            // sending a fragmented message closing the endpoint. If this
            // happens, clearly there is no point trying to send the rest of
            // the message.
            doWrite = true;
        }
    }
    if (doWrite) {
        // Actual write has to be outside sync block to avoid possible
        // deadlock between messagePartLock and writeLock in
        // o.a.coyote.http11.upgrade.AbstractServletOutputStream
        writeMessagePart(mpNext);
    }

    wsSession.updateLastActive();

    // Some handlers, such as the IntermediateMessageHandler, do not have a
    // nested handler so handler may be null.
    if (handler != null) {
        handler.onResult(result);
    }
}
 
Example #18
Source File: WsRemoteEndpointImplBase.java    From Tomcat7.0.67 with Apache License 2.0 5 votes vote down vote up
public OutputBufferSendHandler(SendHandler completion,
        ByteBuffer headerBuffer, ByteBuffer payload, byte[] mask,
        ByteBuffer outputBuffer, boolean flushRequired,
        WsRemoteEndpointImplBase endpoint) {
    this.handler = completion;
    this.headerBuffer = headerBuffer;
    this.payload = payload;
    this.mask = mask;
    this.outputBuffer = outputBuffer;
    this.flushRequired = flushRequired;
    this.endpoint = endpoint;
}
 
Example #19
Source File: BinaryFrameOutputStream.java    From websocket-classloader with Apache License 2.0 5 votes vote down vote up
@Override
public void flush() {
    if (buffer.position() > 0) {
        buffer.flip();
        remote.sendBinary(buffer, new SendHandler() {
            @Override
            public void onResult(SendResult sendResult) {
                if (!sendResult.isOK()) {
                    logger.error("Failed to send messages.", sendResult.getException());
                }
            }
        });
    }
    buffer.clear();
}
 
Example #20
Source File: WsRemoteEndpointImplServer.java    From Tomcat7.0.67 with Apache License 2.0 5 votes vote down vote up
/**
 *
 * @param t             The throwable associated with any error that
 *                      occurred
 * @param useDispatch   Should {@link SendHandler#onResult(SendResult)} be
 *                      called from a new thread, keeping in mind the
 *                      requirements of
 *                      {@link javax.websocket.RemoteEndpoint.Async}
 */
private void clearHandler(Throwable t, boolean useDispatch) {
    // Setting the result marks this (partial) message as
    // complete which means the next one may be sent which
    // could update the value of the handler. Therefore, keep a
    // local copy before signalling the end of the (partial)
    // message.
    SendHandler sh = handler;
    handler = null;
    buffers = null;
    if (sh != null) {
        if (useDispatch) {
            OnResultRunnable r = onResultRunnables.poll();
            if (r == null) {
                r = new OnResultRunnable(onResultRunnables);
            }
            r.init(sh, t);
            if (executorService == null || executorService.isShutdown()) {
                // Can't use the executor so call the runnable directly.
                // This may not be strictly specification compliant in all
                // cases but during shutdown only close messages are going
                // to be sent so there should not be the issue of nested
                // calls leading to stack overflow as described in bug
                // 55715. The issues with nested calls was the reason for
                // the separate thread requirement in the specification.
                r.run();
            } else {
                executorService.execute(r);
            }
        } else {
            if (t == null) {
                sh.onResult(new SendResult());
            } else {
                sh.onResult(new SendResult(t));
            }
        }
    }
}
 
Example #21
Source File: MessagePart.java    From Tomcat7.0.67 with Apache License 2.0 5 votes vote down vote up
public MessagePart( boolean fin, int rsv, byte opCode, ByteBuffer payload,
        SendHandler intermediateHandler, SendHandler endHandler) {
    this.fin = fin;
    this.rsv = rsv;
    this.opCode = opCode;
    this.payload = payload;
    this.intermediateHandler = intermediateHandler;
    this.endHandler = endHandler;
}
 
Example #22
Source File: WsRemoteEndpointImplBase.java    From tomcatsrc with Apache License 2.0 5 votes vote down vote up
public void sendBytesByCompletion(ByteBuffer data, SendHandler handler) {
    if (data == null) {
        throw new IllegalArgumentException(sm.getString("wsRemoteEndpoint.nullData"));
    }
    if (handler == null) {
        throw new IllegalArgumentException(sm.getString("wsRemoteEndpoint.nullHandler"));
    }
    StateUpdateSendHandler sush = new StateUpdateSendHandler(handler);
    stateMachine.binaryStart();
    startMessage(Constants.OPCODE_BINARY, data, true, sush);
}
 
Example #23
Source File: WsRemoteEndpointImplBase.java    From tomcatsrc with Apache License 2.0 5 votes vote down vote up
public void sendStringByCompletion(String text, SendHandler handler) {
    if (text == null) {
        throw new IllegalArgumentException(sm.getString("wsRemoteEndpoint.nullData"));
    }
    if (handler == null) {
        throw new IllegalArgumentException(sm.getString("wsRemoteEndpoint.nullHandler"));
    }
    stateMachine.textStart();
    TextMessageSendHandler tmsh = new TextMessageSendHandler(handler,
            CharBuffer.wrap(text), true, encoder, encoderBuffer, this);
    tmsh.write();
    // TextMessageSendHandler will update stateMachine when it completes
}
 
Example #24
Source File: WsRemoteEndpointImplBase.java    From tomcatsrc with Apache License 2.0 5 votes vote down vote up
void endMessage(SendHandler handler, SendResult result) {
    boolean doWrite = false;
    MessagePart mpNext = null;
    synchronized (messagePartLock) {

        fragmented = nextFragmented;
        text = nextText;

        mpNext = messagePartQueue.poll();
        if (mpNext == null) {
            messagePartInProgress = false;
        } else if (!closed){
            // Session may have been closed unexpectedly in the middle of
            // sending a fragmented message closing the endpoint. If this
            // happens, clearly there is no point trying to send the rest of
            // the message.
            doWrite = true;
        }
    }
    if (doWrite) {
        // Actual write has to be outside sync block to avoid possible
        // deadlock between messagePartLock and writeLock in
        // o.a.coyote.http11.upgrade.AbstractServletOutputStream
        writeMessagePart(mpNext);
    }

    wsSession.updateLastActive();

    // Some handlers, such as the IntermediateMessageHandler, do not have a
    // nested handler so handler may be null.
    if (handler != null) {
        handler.onResult(result);
    }
}
 
Example #25
Source File: WsRemoteEndpointImplBase.java    From tomcatsrc with Apache License 2.0 5 votes vote down vote up
public TextMessageSendHandler(SendHandler handler, CharBuffer message,
        boolean isLast, CharsetEncoder encoder,
        ByteBuffer encoderBuffer, WsRemoteEndpointImplBase endpoint) {
    this.handler = handler;
    this.message = message;
    this.isLast = isLast;
    this.encoder = encoder.reset();
    this.buffer = encoderBuffer;
    this.endpoint = endpoint;
}
 
Example #26
Source File: WsRemoteEndpointImplBase.java    From tomcatsrc with Apache License 2.0 5 votes vote down vote up
public OutputBufferSendHandler(SendHandler completion,
        ByteBuffer headerBuffer, ByteBuffer payload, byte[] mask,
        ByteBuffer outputBuffer, boolean flushRequired,
        WsRemoteEndpointImplBase endpoint) {
    this.handler = completion;
    this.headerBuffer = headerBuffer;
    this.payload = payload;
    this.mask = mask;
    this.outputBuffer = outputBuffer;
    this.flushRequired = flushRequired;
    this.endpoint = endpoint;
}
 
Example #27
Source File: WsRemoteEndpointImplServer.java    From tomcatsrc with Apache License 2.0 5 votes vote down vote up
@Override
protected void doWrite(SendHandler handler, ByteBuffer... buffers) {
    this.handler = handler;
    this.buffers = buffers;
    // This is definitely the same thread that triggered the write so a
    // dispatch will be required.
    onWritePossible(true);
}
 
Example #28
Source File: WsRemoteEndpointImplServer.java    From tomcatsrc with Apache License 2.0 5 votes vote down vote up
/**
 *
 * @param t             The throwable associated with any error that
 *                      occurred
 * @param useDispatch   Should {@link SendHandler#onResult(SendResult)} be
 *                      called from a new thread, keeping in mind the
 *                      requirements of
 *                      {@link javax.websocket.RemoteEndpoint.Async}
 */
private void clearHandler(Throwable t, boolean useDispatch) {
    // Setting the result marks this (partial) message as
    // complete which means the next one may be sent which
    // could update the value of the handler. Therefore, keep a
    // local copy before signalling the end of the (partial)
    // message.
    SendHandler sh = handler;
    handler = null;
    buffers = null;
    if (sh != null) {
        if (useDispatch) {
            OnResultRunnable r = onResultRunnables.poll();
            if (r == null) {
                r = new OnResultRunnable(onResultRunnables);
            }
            r.init(sh, t);
            if (executorService == null || executorService.isShutdown()) {
                // Can't use the executor so call the runnable directly.
                // This may not be strictly specification compliant in all
                // cases but during shutdown only close messages are going
                // to be sent so there should not be the issue of nested
                // calls leading to stack overflow as described in bug
                // 55715. The issues with nested calls was the reason for
                // the separate thread requirement in the specification.
                r.run();
            } else {
                executorService.execute(r);
            }
        } else {
            if (t == null) {
                sh.onResult(new SendResult());
            } else {
                sh.onResult(new SendResult(t));
            }
        }
    }
}
 
Example #29
Source File: MessagePart.java    From tomcatsrc with Apache License 2.0 5 votes vote down vote up
public MessagePart( boolean fin, int rsv, byte opCode, ByteBuffer payload,
        SendHandler intermediateHandler, SendHandler endHandler) {
    this.fin = fin;
    this.rsv = rsv;
    this.opCode = opCode;
    this.payload = payload;
    this.intermediateHandler = intermediateHandler;
    this.endHandler = endHandler;
}
 
Example #30
Source File: WsRemoteEndpointImplBase.java    From Tomcat8-Source-Read with MIT License 5 votes vote down vote up
public void sendBytesByCompletion(ByteBuffer data, SendHandler handler) {
    if (data == null) {
        throw new IllegalArgumentException(sm.getString("wsRemoteEndpoint.nullData"));
    }
    if (handler == null) {
        throw new IllegalArgumentException(sm.getString("wsRemoteEndpoint.nullHandler"));
    }
    StateUpdateSendHandler sush = new StateUpdateSendHandler(handler, stateMachine);
    stateMachine.binaryStart();
    startMessage(Constants.OPCODE_BINARY, data, true, sush);
}