5

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

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

将以下内容添加到<resources>glassfish domain.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>

<servers>在 domain.xml 的/<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 而言,使用带有 GlassFish 的 myFOO CommonJ 实现确实有效。不起作用是 TimerManager。这意味着我可以按需启动线程,但触发调度不起作用。

编辑2:

自从更新到 GlassFish 3.1.1,TimerManager 的 myFOO CommonJ 实现运行良好。很好!这个问题现在更像是一个 HOWTO 指南。

4

3 回答 3

2

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

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

那么,定时器将在其预定的下一次执行时间在未来时到期吗?胡说八道——那应该是相反的!

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

放手!

于 2012-06-15T14:24:11.650 回答
0

好吧,看起来自从更新到 GlassFish 3.1.1 后,我不再遇到 TimerManager 的 myFOO 实现的问题。我的@Scheduled豆子现在工作得很好。

于 2012-03-22T21:57:04.900 回答
0

如果您在 Spring 中工作,为什么要使用另一个 Timer 实现?为什么不直接使用Spring 调度集成?然后您无需担心您的应用程序在哪个服务器上运行,因为 Spring 不在乎。

于 2011-09-20T23:12:26.117 回答