@Override public void run() { Message msg = decode(envelope.msg.getProtocol(), payload, Message.class); msg.getTrace().setLevel(envelope.msg.getTrace().getLevel()); msg.setRoute(envelope.msg.getRoute()).getRoute().removeHop(0); msg.setRetryEnabled(envelope.msg.getRetryEnabled()); msg.setRetry(envelope.msg.getRetry()); msg.setTimeRemaining(envelope.msg.getTimeRemainingNow()); msg.pushHandler(new ReplyHandler() { @Override public void handleReply(Reply reply) { new ReplyEnvelope(LocalNetwork.this, envelope, reply).send(); } }); owner.deliverMessage(msg, LocalServiceAddress.class.cast(envelope.recipient.getServiceAddress()) .getSessionName()); } });
/** * Schedules the given node for resending, if enabled. This will invoke {@link com.yahoo.messagebus.routing.RoutingNode#prepareForRetry()} * if the node was queued. This method is NOT thread-safe, and should only be called by the messenger thread. * * @param node The node to resend. * @return True if the node was queued. */ public boolean scheduleRetry(RoutingNode node) { Message msg = node.getMessage(); if (!msg.getRetryEnabled()) { return false; } int retry = msg.getRetry() + 1; double delay = node.getReply().getRetryDelay(); if (delay < 0) { delay = retryPolicy.getRetryDelay(retry); } if (msg.getTimeRemainingNow() * 0.001 - delay <= 0) { node.addError(ErrorCode.TIMEOUT, "Timeout exceeded by resender, giving up."); return false; } node.prepareForRetry(); // consumes the reply node.getTrace().trace(TraceLevel.COMPONENT, "Message scheduled for retry " + retry + " in " + delay + " seconds."); msg.setRetry(retry); queue.add(new Entry(node, SystemTimer.INSTANCE.milliTime() + (long)(delay * 1000))); return true; }
msg.pushHandler(this); msg.setRetryEnabled(p.retryEnabled); msg.setRetry(p.retry); msg.setTimeReceivedNow(); msg.setTimeRemaining(p.timeRemaining);