拥有一个使用“crontab 语法”的 EJB 计划任务
我试图找出解决以下问题的可能性。
a)我想要一个使用“crontab语法”来安排任务的数据库表,其结构将是这样的:
|-Id-|---Crontab Syntax---|---------Task----------| | 1 | 30 * * * * * | MyClass.TaskA(args[]) | | 2 | 0 1 * * 1-5 * | MyClass.TaskB(args[]) | | | | |
上面的表将随时被外部应用程序修改。添加或删除的任务应立即影响调度程序。
b) 调度程序本身应该驻留在 Java 应用程序服务器上。它应该不断地与数据库表中活动的计划任务同步。每当调度事件发生时,它应该触发/调用 EJB,并将“任务”中的值作为参数。
我并不是在寻找上述问题的答案。而是一些关于什么框架可用于 crontab 解析以及应该以什么方式部署代表调度程序的 EJB 的输入。
提前致谢。
I am trying to figure out the possibilities I have to solve the following problem.
a) I want to have a database table that uses "crontab syntax" to schedule tasks, the structure would be something like this:
|-Id-|---Crontab Syntax---|---------Task----------| | 1 | 30 * * * * * | MyClass.TaskA(args[]) | | 2 | 0 1 * * 1-5 * | MyClass.TaskB(args[]) | | | | |
The above table will be modified at any time by an external application. Tasks added or removed should instantly affect the scheduler.
b) The scheduler itself should reside on a Java application server. It should constantly be synched with the active scheduled tasks in the database table. Whenever a schedule event occurs it should trigger/call an EJB with the value in 'Task' as argument.
I am not looking for an answer to the above problem. But rather some input in what frameworks can be used for the crontab parsing and in what manner the EJB representing the scheduler should be deployed.
Thanks in advance.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
请参阅 EJB 3.1
@Schedule
API。我们为规范选择的 API 比 cron 更接近 Quartz 语法——两者之间的差异很小。这是一个注释示例:
完整源代码此处
您可以通过编程方式执行相同的操作通过 ScheduleExpression 类,该类只是上述注释的可构造版本。如果计划是在代码中完成的,上面的示例将如下所示:
此示例的源代码是 此处
旁注,这两个示例都可以在普通 IDE 中运行,并且具有使用 Embeddable EJBContainer API 也是 EJB 3.1 中的新增功能。
@Schedule 与 ScheduleExpression
以上全部在部署描述符中完成,因此仅限于可以提前配置的内容。更动态的版本使用 TimerService 的以下签名:
TimerService.createCalendarTimer(javax.ejb.ScheduleExpression, javax.ejb.TimerConfig)
javax.ejb.Timer
作为参数另请注意,有一个拦截器
@AroundTimeout
注释,其功能与@AroundInvoke
相同,并允许拦截器参与 Bean 的计时器功能。See the EJB 3.1
@Schedule
API. The API we chose for the spec is a little closer to Quartz syntax than cron -- tiny variances between the two.Here's an annotation example:
Full source for this here
You can do the same thing programmatically via the ScheduleExpression class which is just a constructable version of the above annotation. Here's what the above example would look like if the schedule was done in code:
The source for this example is here
Side note, both examples are runnable in a plain IDE and have test cases that use the Embeddable EJBContainer API also new in EJB 3.1.
@Schedule vs ScheduleExpression
The above is all done in the deployment descriptor and is therefore limited to only things that can be configured in advance. The more dynamic version uses the following signature of the TimerService:
TimerService.createCalendarTimer(javax.ejb.ScheduleExpression, javax.ejb.TimerConfig)
javax.ejb.Timer
as a parameterAlso note that there is an interceptor
@AroundTimeout
annotation that functions identically to@AroundInvoke
and allows interceptors to participate in the bean's timer functionality.EJB 有自己的内置 计时器,但是您必须编写样板代码来翻译 cron 解析。 cron 指令本身的解析应该是微不足道的。
如果您不害怕在 EJB 之外冒险,Quartz 正如 lexcore 提到的那样是一个很好的选择。
EJB has its own built in timers, but you'll have to write the boilerplate code to translate cron parsing. The parsing of the cron instructions themselves should be trivial.
If you're not afraid of venturing outside of EJB, Quartz is as lexicore mentioned an excellent option.
看看 Quartz。如果您使用 Spring,那里会提供非常好的支持。一个整洁、可靠、工作良好的东西。
Take a look at Quartz. If you use Spring there's very good support there. A neat, reliable good-working thing.