Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 非托管线程Spring和Websphere Hibernate_Java_Hibernate_Spring_Websphere_Quartz Scheduler - Fatal编程技术网

Java 非托管线程Spring和Websphere Hibernate

Java 非托管线程Spring和Websphere Hibernate,java,hibernate,spring,websphere,quartz-scheduler,Java,Hibernate,Spring,Websphere,Quartz Scheduler,我们使用Quartz-JDBCJobStore以及Spring、Hibernate和Websphere的实现似乎抛出了非托管线程 我读了一些书,发现IBM的一篇科技文章说,将石英与Spring结合使用会导致这种情况。他们建议使用CommnonJ来解决这个问题 我已经做了一些进一步的研究,到目前为止,我所看到的唯一的例子都是关于不在数据库中的plan-old JobStore的 所以,我想知道是否有人有一个解决这个问题的例子 谢谢我们对此有一个有效的解决方案(实际上有两个) 1) 更改quartz

我们使用Quartz-JDBCJobStore以及Spring、Hibernate和Websphere的实现似乎抛出了非托管线程

我读了一些书,发现IBM的一篇科技文章说,将石英与Spring结合使用会导致这种情况。他们建议使用CommnonJ来解决这个问题

我已经做了一些进一步的研究,到目前为止,我所看到的唯一的例子都是关于不在数据库中的plan-old JobStore的

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


谢谢

我们对此有一个有效的解决方案(实际上有两个)

1) 更改quartz源代码以将WorkManager守护程序线程用于主计划程序线程。它可以工作,但需要更换夸脱。但我们没有使用这个,因为我们不想维护石英的黑客版本。(这提醒了我,我本来打算把这个提交给项目,但完全忘记了)

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

这并不简单,不幸的是,我没有现成的代码可以包含

查看这篇文章:


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

您可以查看quartz上提出的以下JIRA链接

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

问候,,
Siva

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


有关更多详细信息,请参阅并滚动至“Quartz with CommonJ”部分。

请注意:上述Quartz-708的链接不再有效。
这个新问题(在一个新的Jira中)似乎解决了这个问题:(fixVersion=1.8.6,2.0.2)

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

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

我遇到的问题是(上面提到的)非托管线程导致了来自
ctx.lookup(myjndirol)
的NamingException,该异常在其他应用服务器(JBoss、Weblogic)中正常工作;事实上,Webpshere引发了一场“事件”,其中包含以下信息:

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

以下步骤解决了该问题:

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

2)将以下dep添加到类路径(在我的例子中是EAR的/lib文件夹),以使新的WorkmanagerReadExecutor可用


org.quartz-scheduler
或者官方的Quartz文档中没有提到如何激活此修复程序

3)在quartz.properties中添加了以下内容(“wm/default”是我的was 8.5.5中已配置的DefaultWorkManager的JNDI,请参阅参考资料->异步Beans->was控制台中的WorkManager):

注意:正确的类是org.quartz.custom.WorkManagerThreadExecutor for quartz-scheduler-1.8.6(已测试)或org.quartz.commonj.WorkManagerThreadExecutor from2.1.1on(未测试,但在maven的回购协议中实际验证)

4)在quartz作业的空构造函数中移动了JNDI查找(感谢);也就是说,构造函数是由反射(
newInstance()
method)从我的应用程序的同一个J2EE上下文调用的,并且可以访问
java:global
命名空间,而
execute(JobExecutionContext)
方法仍然在较差的上下文中运行,这丢失了我应用程序的所有EJB

希望这有帮助


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

PaoloC针对WAS85 ans quartz 1.8.6的提案也适用于WAS80(和quartz 1.8.6),不需要弹簧。(在我的设置中,Spring 2.5.5已经存在,但没有在该上下文中使用。)

这样,我就能够通过自己的变体覆盖SimpleJobFactory,使用InjectionHelper在每个新创建的作业上应用CDI。注入既适用于@EJB(使用带注释的EJB远程业务接口的JNDI查找),也适用于@Inject(使用新的InitialContext使用CDIBeanManager的JNDI查找)
org.quartz.threadExecutor.class=org.quartz.custom.WorkManagerThreadExecutor
org.quartz.threadExecutor.workManagerName=wm/default