2015-03-19 89 views
1

我们使用Websphere 8 Application Server,并且想在我们的Web应用程序中使用服务器workmanager。我正在尝试获得对jca工作管理员javax.resource.spi.work.Workmanager的引用,以便与Springs org.springframework.jca.work.WorkManagerTaskExecutor一起使用它。如何在Spring Websphere 8上获得JCA Workmanager WorkManagerTaskExecutor

的resource-ref在web.xml看起来是这样的:

<resource-ref> 
<res-ref-name>workmanager/web</res-ref-name> 
<res-type>javax.resource.spi.work.WorkManager</res-type> 
<res-auth>Container</res-auth> 
<res-sharing-scope>Shareable</res-sharing-scope> 
</resource-ref> 

使用该配置,我得到下面的异常:

Caused by: com.ibm.ws.asynchbeans.exception.AsynchBeanException: ASYN0064E: The value javax.resource.spi.work.WorkManager of the res-type resource reference element WorkManager is not right. Only the following values are allowed: com.ibm.websphere.asynchbeans.WorkManager, commonj.work.WorkManager. 
at com.ibm.ws.asynchbeans.naming.WorkManagerFactory.validateWMResRef(WorkManagerFactory.java:379) 
at com.ibm.ws.asynchbeans.naming.WorkManagerFactory.getObjectInstance(WorkManagerFactory.java:147) 
at org.apache.aries.jndi.ObjectFactoryHelper$7.run(ObjectFactoryHelper.java:338) 
at java.security.AccessController.doPrivileged(AccessController.java:362) 
at org.apache.aries.jndi.Utils.doWithRestoredPrivileges(Utils.java:155) 
at org.apache.aries.jndi.ObjectFactoryHelper.getObjectInstanceUsingObjectFactoryBuilders(ObjectFactoryHelper.java:336) 
at org.apache.aries.jndi.ObjectFactoryHelper.doGetObjectInstance(ObjectFactoryHelper.java:136) 
at org.apache.aries.jndi.ObjectFactoryHelper.access$000(ObjectFactoryHelper.java:60) 
at org.apache.aries.jndi.ObjectFactoryHelper$1.run(ObjectFactoryHelper.java:98) 
at java.security.AccessController.doPrivileged(AccessController.java:327) 
at org.apache.aries.jndi.Utils.doPrivileged(Utils.java:146) 
at org.apache.aries.jndi.ObjectFactoryHelper.getObjectInstance(ObjectFactoryHelper.java:96) 
at org.apache.aries.jndi.OSGiObjectFactoryBuilder.getObjectInstance(OSGiObjectFactoryBuilder.java:57) 
at javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:349) 
at com.ibm.ws.naming.util.Helpers.processSerializedObjectForLookupExt(Helpers.java:993) 
... 89 more 

这里说我的资源引用必须是类型为com.ibm.websphere.asynchbeans.WorkManagercommonj.work.WorkManager。它们都不是从JCA-Workmanager接口扩展而来的。

如果我将资源类型切换为commonj.work.WorkManager并在我的应用程序中使用Springs org.springframework.scheduling.commonj.WorkManagerTaskExecutor,则一切正常。

为了让JCA Workmanager与Websphere一起工作,我需要在服务器端配置一些特殊的东西吗?我还没有发现管理员控制台中的任何设置来切换实施。 Websphere 8支持Java EE 6,因此它应该能够处理JCA。

回答

1

为什么要使用特定于JCA的WorkManagerTaskExecutor而不是commonj?在JCA的WorkManager仅用于通过资源适配器,而不是任意EE组件引用中使用,并Spring documentation为JCA特有WorkManagerTaskExecutor是与一致:

这是主要用于使用JCA的ResourceAdapter内 执行

只需使用commonj WorkManager和相应的WorkManagerTaskExecutor。

+0

嗨,谢谢你的回答,最后我刚刚这样做。现在我使用commonj-interface'commonj.work.WorkManager'来获取对工作管理器的引用,并在我们的应用程序中使用相应的TaskExecutor。 老实说,我第一次在应用服务器上处理这个问题,并且我想使用JCA-workmanager,因为我认为这将是更“标准的方法”来执行它,因为它在java ee规范中。 – Lykourgos 2015-03-23 12:37:48

+1

不幸的是,在EE 7之前,没有用于执行异步任务的EE标准机制。从EE 7开始,JSR 236 API允许这样做,并且Spring使用ConcurrentTaskExecutor进行适应。 WebSphere Application Server Liberty配置文件具有JSR 236实现。 – 2015-03-24 21:31:59