为什么不持久的EJB计时器不触发



我正在尝试替换应用程序中的现有逻辑,该逻辑将持续的前进计时器使用到非持久计时器,这是由于我们遇到的最近一个问题。用于编写计时器的持久信息的文件系统已满,并且Derby数据库仅在读取模式下重新启动,这使我们的应用程序无法触发计时器帖子,我们必须重新启动服务器以修复相同的时间。

这是用于触发程序化计时器的当前代码

Timer timer = timerService.createTimer(100,eventContextWrapper);

根据http://docs.oracle.com/javaee/6/tutorial/doc/bnboy.html中引用的示例,将我们的代码更改为

TimerConfig tC = new TimerConfig(eventContextWrapper, false);
Timer timer = timerService.createSingleActionTimer(100,  tC);

,但我们面临以下例外

[5/31/17 22:18:23:348 GMT+08:00] 000000bf SystemErr     R org.omg.CORBA.MARSHAL: Unable to read value from underlying bridge : null  vmcid: IBM  minor code: 896  completed: No
[5/31/17 22:18:23:348 GMT+08:00] 000000bf SystemErr     R       at com.ibm.rmi.iiop.CDRReader.read_value(CDRReader.java:771)
[5/31/17 22:18:23:348 GMT+08:00] 000000bf SystemErr     R       at com.ibm.rmi.iiop.EncoderInputStream.read_value(EncoderInputStream.java:840)
[5/31/17 22:18:23:348 GMT+08:00] 000000bf SystemErr     R       at com.ibm.ws.ejbcontainer.util.ORBObjectCopierImpl.copy(ORBObjectCopierImpl.java:52)
[5/31/17 22:18:23:348 GMT+08:00] 000000bf SystemErr     R       at com.ibm.ws.ejbcontainer.util.ObjectUtil.copy(ObjectUtil.java:159)
[5/31/17 22:18:23:349 GMT+08:00] 000000bf SystemErr     R       at com.ibm.ejs.container.TimerNpImpl.<init>(TimerNpImpl.java:240)
[5/31/17 22:18:23:349 GMT+08:00] 000000bf SystemErr     R       at com.ibm.ejs.container.TimerNpImpl.<init>(TimerNpImpl.java:276)
[5/31/17 22:18:23:349 GMT+08:00] 000000bf SystemErr     R       at com.ibm.ws.runtime.component.WASEJBRuntimeImpl.createTimer(WASEJBRuntimeImpl.java:1371)
[5/31/17 22:18:23:349 GMT+08:00] 000000bf SystemErr     R       at com.ibm.ejs.container.BeanO.createSingleActionTimer(BeanO.java:2551)
com.test.customer.event.EventTimerBean.triggerTimer(EventTimerBean.java:62)

第62行是调用createSingleakinctiontimer的位置。

进行了一些分析,无法修复。任何线索都会有所帮助。

最终发现EventContextWrapper中的一个类是不可序列化的,这就是为什么我们会遇到上述错误。我们更改了该课程以实现可序列化并起作用。仍然不确定,使用持续计时器时如何工作。

最新更新