package io.craft.atom.rpc;
import io.craft.atom.io.Channel;
import io.craft.atom.protocol.rpc.model.RpcMessage;
import io.craft.atom.rpc.spi.RpcProcessor;
import io.craft.atom.rpc.spi.RpcProtocol;
import java.net.InetSocketAddress;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @author mindwind
* @version 1.0, Aug 7, 2014
*/
public class RpcServerIoHandler extends RpcIoHandler {
private static final Logger LOG = LoggerFactory.getLogger(RpcServerIoHandler.class);
private RpcProtocol protocol ;
private RpcProcessor processor;
// ~ -------------------------------------------------------------------------------------------------------------
public RpcServerIoHandler(RpcProtocol protocol, RpcProcessor processor) {
this.protocol = protocol;
this.processor = processor;
}
// ~ -------------------------------------------------------------------------------------------------------------
@Override
public void channelOpened(Channel<byte[]> channel) {
DefaultRpcChannel rpcChannel = new DefaultRpcChannel(channel, protocol.getRpcEncoder(), protocol.getRpcDecoder());
channel.setAttribute(RpcIoHandler.RPC_CHANNEL, rpcChannel);
}
@Override
public void channelRead(Channel<byte[]> channel, byte[] bytes) {
DefaultRpcChannel rpcChannel = (DefaultRpcChannel) channel.getAttribute(RpcIoHandler.RPC_CHANNEL);
List<RpcMessage> reqs = rpcChannel.read(bytes);
for (RpcMessage req : reqs) {
req.setServerAddress((InetSocketAddress) channel.getLocalAddress());
req.setClientAddress((InetSocketAddress) channel.getRemoteAddress());
processor.process(req, rpcChannel);
}
}
@Override
public void channelIdle(Channel<byte[]> channel) {
channel.close();
}
@Override
public void channelThrown(Channel<byte[]> channel, Exception cause) {
LOG.warn("[CRAFT-ATOM-RPC] Channel thrown, |channel={}|", channel, cause);
channel.close();
}
@Override
public void channelClosed(Channel<byte[]> channel) {
LOG.debug("[CRAFT-ATOM-RPC] Channel closed, |channel={}|", channel);
}
}