它的出现,我们的实施采用石英-JDBCJobStore随着春天,休眠和Websphere是扔非托管线。

我已经做了一些阅读和发现了一个新技术的文章,从IBM指出,使用石英春天将会导致的。他们建议使用CommnonJ来解决这一问题。

我已经做了一些进一步的研究和唯一的例子,我迄今所看到的所有的处理与计划的老JobStore,是不是在一个数据库。

所以,我想知道,如果任何人有一个例子解决这个问题。

感谢

有帮助吗?

解决方案

我们有一个可行的解决方案(实际上是两个)。

1)更改quartz源代码,以便为主调度程序线程使用WorkManager守护程序线程。它有效,但需要更改夸脱。我们没有使用它,因为我们不想保持一个黑客版本的石英。 (这提醒我,我打算将这个提交给项目,但完全忘了)

2)创建一个WorkManagerThreadPool用作石英线程池。实现石英ThreadPool的接口,以便在quartz中触发的每个任务都包装在一个commonj Work对象中,然后在WorkManager中进行调度。关键是WorkManagerThreadPool中的WorkManager必须在调度程序启动之前从Java EE线程(例如servlet初始化)初始化。然后,WorkManagerThreadPool必须创建一个守护程序线程,该线程将通过创建和计划新的Work对象来处理所有计划任务。这样,调度程序(在其自己的线程上)将任务传递给托管线程(Work守护程序)。

不简单,遗憾的是我没有随时可用的代码。

其他提示

增加的另一个回答线,因为我找到一个解决方案,最后进行。

我的环境:是8.5.5、石英1.8.5,没有弹簧。

的问题 我有的是(上述)不受管线造成NamingException从 ctx.lookup(myJndiUrl), 那是不正确的工作在其他应用程序服务器(Boss,任何);实际上,Webpshere是发射一个"事件"与以下信息:

内命名。ConfigurationException:JNDI操作上的一个"java:"的名称,无法完成,因为服务器运行时不够准操作的任何J2EE应用程序的组成部分。这种情况可能会发生时JNDI客户使用的"java:"的名字是不是执行在线服务器应用程序的请求。确保J2EE应用程序不执行JNDI操作上的"java:"的名称内的静态码块或在线创建于J2EE应用程序。这种代码并不一定运行在线服务器应用程序的请求,因此不支持由JNDI操作上的"java:"的名称。

下列步骤解决的问题:

1) 升级到石英的1.8.6(没有代码的更改),就家pom

2) 加入以下dep类路径(在我的情况下,耳朵/lib文件夹),以使新的WorkManagerThreadExecutor提供

<dependency>
  <groupId>org.quartz-scheduler</groupId>
  <artifactId>quartz-commonj</artifactId>
  <version>1.8.6</version>
</dependency>

注:在 QTZ-113 或官方的石英文档 1.x 2.x 有没有提到如何激活这个修复。

3) 加入以下石英。性质("窗口管理/default"是JNDI已经配置DefaultWorkManager在我是8.5.5,请参阅 资源-->AsynchronousBeans->WorkManagers 在被控制台):

org.quartz.threadExecutor.class=org.quartz.custom.WorkManagerThreadExecutor
org.quartz.threadExecutor.workManagerName=wm/default

注:权利类是 org.石英。定义.WorkManagerThreadExecutor 石英-调度-的1.8.6(试验),或者 org.石英。中的commonj.sdo.WorkManagerThreadExecutor2.1.1 在(未经测试,但是核实在实际 石英中的commonj.sdo的罐子 在专家的repos)

4) 移动的 JNDI查找在空构造的石英的工作 (谢谢 m_klovre的"线以外的J2EE容器");这就是,构造物被援引的反射(newInstance() 法)从同样的J2EE我应用程序,并曾访问 java:global 名字空间,同时该 execute(JobExecutionContext) 方法还是运行中的较贫穷的背景下,这是缺失的我的所有应用程序的前总

希望这会有所帮助。

Ps。作为一个参考,可以找到 在这里, 例的石英。性文件,我曾使用上面

查看这篇文章: http://www.ibm.com/developerworks/websphere/techjournal/ 0609_alcott / 0609_alcott.html

基本上,在SchedulerFactoryBean上设置taskExecutor属性以使用org.springframework.scheduling.commonj.WorkManager TaskExecutor,它将使用容器管理的线程。

请注意:以上QUARTZ-708的链接不再有效。 这个新问题(在新的Jira中)似乎正在解决这个问题: http://jira.terracotta.org/jira/browse/QTZ-113 (fixVersion = 1.8.6,2.0.2)

您可以查看以下有关此内容的石英上的JIRA链接。

http://jira.opensymphony.com/browse/QUARTZ-708

这具有必需的WebSphereThreadPool实现,可以与上面提到的quartz.properties中的更改一起使用,以满足您的要求。希望这会有所帮助。

此致 希瓦

您必须使用websphere的托管线程池。你可以通过spring和commonj来做到这一点。 CommonJ可以有一个任务执行器来创建托管线程。您甚至可以使用对jndi托管线程资源的引用。然后,您可以将commonj任务执行程序注入基于Spring的Quartz SchedulerFactoryBean。

请参阅 http://open.bekk.no/boss/spring -scheduling-in-websphere / 并滚动到“Quartz with CommonJ”部分了解更多详情。

PaoloC对WAS85和Quartz 1.8.6的提议也适用于WAS80(和Quartz 1.8.6),不需要Spring。 (在我的设置中,Spring 2.5.5存在,但在该上下文中没有使用。)

这样我就可以通过自己的变体覆盖SimpleJobFactory,使用InjectionHelper在每个新创建的作业上应用CDI。注入适用于@EJB(使用JNDI查找带注释的EJB远程业务接口)和@Inject(首先使用新的InitialContext对CDI BeanManager进行JNDI查找,然后使用这个新获取的BM来查找CDI bean本身)。

谢谢PaoloC的回答! (我希望这个文本将作为“PaoloC的答案”出现,而不是作为主题的答案。没有办法区分这些。)

我最近遇到过这个问题。实际上你需要:

  1. 通过将工作委派给Websphere Work Manager来实现线程池。 (Quartz只提供在非托管线程上运行作业的SimpleThreadPool)。通过 org.quartz.threadPool.class property
  2. 告诉quartz使用此线程池
  3. 通过 org.quartz.threadExecutor.class property
  4. 告诉quartz使用 WorkManagerThreadExecutor (或实现自定义的)
  5. 对繁琐的遗留Web容器有点耐心:)
  6. 以下是 github demo 使用Quartz和Websphere(以及Tomcat)。

    希望它有所帮助..

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top