为了统一Websphere 7和GlassFish 3环境之间的部署,我决定尝试在GlassFish中实现CommonJ WorkManager和TimerManager。但是它并没有像预期的那样正常工作。我已经完成以下工作:

使用位于http://commonj.myfoo.de/的myFOO CommonJ实现,并将这些库包含到我的domain/lib文件夹中(包括Spring库)

在glassfish domain.xml的<resources>部分中添加了以下内容:

<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秒启动一次该类。

我的问题:

有没有人有使用GlassFish 3和Spring实现JSR 236/237(CommonJ)的经验?

除了myFOO之外,还有其他实现可以尝试使用吗?
有没有人尝试做我所做的事情?如果您成功了,您愿意分享您的结果吗?

谢谢!

编辑1:

我忘了提及,就WorkManager而言,将myFOO CommonJ实现与GlassFish 一起使用确实可以使正常工作。 不起作用是什么,它是TimerManager。这意味着我可以按需启动线程,但是触发的调度不起作用。

编辑2:

自更新为GlassFish 3.1.1以来,TimerManager的myFOO CommonJ实现工作正常。很好!现在,这个问题更像是《 HOWTO指南》。

最佳答案

我认为使用myFoo CommonJ的TimerManager不是一个好主意-除了休眠约6年之外,该代码在某些方面还很奇怪(请参阅v1.1)。例如。 FooTimer类的isExpired方法如下所示:

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

那么,计时器在计划的下一个执行时间在将来时会到期吗?废话-反之亦然!

在其他地方(TimerExecutor#run),在当前线程没有监视器的对象(TimerManager)上调用notifyAll,从而不断导致java.lang.IllegalMonitorStateExceptions。

放手!

10-02 06:32