package com.meidusa.amoeba.gateway.benchmark; import java.util.HashMap; import java.util.Map; import java.util.Properties; import java.util.concurrent.CountDownLatch; import org.apache.log4j.Logger; import com.meidusa.amoeba.benchmark.AbstractBenchmarkClient; import com.meidusa.amoeba.benchmark.AbstractBenchmark.TaskRunnable; import com.meidusa.amoeba.config.ConfigUtil; import com.meidusa.amoeba.config.ParameterMapping; import com.meidusa.amoeba.gateway.packet.AbstractGatewayPacket; import com.meidusa.amoeba.gateway.packet.GatewayPacketConstant; import com.meidusa.amoeba.gateway.packet.GatewayPingPacket; import com.meidusa.amoeba.gateway.packet.GatewayPongPacket; import com.meidusa.amoeba.gateway.packet.GatewayRequestPacket; import com.meidusa.amoeba.gateway.packet.GatewayResponsePacket; import com.meidusa.amoeba.net.Connection; import com.meidusa.amoeba.net.packet.AbstractPacket; import com.meidusa.amoeba.util.StringUtil; /** * * @author Struct * */ public class GatewayBenchmarkClient extends AbstractBenchmarkClient<AbstractGatewayPacket> { private static Logger logger = Logger.getLogger(GatewayBenchmarkClient.class); public GatewayBenchmarkClient(Connection connection,CountDownLatch requestLatcher,CountDownLatch responseLatcher,TaskRunnable task) { super(connection,requestLatcher,responseLatcher,task); } public boolean needPing(long now) { return false; } public AbstractGatewayPacket decodeRecievedPacket(byte[] message) { int type = AbstractGatewayPacket.getType(message); AbstractGatewayPacket packet = null; switch(type){ case GatewayPacketConstant.PACKET_TYPE_PING: packet = new GatewayPingPacket(); break; case GatewayPacketConstant.PACKET_TYPE_PONG: packet = new GatewayPongPacket(); break; case GatewayPacketConstant.PACKET_TYPE_SERVICE_REQUEST: packet = new GatewayRequestPacket(); break; case GatewayPacketConstant.PACKET_TYPE_SERVICE_RESPONSE: packet = new GatewayResponsePacket(); break; default: logger.error("error type="+type+"\r\n"+StringUtil.dumpAsHex(message, message.length)); } packet.init(message, this.getConnection()); return packet; } final Map<String ,String > parameterMap = new HashMap<String,String>(); final Map<String ,Object > beanParameterMap = new HashMap<String,Object>(); public AbstractGatewayPacket createRequestPacket() { Properties properties = this.getRequestProperties(); AbstractGatewayPacket packet = null; try { packet = (AbstractGatewayPacket)Class.forName((String)properties.get("class")).newInstance(); } catch (Exception e) { e.printStackTrace(); System.exit(-1); } Map<String,Object> map = this.getNextRequestContextMap(); ParameterMapping.mappingObjectField(packet, beanParameterMap,map,this, AbstractPacket.class); if(packet instanceof GatewayRequestPacket){ Map<String ,String > _parameterMap_ = new HashMap<String,String>(); for(Map.Entry<String, String> entry : parameterMap.entrySet()){ String value = ConfigUtil.filterWtihOGNL(entry.getValue(), map,this); _parameterMap_.put(entry.getKey(), value); } GatewayRequestPacket request = (GatewayRequestPacket)packet; request.parameterMap = _parameterMap_; } return packet; } public void init(){ super.init(); Properties properties = this.getRequestProperties(); for(Map.Entry<Object,Object> entry : properties.entrySet()){ if(entry.getKey().toString().startsWith("parameterMap.")){ parameterMap.put(entry.getKey().toString().substring("parameterMap.".length()), entry.getValue().toString()); }else{ beanParameterMap.put(entry.getKey().toString(), entry.getValue()); } } } @Override public void startBenchmark() { AbstractGatewayPacket packet = this.createRequestPacket(); getConnection().postMessage(packet.toByteBuffer(this.getConnection())); } }