5

Websphere7環境とGlassFish3環境の間でデプロイメントを統合するために、GlassFishにCommonJWorkManagerとTimerManagerを実装してみることにしました。しかし、期待どおりに機能していません。私は次のことをしました:

http://commonj.myfoo.de/にあるmyFOOCommonJ実装を使用し、ライブラリをmy domain / libフォルダー(Springライブラリを含む)に含めます。

<resources>glassfishdomain.xmlのセクションに以下を追加しました。

<custom-resource res-type="commonj.work.WorkManager" jndi-name="wm/default" factory-class="de.myfoo.commonj.work.FooWorkManagerFactory"></custom-resource>
<custom-resource res-type="commonj.timers.TimerManager" jndi-name="tm/default" factory-class="de.myfoo.commonj.timers.FooTimerManagerFactory"></custom-resource>

domain.xmlの<servers>/セクションに参照を含めます。<server>

  <resource-ref ref="wm/default"></resource-ref>
  <resource-ref ref="tm/default"></resource-ref>

テストアプリケーションのweb.xmlに適切なリソース参照を追加します。

<resource-ref>
    <description>WorkManager</description>
    <res-ref-name>wm/default</res-ref-name>
    <res-type>commonj.work.WorkManager</res-type>
    <res-auth>Container</res-auth>
    <res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>

<resource-ref>
    <description>TimerManager</description>
    <res-ref-name>tm/default</res-ref-name>
    <res-type>commonj.timers.TimerManager</res-type>
    <res-auth>Container</res-auth>
    <res-sharing-scope>Unshareable</res-sharing-scope>
</resource-ref>

次のBeanをapplicationContext.xmlに追加します。

<bean id="threadTestTaskExecutor" class="org.springframework.scheduling.commonj.WorkManagerTaskExecutor"> 
    <property name="workManagerName" value="wm/default" />
    <property name="resourceRef" value="true"/>
</bean>

<bean id="threadTestTimerExecutor" class="org.springframework.scheduling.commonj.TimerManagerTaskScheduler"> 
    <property name="timerManagerName" value="tm/default" />
    <property name="resourceRef" value="true" />
    <property name="shared" value="false" />
</bean>

<bean id="threadTest" class="test.ThreadTester"></bean>

<task:scheduled-tasks scheduler="threadTestTimerExecutor">
    <task:scheduled ref="threadTest" method="execute" fixed-delay="30000" />  <!-- 30 seconds -->
</task:scheduled-tasks>

このセットアップがすべて完了すると、すべてのロードが検出され、Webアプリケーションが実行されます。ただし、ThreadTesterクラスはTimerでは実行されません。

myFOOコードをステップ実行し、TimerManager(FooTimerManager.java)のメインループが実行されていますが、30秒ごとにクラスを起動することになっていることを認識していないようです。

私の質問:

GlassFish3とSpringでJSR236/237(CommonJ)を実装した経験のある人はいますか?

myFOO以外に、使用して試すことができる別の実装はありますか?誰かが私がやったことをやろうとしたことがありますか?成功した場合、結果を共有してもよろしいですか?

ありがとう!

編集1:

GlassFishでmyFOOCommonJ実装を使用すると、WorkManagerに関する限り機能することを忘れまし。動作しないのはTimerManagerです。これは、オンデマンドでスレッドを正常に起動できますが、トリガーされたスケジューリングが機能しないことを意味します。

編集2:

GlassFish 3.1.1にアップデートしてから、TimerManagerのmyFOOCommonJ実装は正常に機能しています。とても素晴らしい!この質問は、HOWTOガイドのようなものになりました。

4

3 に答える 3

2

myFoo CommonJのTimerManagerを使用するのは良い考えではないと思います-約6年間休止していることに加えて、コードはいくつかの点で奇妙です(v1.1を参照)。たとえば、FooTimerクラスのisExpiredメソッドは次のようになります。

public boolean isExpired() {
    return scheduledExcecutionTime >= System.currentTimeMillis();
}

では、タイマーは、スケジュールされた次の実行時刻が将来になると期限切れになりますか?ナンセンス-それは逆のはずです!

他の場所(TimerExecutor#run)で、notifyAllが現在のスレッドが監視していないオブジェクト(TimerManager)で呼び出され、常にjava.lang.IllegalMonitorStateExceptionsが発生します。

触るな!

于 2012-06-15T14:24:11.650 に答える
0

Springで作業している場合、なぜ別のタイマー実装を使用しているのですか?Springスケジューリング統合を使用しないのはなぜですか?そうすれば、Springは気にしないので、アプリが実行されているサーバーについて心配する必要はありません。

于 2011-09-20T23:12:26.117 に答える
0

そうですね、GlassFish 3.1.1にアップデートしてから、TimerManagerのmyFOO実装に問題がなくなったようです。私の@Scheduled豆は今うまく機能しています。

于 2012-03-22T21:57:04.900 に答える