【问题标题】:Can't configure EJB Timers with PostgreSQL on Websphere无法在 Websphere 上使用 PostgreSQL 配置 EJB 计时器
【发布时间】:2017-10-03 13:37:15
【问题描述】:

我在 Websphere 容器上部署了一个应用程序,并通过容器配置了 EJB Timer 调度程序。

我配置了一个 oracle 数据库,一切运行顺利。

现在我正在尝试将数据库从 Oracle 更改为 postgres SQL,并完成了所有需要的工作,包括创建新的数据源、驱动程序等。 Websphere 确实设法通过数据源连接到数据库。 我正在使用与我的 oracle 数据库相同的 Jndi,因此代码中不需要额外的工作。

当我尝试启动应用程序并安装新的 EAR 文件时,出现以下异常:

WebSphere:name=ApplicationManager,process=server1,platform=proxy,node=localhostNode01,version=8.5.5.10,type=ApplicationManager,mbeanIdentifier=ApplicationManager,cell=localhostNode01Cell,spec=1.0 异常是:javax.management.MBeanException : 尝试调用操作 startApplication 时在 RequiredModelMBean 中引发异常 在 javax.management.modelmbean.RequiredModelMBean.invokeMethod(RequiredModelMBean.java:1304) 在 javax.management.modelmbean.RequiredModelMBean.invoke(RequiredModelMBean.java:1093) 在 com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:832) 在 com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:814) 在 com.ibm.ws.management.AdminServiceImpl$1.run(AdminServiceImpl.java:1350) 在 com.ibm.ws.security.util.AccessController.doPrivileged(AccessController.java:118) 在 com.ibm.ws.management.AdminServiceImpl.invoke(AdminServiceImpl.java:1243) 在 com.ibm.ws.management.application.AppManagementImpl._startApplication(AppManagementImpl.java:1482) 在 com.ibm.ws.management.application.AppManagementImpl.startApplication(AppManagementImpl.java:1371) 在 com.ibm.ws.management.application.AppManagementImpl.startApplication(AppManagementImpl.java:1320) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:95) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:56) 在 java.lang.reflect.Method.invoke(Method.java:620) 在 sun.reflect.misc.Trampoline.invoke(MethodUtil.java:88) 在 sun.reflect.GeneratedMethodAccessor31.invoke(未知来源) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:56) 在 java.lang.reflect.Method.invoke(Method.java:620) 在 sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:292) 在 javax.management.modelmbean.RequiredModelMBean$4.run(RequiredModelMBean.java:1261) 在 java.security.AccessController.doPrivileged(AccessController.java:422) 在 java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:88) 在 javax.management.modelmbean.RequiredModelMBean.invokeMethod(RequiredModelMBean.java:1255) 在 javax.management.modelmbean.RequiredModelMBean.invoke(RequiredModelMBean.java:1093) 在 com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:832) 在 com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:814) 在 com.ibm.ws.management.AdminServiceImpl$1.run(AdminServiceImpl.java:1350) 在 com.ibm.ws.security.util.AccessController.doPrivileged(AccessController.java:118) 在 com.ibm.ws.management.AdminServiceImpl.invoke(AdminServiceImpl.java:1243) 在 com.ibm.ws.management.connector.AdminServiceDelegator.invoke(AdminServiceDelegator.java:181) 在 sun.reflect.GeneratedMethodAccessor38.invoke(未知来源) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:56) 在 java.lang.reflect.Method.invoke(Method.java:620) 在 com.ibm.ws.management.connector.soap.SOAPConnector.invoke(SOAPConnector.java:488) 在 com.ibm.ws.management.connector.soap.SOAPConnector.service(SOAPConnector.java:324) 在 com.ibm.ws.management.connector.soap.SOAPConnection.handleRequest(SOAPConnection.java:65) 在 com.ibm.ws.http.HttpConnection.readAndHandleRequest(HttpConnection.java:733) 在 com.ibm.ws.http.HttpConnection.run(HttpConnection.java:522) 在 com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1892) 引起:com.ibm.ws.exception.RuntimeError: com.ibm.websphere.csi.EJBContainerException: EJB Timer Service not started 在 com.ibm.ws.ejbcontainer.runtime.AbstractEJBRuntime.startModule(AbstractEJBRuntime.java:731) 在 com.ibm.ws.ejbcontainer.runtime.SharedEJBRuntimeImpl.startModule(SharedEJBRuntimeImpl.java:338) 在 com.ibm.ws.runtime.component.EJBContainerImpl.start(EJBContainerImpl.java:3588) 在 com.ibm.ws.runtime.component.ApplicationMgrImpl.start(ApplicationMgrImpl.java:1179) 在 com.ibm.ws.runtime.component.DeployedApplicationImpl.fireDeployedObjectStart(DeployedApplicationImpl.java:1390) 在 com.ibm.ws.runtime.component.DeployedModuleImpl.start(DeployedModuleImpl.java:639) 在 com.ibm.ws.runtime.component.DeployedApplicationImpl.start(DeployedApplicationImpl.java:979) 在 com.ibm.ws.runtime.component.ApplicationMgrImpl.startApplication(ApplicationMgrImpl.java:778) 在 com.ibm.ws.runtime.component.ApplicationMgrImpl.startApplicationDynamically(ApplicationMgrImpl.java:1381) 在 com.ibm.ws.runtime.component.ApplicationMgrImpl.start(ApplicationMgrImpl.java:2192) 在 com.ibm.ws.runtime.component.CompositionUnitMgrImpl.start(CompositionUnitMgrImpl.java:435) 在 com.ibm.ws.runtime.component.CompositionUnitImpl.start(CompositionUnitImpl.java:123) 在 com.ibm.ws.runtime.component.CompositionUnitMgrImpl.start(CompositionUnitMgrImpl.java:378) 在 com.ibm.ws.runtime.component.CompositionUnitMgrImpl.access 500 美元(CompositionUnitMgrImpl.java:126) 在 com.ibm.ws.runtime.component.CompositionUnitMgrImpl$1.run(CompositionUnitMgrImpl.java:653) 在 com.ibm.ws.security.auth.ContextManagerImpl.runAs(ContextManagerImpl.java:5396) 在 com.ibm.ws.security.auth.ContextManagerImpl.runAsSystem(ContextManagerImpl.java:5612) 在 com.ibm.ws.security.core.SecurityContext.runAsSystem(SecurityContext.java:255) 在 com.ibm.ws.runtime.component.CompositionUnitMgrImpl.startCompositionUnit(CompositionUnitMgrImpl.java:667) 在 com.ibm.ws.runtime.component.CompositionUnitMgrImpl.startCompositionUnit(CompositionUnitMgrImpl.java:611) 在 com.ibm.ws.runtime.component.ApplicationMgrImpl.startApplication(ApplicationMgrImpl.java:1271) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:95) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:56) 在 java.lang.reflect.Method.invoke(Method.java:620) 在 sun.reflect.misc.Trampoline.invoke(MethodUtil.java:88) 在 sun.reflect.GeneratedMethodAccessor31.invoke(未知来源) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:56) 在 java.lang.reflect.Method.invoke(Method.java:620) 在 sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:292) 在 javax.management.modelmbean.RequiredModelMBean$4.run(RequiredModelMBean.java:1261) 在 java.security.AccessController.doPrivileged(AccessController.java:422) 在 java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:88) 在 javax.management.modelmbean.RequiredModelMBean.invokeMethod(RequiredModelMBean.java:1255) ... 38 更多 原因:com.ibm.websphere.csi.EJBContainerException:EJB 计时器服务未启动 在 com.ibm.ws.runtime.component.EJBContainerImpl.getSchedulerInstance(EJBContainerImpl.java:2082) 在 com.ibm.ws.runtime.component.EJBContainerImpl.initializeTimerService(EJBContainerImpl.java:1827) 在 com.ibm.ws.runtime.component.WASEJBRuntimeImpl.initializeTimerService(WASEJBRuntimeImpl.java:540) 在 com.ibm.ws.ejbcontainer.runtime.AbstractEJBRuntime.startModule(AbstractEJBRuntime.java:575) ... 71 更多 原因:com.ibm.ws.scheduler.exception.SchedulerDataStoreException:com.ibm.ws.extensionhelper.exception.UnknownDatabaseException:无法检测到数据库供应商。供应商字符串是 PostgreSQL 在 com.ibm.ws.scheduler.WASSchedulerCfgHelper.createTables(WASSchedulerCfgHelper.java:546) 在 com.ibm.ws.runtime.component.EJBContainerImpl.createTimerTables(EJBContainerImpl.java:2712) 在 com.ibm.ws.runtime.component.EJBContainerImpl.getSchedulerInstance(EJBContainerImpl.java:2025) ... 74 更多 原因:com.ibm.ws.extensionhelper.exception.UnknownDatabaseException:无法检测到数据库供应商。供应商字符串是 PostgreSQL 在 com.ibm.ws.extensionhelper.db.impl.DatabaseHelperImpl.connect(DatabaseHelperImpl.java:672) 在 com.ibm.ws.extensionhelper.db.impl.DatabaseHelperImpl.initialize(DatabaseHelperImpl.java:501) 在 com.ibm.ws.extensionhelper.db.impl.DatabaseHelperImpl.(DatabaseHelperImpl.java:261) 在 com.ibm.ws.extensionhelper.impl.ExtensionHelperServiceImpl.getDatabaseHelper(ExtensionHelperServiceImpl.java:116) 在 com.ibm.ws.scheduler.DBHelperImpl.(DBHelperImpl.java:108) 在 com.ibm.ws.scheduler.WASSchedulerCfgHelper.getDatabaseHelper(WASSchedulerCfgHelper.java:959) 在 com.ibm.ws.scheduler.WASSchedulerCfgHelper.createTables(WASSchedulerCfgHelper.java:541) ... 76 更多

[10/3/17 16:19:42:601 IDT] 00000067 ServletWrappe

我认为在摆脱 IBM 调度程序并移动 EJB 标准 Timer 之后,我不会得到这个异常。

知道如何克服这个问题吗?

【问题讨论】:

    标签: java postgresql web-services ejb websphere


    【解决方案1】:

    EJB Persistent Timers 的实现仍由数据库支持,因此该功能受限于应用程序服务器与其内置互操作性的数据库供应商(不同数据库供应商的 SQL 命令差异很大)。 WebSphere Application Server 传统版没有为 EJB 持久计时器(或其调度程序)内置与 PostgreSQL 的互操作性,这就是您看到错误的原因:

    UnknownDatabaseException: Could not detect database vendor. Vendor string was PostgreSQL
    

    也就是说,您也许可以让 PostgreSQL 在 WebSphere Application Server Liberty(与传统相反)上为 EJB 持久计时器工作,因为 Liberty 实现是基于 JPA 而不是 SQL。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-30
      • 2017-10-27
      • 1970-01-01
      相关资源
      最近更新 更多