当我们将持久性EJBTimer与@schedule和persistent = true一起使用时,将其部署到集群,然后我们在@Schedule中更改实际计划并重新部署到集群,原始计划是否被新计划替换(已删除)并添加了新参数),或者两个计划都保持活动状态(请记住设置了persistent = true)
这是我到目前为止所阅读的内容 - Each scheduler instance has a unique jndi name and @schedule automatically creates a timer through application deployment so it would be better to remove the automatic created EJBTimer or cancel the original schedule to avoid trouble.
但我不知道如何以编程方式取消原始计划,或者需要由websphere管理员完成,如果原始和更改时间表仍然有效
同样来自this document,removeAutomaticEJBTimers命令用于从指定的调度程序中删除计时器,但这似乎也出现在websphere管理员的区域,而不是开发人员。
开发人员如何以编程方式取消使用@Schedule注释创建的自动EJBTimer?
我正在将Java EE 6与Websphere 8.5和EJB 3.1结合使用。
答案 0 :(得分:6)
执行以下操作以删除持久化的EJB计时器:
删除目录jboss-home \ standalone \ data \ timer-service-data {yourporjectname}。{serivename}
答案 1 :(得分:0)
请参阅此页Creating timers using the EJB timer service
应用程序服务器自动删除持久自动 当您卸载应用程序时,数据库中的计时器 服务器正在运行。如果应用程序服务器未运行,则必须 手动从数据库中删除自动计时器。另外, 如果您添加,删除或更改自动计时器的元数据 服务器未运行,您必须手动删除自动 定时器。
我有以下课程:
@Stateless
@LocalBean
public class HelloBean {
@Schedule(persistent=true, minute="*", hour="*", info="myTimer")
public void printHello() {
System.out.println("### hello");
}
}
当我将它安装到服务器时,我可以找到相关的自动计时器:
C:\IBM\WebSphere\AppServer85\profiles\AppSrv02\bin>findEJBTimers.bat server1 -al l
ADMU0116I: Tool information is being logged in file C:\IBM\WebSphere\AppServer85\profiles\AppSrv02\logs\server1\EJBTimers.log
ADMU0128I: Starting tool with the AppSrv02 profile
ADMU3100I: Reading configuration for server: server1
EJB timer : 3 Expiration: 2/14/15 12:39 PM Calendar
EJB : ScheduleTestEAR, ScheduleTest.jar, HelloBean
Info : myTimer
Automatic timer with timout method: printHello
Calendar expression: [start=null, end=null, timezone=null, seconds="0",
minutes="*", hours="*", dayOfMonth="*", month="*", dayOfWeek="*", year="*"]
1 EJB timer tasks found
卸载应用程序后,计时器将被删除:
C:\IBM\WebSphere\AppServer85\profiles\AppSrv02\bin>findEJBTimers.bat server1 -al l
ADMU0116I: Tool information is being logged in file
C:\IBM\WebSphere\AppServer85\profiles\AppSrv02\logs\server1\EJBTimers.log
ADMU0128I: Starting tool with the AppSrv02 profile
ADMU3100I: Reading configuration for server: server1
0 EJB timer tasks found
我不知道您是如何'重新部署'您的应用程序的,但看起来您的流程不正确。与正常安装/卸载/更新过程一样,正确删除了自动计时器。
<强>更新强>
在同一页面上,您有关于ND环境的信息:
自动持久性计时器将从其持久性存储中删除 何时卸载其包含的模块或应用程序。因此, 不要更新使用自动持久计时器的应用程序 部署更新功能。这样做卸载并重新安装 群集仍在运行时应用程序,这可能会导致 在以下情况下失败:
如果在删除数据库条目之后且在重新创建数据库条目之前激活在另一个集群成员中运行的计时器, 然后计时器失败。在这种情况下,一个 com.ibm.websphere.scheduler.TaskPending异常被写入 首次故障数据捕获(FFDC)以及SCHD0057W消息, 表示数据库中的任务信息已更改 或取消。
如果计时器在数据库中的计时器数据更新后尚未更新的集群成员上激活,则 如果新计时器,计时器可能会失败或导致其他故障 信息仍然与旧的应用程序代码不兼容 在集群成员中运行。
答案 2 :(得分:0)
在JBoss / WildFly中,如果更改timer-service以使用“clustered-store”而不是“default-file-store”,您将能够以编程方式取消Timer。以下是解释如何制作的简要指南:
Mastertheboss.com: Creating clustered EJB 3 Timers
Published: 08 March 2015
http://www.mastertheboss.com/jboss-server/wildfly-8/creating-clustered-ejb-3-timers