public boolean dispatchTimeout(long millis) { return dispatch(new TimeoutEvent(request, millis)); }
@Override public boolean cancel() { // Try to dispatch a CancelledEvent. return dispatchCancelled(); }
@Override public void onError(TransportMessage message, Exception e) { if (message == null) return; AsyncToken token = tokensMap.remove(message.getId()); if (token == null) return; token.dispatchFailure(e); if (timer != null) timer.purge(); // Must purge to cleanup timer references to AsyncToken }
@Override protected TransportMessage createTransportMessage(AsyncToken token) throws UnsupportedEncodingException { Message[] messages = convertToAmf(token.getRequest()); return new DefaultTransportMessage<Message[]>(token.getId(), false, token.isDisconnectRequest(), clientId, sessionId, messages, codec); }
@Override protected TransportMessage createTransportMessage(AsyncToken token) throws UnsupportedEncodingException { Message[] messages = convertToAmf(token.getRequest()); return new DefaultTransportMessage<Message[]>(token.getId(), false, clientId, sessionId, messages, codec); }
try { if (!connections.tryAcquire(token.getRequest().getRemainingTimeToLive(), TimeUnit.MILLISECONDS)) { token.dispatchTimeout(System.currentTimeMillis()); return false; if (token.isDone()) return false; token.getRequest().setClientId(clientId); if (tokensMap.putIfAbsent(token.getId(), token) != null) throw new RuntimeException("MessageId isn't unique: " + token.getId()); ResponseListener channelListener = new ChannelResponseListener(token.getId(), tokensMap, transportFuture, connections); Event tokenEvent = token.setChannelListener(channelListener); if (tokenEvent != null) ResponseListenerDispatcher.dispatch(channelListener, tokenEvent); tokensMap.remove(token.getId()); token.dispatchFailure(e); if (timer != null)
request.setTimestamp(dependentToken.getRequest().getTimestamp()); request.setTimeToLive(dependentToken.getRequest().getTimeToLive()); AsyncToken blockingToken = new AsyncToken(request); try { timer.schedule(blockingToken, blockingToken.getRequest().getRemainingTimeToLive()); dependentToken.dispatchTimeout(System.currentTimeMillis()); return null; dependentToken.dispatchFailure(e); return null; dependentToken.dispatchFailure(e); return null; ResponseMessage response = blockingToken.get(); FaultMessage faultMessage = (FaultMessage)response.copy(dependentToken.getRequest().getId()); if (dependentToken.getRequest() instanceof MessageChain) { ResponseMessage nextResponse = faultMessage; for (MessageChain<?> nextRequest = ((MessageChain<?>)dependentToken.getRequest()).getNext(); nextRequest != null; nextRequest = nextRequest.getNext()) { nextResponse.setNext(response.copy(nextRequest.getId())); nextResponse = nextResponse.getNext(); dependentToken.dispatchFault(faultMessage); dependentToken.dispatchFailure(e);
token.dispatchResult((ResultMessage)response); break; case FAULT: token.dispatchFault((FaultMessage)response); break; default: token.dispatchFailure(new RuntimeException("Unknown message type: " + response)); break; token.dispatchFailure(e);
@Override public ResponseMessageFuture send(RequestMessage request, ResponseListener... listeners) { if (request == null) throw new NullPointerException("request cannot be null"); if (!start()) throw new RuntimeException("Channel not started"); AsyncToken token = new AsyncToken(request, listeners); request.setTimestamp(System.currentTimeMillis()); if (request.getTimeToLive() <= 0L) request.setTimeToLive(defaultTimeToLive); try { timer.schedule(token, request.getRemainingTimeToLive()); tokensQueue.add(token); } catch (Exception e) { log.error(e, "Could not add token to queue: %s", token); token.dispatchFailure(e); return new ImmediateFailureResponseMessageFuture(e); } return token; }
@Override public void onDisconnect() { log.info("Disconnecting channel %s", clientId); tokensMap.clear(); tokensQueue.clear(); if (timer != null) timer.purge(); // Must purge to cleanup timer references to AsyncToken if (disconnectToken != null) { // Handle "hard" disconnect ResultMessage resultMessage = new ResultMessage(clientId, disconnectToken.getRequest().getId(), true); disconnectToken.dispatchResult(resultMessage); disconnectToken = null; } clientId = null; pinged = false; authenticating = false; authenticated = false; }
@Override public void run() { // Try to dispatch a TimeoutEvent. dispatchTimeout(System.currentTimeMillis()); }
protected RequestMessage getRequest(String id) { AsyncToken token = tokensMap.get(id); return (token != null ? token.getRequest() : null); }
@Override public ResponseMessage get() throws InterruptedException, ExecutionException, TimeoutException { return get(0); }
try { if (!connections.tryAcquire(token.getRequest().getRemainingTimeToLive(), TimeUnit.MILLISECONDS)) { token.dispatchTimeout(System.currentTimeMillis()); return false; if (token.isDone()) return false; token.getRequest().setClientId(clientId); if (token.getRequest() instanceof DisconnectMessage) { if (tokensMap.putIfAbsent(token.getId(), token) != null) throw new RuntimeException("MessageId isn't unique: " + token.getId()); ResponseListener channelListener = new ChannelResponseListener(token.getId(), tokensMap, transportFuture, connections); Event tokenEvent = token.setChannelListener(channelListener); if (tokenEvent != null) ResponseListenerDispatcher.dispatch(channelListener, tokenEvent); tokensMap.remove(token.getId()); token.dispatchFailure(e); if (timer != null)
request.setTimestamp(dependentToken.getRequest().getTimestamp()); request.setTimeToLive(dependentToken.getRequest().getTimeToLive()); AsyncToken blockingToken = new AsyncToken(request); try { timer.schedule(blockingToken, blockingToken.getRequest().getRemainingTimeToLive()); dependentToken.dispatchTimeout(System.currentTimeMillis()); return null; dependentToken.dispatchFailure(e); return null; dependentToken.dispatchFailure(e); return null; ResponseMessage response = blockingToken.get(); FaultMessage faultMessage = (FaultMessage)response.copy(dependentToken.getRequest().getId()); if (dependentToken.getRequest() instanceof MessageChain) { ResponseMessage nextResponse = faultMessage; for (MessageChain<?> nextRequest = ((MessageChain<?>)dependentToken.getRequest()).getNext(); nextRequest != null; nextRequest = nextRequest.getNext()) { nextResponse.setNext(response.copy(nextRequest.getId())); nextResponse = nextResponse.getNext(); dependentToken.dispatchFault(faultMessage); dependentToken.dispatchFailure(e);
@Override protected TransportMessage createTransportMessage(AsyncToken token) throws UnsupportedEncodingException { Message[] messages = convertToAmf(token.getRequest()); return new DefaultTransportMessage<Message[]>(token.getId(), false, token.isDisconnectRequest(), clientId, sessionId, messages, codec); }
token.dispatchResult((ResultMessage)response); break; case FAULT: token.dispatchFault((FaultMessage)response); break; default: token.dispatchFailure(new RuntimeException("Unknown message type: " + response)); break; token.dispatchFailure(e);
@Override protected TransportMessage createTransportMessage(AsyncToken token) throws UnsupportedEncodingException { AMF0Message amf0Message = new AMF0Message(); for (Message message : convertToAmf(token.getRequest())) { AMF0Body body = new AMF0Body("", "/" + (index++), new Object[]{message}, AMF0Body.DATA_TYPE_AMF3_OBJECT); amf0Message.addBody(body); } return new DefaultTransportMessage<AMF0Message>(token.getId(), false, clientId, null, amf0Message, codec); }
@Override public ResponseMessageFuture send(RequestMessage request, ResponseListener... listeners) { if (request == null) throw new NullPointerException("request cannot be null"); if (!start()) throw new RuntimeException("Channel not started"); AsyncToken token = new AsyncToken(request, listeners); request.setTimestamp(System.currentTimeMillis()); if (request.getTimeToLive() <= 0L) request.setTimeToLive(defaultTimeToLive); try { timer.schedule(token, request.getRemainingTimeToLive()); tokensQueue.add(token); } catch (Exception e) { log.error(e, "Could not add token to queue: %s", token); token.dispatchFailure(e); return new ImmediateFailureResponseMessageFuture(e); } return token; }
@Override public void onDisconnect() { log.info("Disconnecting channel %s", clientId); tokensMap.clear(); tokensQueue.clear(); if (timer != null) timer.purge(); // Must purge to cleanup timer references to AsyncToken if (disconnectToken != null) { // Handle "hard" disconnect ResultMessage resultMessage = new ResultMessage(clientId, disconnectToken.getRequest().getId(), true); disconnectToken.dispatchResult(resultMessage); disconnectToken = null; } clientId = null; pinged = false; authenticating = false; authenticated = false; }