package io.craft.atom.rpc; import io.craft.atom.protocol.rpc.model.RpcMessage; import io.craft.atom.rpc.api.RpcContext; import io.craft.atom.rpc.spi.RpcConnector; import lombok.Getter; import lombok.Setter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * @author mindwind * @version 1.0, Aug 21, 2014 */ public class DefaultRpcClientInvoker extends AbstractRpcInvoker { private static final Logger LOG = LoggerFactory.getLogger(DefaultRpcClientInvoker.class); @Getter @Setter private RpcConnector connector; @Override public RpcMessage invoke(RpcMessage req) throws RpcException { try { RpcContext ctx = RpcContext.getContext(); req.setRpcTimeoutInMillis(rpcTimeoutInMillis(ctx)); req.setOneway(ctx.isOneway()); req.setAttachments(ctx.getAttachments()); req.setRpcId(ctx.getRpcId()); boolean async = ctx.isAsync(); LOG.debug("[CRAFT-ATOM-RPC] Rpc client invoker is invoking, |req={}, async={}|", req, async); return connector.send(req, async); } finally { RpcContext.removeContext(); } } private int rpcTimeoutInMillis(RpcContext ctx) { // Get timeout with this invocation from RpcContext int timeout = ctx.getRpcTimeoutInMillis(); if (timeout > 0) return timeout; // if does not set timeout for this invocation, get global setting. timeout = connector.getRpcTimeoutInMillis(); if (timeout > 0) return timeout; // default timeout = Integer.MAX_VALUE; return timeout; } }