我现在的项目设计是,struts1。x交给spring管理,前台有一个Ajax轮询,每一分钟请求一次(dpnm.do),在action中调用了数据获取的类,这个类里有一个List成员变量,每次的Ajax结果会放到这个list里面,然后将这个list转换为json返回给客户端,客户端用flash显示这条曲线,现在的问题是:
1.将spring的scope设置成prototype的话,每次都去new一个action,一是太浪费了,二来List的数据没法获取(除非使用static的List,那这样多线程就更麻烦了)
2.如果使用action的单粒,在多线程的情况下,List数据有线程安全问题
下面给一些代码:
Action的代码,Ajax请求就是调用这个Action
//该成员变量中有一个成员变量List private PowerManager manager; @Override public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { String nodeIP = request.getParameter("nodeIP"); response.getWriter().write(manager.getNodePowerStats(nodeIP)); return null; } public void setManager(PowerManager manager) { this.manager = manager; }
|
真正的业务类
//成员变量数组 List nodePowerStats = new ArrayList(); public String formatNodePowerResponse(String response,String nodeIp) throws JSONException{ //省略部分代码.................. //返回json return new JSONObject().put("nodePowerStat",nodePowerStats).toString();
|
我现在能想到避免多线程的方法是讲数据放到前端,由浏览器来负责,我不知道有谁有什么好的办法,在后台实现了!谢谢