package com.meidusa.amoeba.manager.client; import java.util.HashMap; import java.util.Map; import com.meidusa.amoeba.manager.net.packet.ManagerAbstractPacket; import com.meidusa.amoeba.manager.net.packet.ObjectPacket; import com.meidusa.amoeba.manager.net.packet.PingPacket; import com.meidusa.amoeba.manager.net.packet.PongPacket; import com.meidusa.amoeba.net.Connection; import com.meidusa.amoeba.net.MessageHandler; public class RemoteConfigMessageHandler implements MessageHandler, CallbackHandler<ManagerAbstractPacket> { private Map<Integer, CallbackHandler<ManagerAbstractPacket>> callbackHandlerMap = new HashMap<Integer, CallbackHandler<ManagerAbstractPacket>>(); public RemoteConfigMessageHandler() { this.registerCallBack(ManagerAbstractPacket.FUN_TYPE_PING, this); } @Override public void handleMessage(Connection conn) { byte[] message = null; while ((message = conn.getInQueue().getNonBlocking()) != null) { byte type = message[4]; ManagerAbstractPacket packet = null; switch (type) { case ManagerAbstractPacket.FUN_TYPE_PING: packet = new PingPacket(); break; case ManagerAbstractPacket.FUN_TYPE_PONG: packet = new PongPacket(); break; case ManagerAbstractPacket.FUN_TYPE_DBSERVER_ADD: case ManagerAbstractPacket.FUN_TYPE_DBSERVER_DELETE: case ManagerAbstractPacket.FUN_TYPE_DBSERVER_DSIABLE: case ManagerAbstractPacket.FUN_TYPE_DBSERVER_ENABLE: case ManagerAbstractPacket.FUN_TYPE_DBSERVER_UPDATE: case ManagerAbstractPacket.FUN_TYPE_AMOEBA_SHUTDOWN: case ManagerAbstractPacket.FUN_TYPE_AMOEBA_RELOAD: case ManagerAbstractPacket.FUN_TYPE_RULE_UPDATE: case ManagerAbstractPacket.FUN_TYPE_RULE_ADD: case ManagerAbstractPacket.FUN_TYPE_RULE_DELETE: packet = new ObjectPacket(); break; } if(packet != null){ packet.init(message, conn); CallbackHandler<ManagerAbstractPacket> handler = callbackHandlerMap.get(packet.funType); handler.doCallBack(conn,packet); } } } public void registerCallBack(int type, CallbackHandler<ManagerAbstractPacket> handler) { callbackHandlerMap.put(type, handler); } public void removeCallBack( CallbackHandler<? extends ManagerAbstractPacket> handler) { for (Map.Entry<Integer, CallbackHandler<ManagerAbstractPacket>> entry : callbackHandlerMap .entrySet()) { if (entry.getValue() == handler) { callbackHandlerMap.remove(entry.getKey()); return; } } } public void removeCallBack(int type) { callbackHandlerMap.remove(type); } /** * RemoteConfigMessageHandler ֻ����ping /pong */ @Override public void doCallBack(Connection conn, ManagerAbstractPacket packet) { if(packet.funType == ManagerAbstractPacket.FUN_TYPE_PING){ conn.postMessage(new PongPacket().toByteBuffer(conn)); } } }