0

由于我们最近遇到的一个问题,我正在尝试替换我们的应用程序中的现有逻辑,该逻辑使用持久性程序计时器到非持久性计时器。WAS 用于写入计时器持久信息的文件系统已满,并且 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 行是调用 createSingleActionTimer 的地方。

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

4

1 回答 1

0

最终发现 EventContextWrapper 中的一个类不可序列化,这就是我们收到上述错误的原因。我们更改了该类以实现可序列化并且它起作用了。仍然不确定,使用持久计时器时它是如何工作的。

于 2017-06-07T07:57:40.907 回答