業界ソフトウェアにおけるマルチスレッドプログラミングの検討



ネットワークに接続されていない*****システムなど、ビジネス環境によく遭遇するソリューションを考えてみましょう.
 
  • データは地級市(例えば寧波、杭州、温州など)に集中的に配置され、各地級市のデータは
  • ネットワークに接続されていない.
    業務目標:全国範囲の検索条件を満たすデータ記録を検索する
    ソリューション:Webサービスを中心とした地域レベルのクエリー・インタフェースを使用して、マルチスレッド・クエリーを開始し、クエリーの結果を非同期で表示
    開発手順:
  • 非同期Webサービスを使用する場合、Axis 2を使用できます.コアコードは次のとおりです.
  • QName qname = new QName(namespace, operateName);
    		RPCServiceClient client = new RPCServiceClient();
    		Options options = new Options();
    		options.setTo(new EndpointReference(srvcUrl));
    		options.setAction("urn:" + operateName);
    		client.setOptions(options);
    		client.invokeNonBlocking(qname, param, new AxisCallback() {
    				public void onMessage(MessageContext mc)              {
    						//      
    					}
    					public void onFault(MessageContext messageContext) {
    					}
    					public void onError(Exception e) {
    						e.printStackTrace();
    					}
    					public void onComplete() {
    					}
    		});
  • スレッドプールを使用してマルチスレッドを管理する方法.コアコードは以下の通りである:
  • public List invokeAll(List<TraversalProvince> tasks, long timeout) {
            List nodes = new ArrayList(tasks.size());
            try {
                List<Future<CityResult>> futures = null;
                if (timeout < 0) {
                    futures = executorService.invokeAll(tasks);
                } else {
                    futures = executorService.invokeAll(tasks, timeout, TimeUnit.MILLISECONDS);
                }
                for (Future future : futures) {
                    try {
                        nodes.add(future.get());
                    } catch (ExecutionException e) {
                        e.printStackTrace();
                    }
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return nodes;
        }
     
  • 結果に対するコールバック処理:
  • String taskno = StrCharUtil.formatNullStr(request.getParameter("taskno"));
    String callback = StrCharUtil.formatNullStr(request.getParameter("callback"));
    for(int i=0;i<10;i++){
    	Thread.sleep(1000);//10            
    	String res = StrCharUtil.formatNullStr(cacheTask.get(taskno));
    	if(!res.equals("")){
    		if(callback.equals("")){
    			out.println(res);
    		}else{
    			out.println(callback+"("+res+")");
    		}
    		return;
    	}
    }
    out.println("  (timeout)");
     
     
    以下はログ4 Jトラッキングの実行効果です.
     
    2010    07 14:08:18 INFO  cn.aw.task.REHunt - [14:08:18]      :reqid=030c95364050453987c6b9a597e80295id=1,type=null,mode=0,prov=zhejiang,city=ningbo,city=hangzhou,city=shaoxing,city=jinhua,city=zhoushan,prov=shanghai,city=putuo
    2010    07 14:08:18 INFO  cn.aw.task.TraversalProvince - ================================  : ningbo      ...
    2010    07 14:08:18 INFO  cn.aw.task.TraversalProvince - ================================  : hangzhou      ...
    2010    07 14:08:18 INFO  cn.aw.task.TraversalProvince - ================================  : shaoxing      ...
    2010    07 14:08:18 INFO  cn.aw.task.TraversalProvince - ================================  : jinhua      ...
    2010    07 14:08:18 INFO  cn.aw.task.TraversalProvince - ================================  : zhoushan      ...
    2010    07 14:08:18 INFO  cn.aw.task.TraversalProvince - ================================  : putuo      ...
    2010    07 14:08:18 INFO  cn.aw.servlet.AjaxServlet -       :0
    2010    07 14:08:18 INFO  cn.aw.task.CityTask - endTask:ningbo
    2010    07 14:08:18 INFO  cn.aw.task.CityTask - endTask:putuo
    2010    07 14:08:19 INFO  cn.aw.task.CityTask - endTask:hangzhou
    2010    07 14:08:19 INFO  cn.aw.task.CityTask - endTask:shaoxing
    2010    07 14:08:19 INFO  cn.aw.task.CityTask - endTask:jinhua
    2010    07 14:08:19 INFO  cn.aw.task.CityTask -     【zhoushan】 【1】  ,  
    2010    07 14:08:19 INFO  cn.aw.task.CityTask - endTask:zhoushan
    2010    07 14:08:19 INFO  cn.aw.task.REHunt -       URL:http://localhost:8080/ws/ajax...
    2010    07 14:08:19 INFO  cn.aw.servlet.AjaxServlet -      :030c95364050453987c6b9a597e80295

    もしあなたがもっと良い考えがあれば、検討を歓迎して、主にクエリーの効率の問題と同時問題を解決します!