用prop來存放對象供多線程共用
-
在用jmeter打壓力時(shí),由于是做rpc調(diào)用的請求,用beanshell sampler來發(fā)送請求,腳本如下
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"; 用該腳本做調(diào)試請求,一切正常,不過有個(gè)很明顯的問題:每個(gè)請求都會new一個(gè)proxy,費(fèi)時(shí)費(fèi)資源。嘗試著用來跑了2000個(gè)請求,便OOM了。
-
解決方案:用單例來存放proxies對象,如下(非嚴(yán)格的單例):
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。