用prop來存放對象供多線程共用
-
在用jmeter打壓力時,由于是做rpc調用的請求,用beanshell sampler來發送請求,腳本如下
import com.netease.love.timeline.ITimelineProtocol; import com.netease.tinyrpc.MultiNodeRpcProxyFactory; import com.netease.tinyrpc.locator.FixedModHashLocator; factory = new MultiNodeRpcProxyFactory(); proxies = factory.createProxy("114.113.201.07:29011,114.113.201.09:29011,114.113.201.10:29011", ITimelineProtocol.class, FixedModHashLocator.class); try { //proxies.deleteDirectMessage(-1264136337218617121L, 9223219345691512173L, 1551505303962223348L, false); proxies.deleteDirectMessage(Long.parseLong(vars.get("userId")), Long.parseLong(vars.get("sessionId")), Long.parseLong(vars.get("messageId")), false); // return vars.get("userId")+ vars.get("sessionId") + vars.get("messageId"); } catch (Exception e) { System.out.println("error"); return "false"; } System.out.println("done"); return "true";
用該腳本做調試請求,一切正常,不過有個很明顯的問題:每個請求都會new一個proxy,費時費資源。嘗試著用來跑了2000個請求,便OOM了。
-
解決方案:用單例來存放proxies對象,如下(非嚴格的單例):
import com.netease.love.timeline.ITimelineProtocol; import com.netease.tinyrpc.MultiNodeRpcProxyFactory; import com.netease.tinyrpc.locator.FixedModHashLocator; ITimelineProtocol proxies = props.get("proxies"); if(proxies == null) { factory = new MultiNodeRpcProxyFactory(); proxies = factory.createProxy("114.113.201.07:29011,114.113.201.09:29011,114.113.201.10:29011", ITimelineProtocol.class, FixedModHashLocator.class); props.put("proxies", proxies); } //System.out.println("null=" + (proxies == null)); //System.out.println("begin"); //ITimelineProtocol proxies = factory.createProxy("114.113.201.07:29011,114.113.201.09:29011,114.113.201.10:29011", ITimelineProtocol.class, FixedModHashLocator.class); try { //-1264136337218617121 9223219345691512173 1551505303962223348 //proxies.deleteDirectMessage(-1264136337218617121L, 9223219345691512173L, 1551505303962223348L, false); proxies.deleteDirectMessage(Long.parseLong(vars.get("userId")), Long.parseLong(vars.get("sessionId")), Long.parseLong(vars.get("messageId")), false); // return vars.get("userId")+ vars.get("sessionId") + vars.get("messageId"); } catch (Exception e) { System.out.println("error"); return "false"; } System.out.println("done"); return "true";
再次打壓,不再OOM。