package io.craft.atom.rpc; import io.craft.atom.rpc.api.RpcClient; import io.craft.atom.rpc.api.RpcClientX; import io.craft.atom.rpc.spi.RpcConnector; import io.craft.atom.rpc.spi.RpcInvoker; import io.craft.atom.rpc.spi.RpcProtocol; import io.craft.atom.rpc.spi.RpcProxyFactory; import java.net.InetSocketAddress; import lombok.Getter; import lombok.Setter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * @author mindwind * @version 1.0, Aug 14, 2014 */ public class DefaultRpcClient implements RpcClient { private static final Logger LOG = LoggerFactory.getLogger(DefaultRpcClient.class); @Getter @Setter private String host ; @Getter @Setter private int port ; @Getter @Setter private int connections ; @Getter @Setter private int heartbeatInMillis ; @Getter @Setter private int connectTimeoutInMillis; @Getter @Setter private int rpcTimeoutInMillis ; @Getter @Setter private RpcConnector connector ; @Getter @Setter private RpcProtocol protocol ; @Getter @Setter private RpcProxyFactory proxyFactory ; @Getter @Setter private RpcInvoker invoker ; // ~ ------------------------------------------------------------------------------------------------------------- public DefaultRpcClient() { connector = new DefaultRpcConnector() ; protocol = new DefaultRpcProtocol() ; proxyFactory = new DefaultRpcProxyFactory() ; invoker = new DefaultRpcClientInvoker(); connectTimeoutInMillis = Integer.MAX_VALUE ; rpcTimeoutInMillis = Integer.MAX_VALUE ; connections = 1 ; } public void init() { connector .setProtocol(protocol); connector .setAddress(new InetSocketAddress(host, port)); connector .setHeartbeatInMillis(heartbeatInMillis); connector .setConnectTimeoutInMillis(connectTimeoutInMillis); connector .setRpcTimeoutInMillis(rpcTimeoutInMillis); invoker .setConnector(connector); proxyFactory.setInvoker(invoker); LOG.debug("[CRAFT-ATOM-RPC] Rpc client init complete."); } // ~ ------------------------------------------------------------------------------------------------------------- @Override public <T> T refer(Class<T> rpcInterface) { return proxyFactory.getProxy(rpcInterface); } @Override public void open() throws RpcException { if (connections < 1) throw new IllegalStateException("Client connections configuration should >= 1"); for (int i = 0; i < connections; i++) { connector.connect(); } LOG.debug("[CRAFT-ATOM-RPC] Rpc client open."); } @Override public void close() { connector.close(); LOG.debug("[CRAFT-ATOM-RPC] Rpc client closed."); } @Override public RpcClientX x() { DefaultRpcClientX x = new DefaultRpcClientX(); x.setWaitCount(connector.waitCount()); return x; } }