private void receiveLater(MessageEnvelope envelope) { byte[] payload = envelope.sender.encode(envelope.msg.getProtocol(), envelope.msg); executor.execute(new Runnable() { @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()); } }); }
/** * This method is a callback invoked after {@link #send(Message, List)} once the version of all recipients have been * resolved. If all versions were resolved ahead of time, this method is invoked by the same thread as the former. * If not, this method is invoked by the network thread during the version callback. * * @param ctx All the required send-data. */ private void send(SendContext ctx) { if (destroyed.get()) { replyError(ctx, ErrorCode.NETWORK_SHUTDOWN, "Network layer has performed shutdown."); } else if (ctx.hasError) { replyError(ctx, ErrorCode.HANDSHAKE_FAILED, String.format("An error occurred while resolving version of recipient(s) [%s] from host '%s'.", buildRecipientListString(ctx), identity.getHostname())); } else { executor.execute(new SendTask(owner.getProtocol(ctx.msg.getProtocol()), ctx)); } }
"Protocol '" + ctx.msg.getProtocol() + "' failed to encode message."); return;
RoutingTable table = mbus.getRoutingTable(msg.getProtocol().toString()); if (table != null) { Route route = table.getRoute(routeName); } else if (!parseIfNotFound) { return new Result(ErrorCode.ILLEGAL_ROUTE, "Route '" + routeName + "' not found for protocol '" + msg.getProtocol() + "'."); "Protocol '" + msg.getProtocol() + "' has no routing table.");
/** * This method checks to see whether the string representation of the current hop is actually the name of another. * If a hop is found, the first hop of the current route is replaced by this. * * @return True if a hop was found and added. */ private boolean lookupHop() { RoutingTable table = mbus.getRoutingTable(msg.getProtocol()); if (table != null) { String name = route.getHop(0).getServiceName(); if (table.hasHop(name)) { HopBlueprint hop = table.getHop(name); configureFromBlueprint(hop); if (trace.shouldTrace(TraceLevel.SPLIT_MERGE)) { trace.trace(TraceLevel.SPLIT_MERGE, "Recognized '" + name + "' as " + hop + "."); } return true; } } return false; }
@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()); } });
policy = mbus.getRoutingPolicy(msg.getProtocol(), dir.getName(), dir.getParam()); if (policy == null) { setError(ErrorCode.UNKNOWN_POLICY, "Protocol '" + msg.getProtocol() + "' could not create routing policy '" + dir.getName() + "' with parameter '" + dir.getParam() + "'."); return false;
@Override protected Request encodeRequest(Version version, Route route, RPCServiceAddress address, Message msg, long timeRemaining, byte[] payload, int traceLevel) { Request req = new Request(METHOD_NAME); Values v = req.parameters(); v.add(new StringValue(version.toString())); v.add(new StringValue(route.toString())); v.add(new StringValue(address.getSessionName())); v.add(new Int8Value(msg.getRetryEnabled() ? (byte)1 : (byte)0)); v.add(new Int32Value(msg.getRetry())); v.add(new Int64Value(timeRemaining)); v.add(new StringValue(msg.getProtocol())); v.add(new DataValue(payload)); v.add(new Int32Value(traceLevel)); return req; }
RoutingTable table = mbus.getRoutingTable(msg.getProtocol()); Hop hop = route.getHop(0); if (hop.getDirective(0) instanceof RouteDirective) {
@Override protected Request encodeRequest(Version version, Route route, RPCServiceAddress address, Message msg, long timeRemaining, byte[] payload, int traceLevel) { Request req = new Request(METHOD_NAME); Values v = req.parameters(); v.add(new Int8Value(CompressionType.NONE.getCode())); v.add(new Int32Value(0)); v.add(new DataValue(new byte[0])); Slime slime = new Slime(); Cursor root = slime.setObject(); root.setString(VERSION_F, version.toString()); root.setString(ROUTE_F, route.toString()); root.setString(SESSION_F, address.getSessionName()); root.setString(PROTOCOL_F, msg.getProtocol().toString()); root.setBool(USERETRY_F, msg.getRetryEnabled()); root.setLong(RETRY_F, msg.getRetry()); root.setLong(TIMEREMAINING_F, msg.getTimeRemaining()); root.setLong(TRACELEVEL_F, traceLevel); root.setData(BLOB_F, payload); byte[] serializedSlime = BinaryFormat.encode(slime); Compressor.Compression compressionResult = compressor.compress(serializedSlime); v.add(new Int8Value(compressionResult.type().getCode())); v.add(new Int32Value(compressionResult.uncompressedSize())); v.add(new DataValue(compressionResult.data())); return req; }