業界ソフトウェアにおけるマルチスレッドプログラミングの検討
ネットワークに接続されていない*****システムなど、ビジネス環境によく遭遇するソリューションを考えてみましょう.
業務目標:全国範囲の検索条件を満たすデータ記録を検索する
ソリューション:Webサービスを中心とした地域レベルのクエリー・インタフェースを使用して、マルチスレッド・クエリーを開始し、クエリーの結果を非同期で表示
開発手順:
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
もしあなたがもっと良い考えがあれば、検討を歓迎して、主にクエリーの効率の問題と同時問題を解決します!