当前位置:  开发笔记 > 编程语言 > 正文

非托管线程Spring Quartz Websphere Hibernate

如何解决《非托管线程SpringQuartzWebsphereHibernate》经验,为你挑选了2个好方法。

看来我们使用Quartz-JDBCJobStore以及Spring,Hibernate和Websphere的实现抛出了非托管线程.

我做了一些阅读,发现了一篇来自IBM的技术文章,指出使用Quartz with Spring会导致这种情况.他们建议使用CommnonJ来解决这个问题.

我做了一些进一步的研究,到目前为止我见过的唯一例子都涉及不在数据库中的旧JobStore计划.

所以,我想知道是否有人有这个问题的解决方案的例子.

谢谢



1> Robin..:

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

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

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

不简单,不幸的是我没有随时可用的代码.


我意识到这篇文章已经过时但您是否有一个例子,说明如何更改Quartz以使用WorkManager守护程序线程,或创建可用作Quartz线程池的WorkManagerThreadPool?我想将Quartz与Websphere一起使用但是要实现非托管线程的局限性,并希望以"正确的方式"来实现.谢谢.

2> PaoloC..:

为线程添加另一个答案,因为我最终找到了解决方案.

我的环境:WAS 8.5.5,Quartz 1.8.5,没有Spring.

我遇到的问题是(上述)非托管线程导致NamingException ctx.lookup(myJndiUrl),而是正确地在其他应用程序服务器中工作(JBoss,Weblogic); 实际上,Webpshere正在通过以下消息触发"事件":

javax.naming.ConfigurationException:无法完成对"java:"名称的JNDI操作,因为服务器运行时无法将操作的线程与任何J2​​EE应用程序组件相关联.当在服务器应用程序请求的线程上未执行使用"java:"名称的JNDI客户端时,可能会发生此情况.确保J2EE应用程序不对静态代码块中的"java:"名称或该J2EE应用程序创建的线程执行JNDI操作.此类代码不一定在服务器应用程序请求的线程上运行,因此JNDI对"java:"名称的操作不支持.

以下步骤解决了问题:

1) 升级到石英1.8.6(无代码更改),只需maven pom

2) 将以下dep添加到classpath(在我的例子中,EAR的/ lib文件夹),以使新的WorkManagerThreadExecutor可用


  org.quartz-scheduler
  quartz-commonj
  1.8.6

注意:在QTZ-113或官方的Quartz Documentation 1.x 2.x中,没有提及如何激活此修复程序.

3) 将以下内容添加到quartz.properties("wm/default"是我的WAS 8.5.5中已配置的DefaultWorkManager的JNDI,请参阅参考资料 - > AsynchronousBeans - > WAS控制台中的WorkManagers):

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

注意:右类是org.quartz.自定义 .WorkManagerThreadExecutor for quartz-scheduler-1.8.6(已测试)或org.quartz.来自2.1.1的commonj .WorkManagerThreadExecutor(未经测试,但在maven's repos的实际quartz-commonj的jar中验证)

4)在石英作业的空构造函数中 移动JNDI查找(感谢m_klovre的"J2EE容器之外的线程"); 也就是说,构造函数是由newInstance()我的应用程序的同一个J2EE上下文中的reflect(方法)调用的,并且可以访问java:global命名空间,而该execute(JobExecutionContext)方法仍然在较差的上下文中运行,而这个上下文缺少我的所有应用程序的EJB

希望这可以帮助.

PS.作为参考,您可以在这里找到我上面使用的quartz.properties文件的示例

推荐阅读
小妖694_807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有