package io.craft.atom.rpc; import io.craft.atom.io.Channel; import io.craft.atom.protocol.rpc.model.RpcMessage; import java.nio.channels.ClosedChannelException; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * @author mindwind * @version 1.0, Aug 15, 2014 */ public class RpcClientIoHandler extends RpcIoHandler { private static final Logger LOG = LoggerFactory.getLogger(RpcClientIoHandler.class); private DefaultRpcConnector connector; // ~ ------------------------------------------------------------------------------------------------------------- public RpcClientIoHandler(DefaultRpcConnector connector) { this.connector = connector; } // ~ ------------------------------------------------------------------------------------------------------------- @Override public void channelRead(Channel<byte[]> channel, byte[] bytes) { DefaultRpcChannel rpcChannel = (DefaultRpcChannel) channel.getAttribute(RpcIoHandler.RPC_CHANNEL); List<RpcMessage> rsps = rpcChannel.read(bytes); for (RpcMessage rsp : rsps) { rpcChannel.notifyRpcMessage(rsp); } } @Override public void channelClosed(Channel<byte[]> channel) { LOG.debug("[CRAFT-ATOM-RPC] Channel closed, |channel={}|", channel); channelThrown0(channel, new ClosedChannelException()); connector.reconnect(channel.getId()); } @Override public void channelThrown(Channel<byte[]> channel, Exception cause) { LOG.warn("[CRAFT-ATOM-RPC] Channel thrown, |channel={}|", channel, cause); channelThrown0(channel, cause); channel.close(); } private void channelThrown0(Channel<byte[]> channel, Exception cause) { DefaultRpcChannel rpcChannel = (DefaultRpcChannel) channel.getAttribute(RpcIoHandler.RPC_CHANNEL); rpcChannel.notifyRpcException(cause); } }