gpt4 book ai didi

datasource - Quartz 计划作业无法访问 Websphere 中的数据源

转载 作者:行者123 更新时间:2023-12-04 14:29:36 25 4
gpt4 key购买 nike

我正在开发一个网络应用程序,批处理程序需要在特定时间运行。我使用 Quartz 库来安排作业。 Web 应用程序部署在 Websphere 8.5.5 上并且运行良好,通过数据源访问表(代码中给出的数据源是 java:comp/env/jdbc/db_datasource)。该作业也会在上述时间触发。

当计划作业通过数据源建立数据库连接时出现错误,错误是:

javax.naming.ConfigurationException: A JNDI operation on a "java:" name cannot be completed because the server runtime is not able to associate the operation's thread with any J2EE application component.  This condition can occur when the JNDI client using the "java:" name is not executed on the thread of a server application request.  Make sure that a J2EE application does not execute JNDI operations on "java:" names within static code blocks or in threads created by that J2EE application.  Such code does not necessarily run on the thread of a server application request and therefore is not supported by JNDI operations on "java:" names. [Root exception is javax.naming.NameNotFoundException: Name comp/env/jdbc not found in context "java:".]
at com.ibm.ws.naming.java.javaURLContextImpl.throwExceptionIfDefaultJavaNS(javaURLContextImpl.java:522)
at com.ibm.ws.naming.java.javaURLContextImpl.throwConfigurationExceptionWithDefaultJavaNS(javaURLContextImpl.java:552)
at com.ibm.ws.naming.java.javaURLContextImpl.lookupExt(javaURLContextImpl.java:481)
at com.ibm.ws.naming.java.javaURLContextRoot.lookupExt(javaURLContextRoot.java:485)
at com.ibm.ws.naming.java.javaURLContextRoot.lookup(javaURLContextRoot.java:370)

我从错误消息中了解到作业在 J2ee 容器外运行,因此作业无法使用数据源来建立连接,我不同意这一点,因为 Quartz 是作为 ServletContextListener 实现的,同样是在 web.xml 中提到。

Web.xml

<listener>
<listener-class>com.ehacampaign.helper.EHAJobSchedulerListener</listener-class>
</listener>

EHAJobSchedulerListener.java

public class EHAJobSchedulerListener implements ServletContextListener {..}

从代码中可以看出,该类是在web中注册的,我不明白为什么它不能使用J2EE容器中的数据源。

问题是:

  1. 为什么servlet注册类不能访问J2EE中的数据源容器?
  2. 如果容器中的数据源不能使用,那么如何做一个执行作业时连接到数据库?

注意:我在 JBoss AS 7.1 中有相同的设置,作业正在顺利运行,访问在 JBoss AS 7.1 中配置的数据源。我必须根据客户的要求在 Websphere 中开发它。

已更新

我附上了修改后的 quartz 属性文件。即使在添加 workmanagerthread 之后,我也会遇到同样的错误。

org.quartz.threadPool.threadCount=1
org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool

org.quartz.jobStore.class=org.quartz.simpl.RAMJobStore
org.quartz.threadExecutor.class=org.quartz.commonj.WorkManagerThreadExecutor
org.quartz.threadExecutor.workManagerName=wm/default

最佳答案

为了在 WebSpehre 中执行 JNDI 查找,您的代码必须在托管线程上运行。为了让 Quartz 在 WebSphere 的托管线程之一上运行,您必须在 quartz.properties 中设置以下 2 个属性(如评论中提到的 Alasdair):

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

org.quartz.threadExecutor.workManagerName 的名称可以是您在 WebSphere 中配置的任何工作管理器的 JNDI 名称。我建议简单地使用 wm/default,因为默认情况下它在您的配置中。

关于datasource - Quartz 计划作业无法访问 Websphere 中的数据源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37871237/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com