便利なコードパーツ集!

やまろうのプログラミングTips

Java

[Java] 並列処理フレームワークcommonj.workを自分で実装する

投稿日:

2008/04

APサーバー上で非同期並列処理をしたい場合があります。
例えば、大量の複数データを別のコンテンツサーバから取得する場合等です。
この場合1件データを取得して次のデータを取得…というように直列で
処理していたのではIO待ち時間ばかりで処理効率が大変悪くなってしまいます。

「じゃあ、Threadクラスをnewしまっかね?」

そうもいかないんです。
ユーザープログラムが生成したスレッドでJTA(Java Transaction API)
を利用したトランザクションを開始することを禁じています。
ともかく、ユーザープログラムがスレッド生成すんのはよろしくないらしいです。

そこで登場するのが米国BEAシステムズと米国IBMが共同で策定した
「JSR 237:Work Manager for Application Servers」です。
具体的にはcommonj-twm.jarのcommonj.workパッケージです。

詳しくはこちらを読んでください。
JavaWorld Online - ミッション・クリティカル・システム開発講座 第5回
http://www.javaworld.jp/enterprise/-/31381-1.html

最新のWebSphereやWebLogicではコンテナにcommonjが実装されています。
しかし、commonjが実装されてないAPサーバではどうやって並列処理を
実装すればいいのか?
それは、commonjのインターフェースを自力で実装しておいてAPサーバが
commonjに対応したら本物のcommonjに差し替えるというのが有効です。
ということで自力で実装してみます。Threadのいい勉強にもなります。

これから作るクラスはcommonjが実装されてないAPサーバで使えます。

スポンサーリンク



[実行結果]

>set CLASSPATH=.;commonj-twm.jar
>javac -d . *.java
>java jp.gr.java_conf.yamarou.commonj.work.WorkAPITest
<<---------Start testWaitForAll timeout_ms=110--------->>
start SampleWork sleepTime=100
start SampleWork sleepTime=200
start SampleWork sleepTime=300
end SampleWork sleepTime=100
allWorkCompleted=false
work.getSleepTime()=100
work.getSampleResultValue()=-758461293
workItem.getStatus()=4
work.getSleepTime()=200
work.getSampleResultValue()=0
workItem.getStatus()=3
work.getSleepTime()=300
work.getSampleResultValue()=0
workItem.getStatus()=3
<<---------End testWaitForAll timeout_ms=110--------->>
end SampleWork sleepTime=200
end SampleWork sleepTime=300
<<---------Start testWaitForAll timeout_ms=310--------->>
start SampleWork sleepTime=100
start SampleWork sleepTime=200
start SampleWork sleepTime=300
end SampleWork sleepTime=100
end SampleWork sleepTime=200
end SampleWork sleepTime=300
allWorkCompleted=true
work.getSleepTime()=100
work.getSampleResultValue()=-940832272
workItem.getStatus()=4
work.getSleepTime()=200
work.getSampleResultValue()=-876579205
workItem.getStatus()=4
work.getSleepTime()=300
work.getSampleResultValue()=-908128615
workItem.getStatus()=4
<<---------End testWaitForAll timeout_ms=310--------->>
<<---------Start testWaitForAny timeout_ms=90--------->>
start SampleWork sleepTime=100
start SampleWork sleepTime=200
start SampleWork sleepTime=300
completedWorkItems=null
<<---------End testWaitForAny timeout_ms=90--------->>
end SampleWork sleepTime=100
end SampleWork sleepTime=200
end SampleWork sleepTime=300
<<---------Start testWaitForAny timeout_ms=110--------->>
start SampleWork sleepTime=100
start SampleWork sleepTime=300
start SampleWork sleepTime=200
end SampleWork sleepTime=100
completedWorkItems=[jp.gr.java_conf.yamarou.commonj.work.WorkItemImpl@24b6127e]
completedWorkItems.size()=1
work.getSleepTime()=100
work.getSampleResultValue()=-1331352405
workItem.getStatus()=4
<<---------End testWaitForAny timeout_ms=110--------->>
end SampleWork sleepTime=200
end SampleWork sleepTime=300
<<---------Start testWaitForAny timeout_ms=310--------->>
start SampleWork sleepTime=100
start SampleWork sleepTime=200
start SampleWork sleepTime=300
end SampleWork sleepTime=100
completedWorkItems=[jp.gr.java_conf.yamarou.commonj.work.WorkItemImpl@52a0927e]
completedWorkItems.size()=1
work.getSleepTime()=100
work.getSampleResultValue()=-1209002255
workItem.getStatus()=4
<<---------End testWaitForAny timeout_ms=310--------->>
end SampleWork sleepTime=200
end SampleWork sleepTime=300

うむ、ばっちし、想定通りに並列に動いて同期してんね!!

スポンサーリンク

-Java

Copyright© やまろうのプログラミングTips , 2020 AllRights Reserved Powered by AFFINGER4.