小编Mor*_*ell的帖子

WebSphere 7中的消息驱动Bean(EJB3),XA事务,错误处理

我是EJB的新手.背景:我有一个使用WebSphere缺省消息传递提供程序的MDB接收具有java.sql.DataSource的MapMessages来做一些工作,使用preparedstatement,jdbc事务等.我在ibm-ejb-bnd.xml中设置了MDB, ejb-jar.xml使用带有激活规范和目标名称的JCA适配器.我在ejb-jar和ibm-ejb-jar-bind中添加了一个java.sql.DataSource.我还在MessageListener中添加了带有@Resource注释的DataSource.

2个场景我无法理解(第一个场景已修复,请参阅更新)......

容器管理的MDB: DataSource驱动程序不兼容XA,因此我在WebSphere中启用了"Last Participant Support".但是,当MDB事务类型设置为Container时,我在提交时收到错误:

[11/28/11 10:56:10:988 MST] 0000002e RegisteredRes E   WTRN0063E: An illegal attempt to commit a one phase capable resource with existing two phase capable resources has occurred.
Run Code Online (Sandbox Code Playgroud)

也许这是因为在DataSource提交之后,返回MessageListener,它提交它作为最后一个参与者?我相信WAS 7中的默认消息传递提供程序是XA兼容的,尽管我没有看到任何明确说明的文档.

在第一个错误之后,消息会立即重新运行4次(即使根据WebSphere中的ActivationSpec应该有30秒的延迟).每次抛出相同的错误.根据MessageListener它完成没有错误,所以这个错误是美妙的隐形容器托管事务的一部分.我不认为我需要XA全局事务,因为除了JMS之外只有一个DataSource,我以编程方式处理事务回滚.此外,JMS消息,MDB是异步的,AUTO-ACKNOWLEDGE.收到消息后,可以确认消息.

如果我引入了一个应用程序错误,所以有一个Exception,我立即看到这个错误5次(没有延迟):

[11/28/11 10:16:18:857 MST] 0000002b LocalExceptio E   CNTR0020E: EJB threw an unexpected (non-declared) exception during invocation of method "onMessage" on bean...
Run Code Online (Sandbox Code Playgroud)

所以我切换到................

Bean托管MDB: 提交正在运行而没有XA错误,只发生一次.但是,错误处理仍然不像我期望或想要的那样!在MessageListener类中,捕获的异常抛出EJB异常,我认为这应该导致MDB具有我想要的行为: 异常的原因对我来说无关紧要,当MDB抛出捕获的异常时,MDB不应该是根据WebSphereActivationSpec中的属性重试? 相反,消息将立即传递给MessageListener 5次,同时抛出与容器管理的MDB相同的错误:"EJB引发了意外(未声明的)异常......"

如果我抛出RuntimeException,则不会发生"未声明(未声明)的消息"消息,但消息仍然会立即重试4次,而不是等待重试延迟.

感谢阅读,非常感谢任何帮助或见解!

更新: 我最终通过将数据源切换到XA兼容来解决XA兼容性问题.在WAS管理控制台中:Resources-> JDBC Providers-> DB2 Universal JDBC Driver Provider->将实现类名更改为:com.ibm.db2.jcc.DB2XADataSource

但是当消息失败时我仍然遇到同样的问题.它会立即重试,而不是根据WAS中的ActivationSpec.

java websphere ejb jms message-driven-bean

8
推荐指数
1
解决办法
5657
查看次数

xsl喜欢还是模糊搜索?

是否有任何xsl等效的sql模糊搜索

例如:

<xsl:for-each select="foo[foo_type like '%1%']">
Run Code Online (Sandbox Code Playgroud)

xslt foreach

6
推荐指数
1
解决办法
5001
查看次数

websphere 7和(基于应用程序)open-jpa 2

我想不使用内置的Websphere 7 jpa插件,而是使用应用程序WEB-INF/lib/open-jpa 2和专有的持久性提供程序.我无法为Websphere安装OSGI和JPA 2功能包.

最初,我只是尝试加载persistence.xml(版本="2"不支持)时收到sax解析错误.该错误是由open-jpa 1.2.3中的类抛出的.当我运行websphere/appserver/bin/wsjpaversion.bat时,会显示open-jpa 1.2.3 jar.默认情况下,它会覆盖应用程序中的open-jpa 2 jar.我创建了一个包含open-jpa 2 jar的共享库,并检查了这个配置选项:'为这个共享库使用一个独立的类加载器'.我将应用程序类加载器设置为最后加载父类,并为其分配新的共享库资源."版本2"错误消失了,但还有另一个问题.当我尝试初始化EntityManager时,我收到一个错误:

Caused by: javax.persistence.PersistenceException: Failed to load provider from META-INF/services
    at javax.persistence.spi.PersistenceProviderResolverHolder$DefaultPersistenceProviderResolver.getPersistenceProviders(PersistenceProviderResolverHolder.java:121)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:91)
    at java.lang.J9VMInternals.initializeImpl(Native Method)
    at java.lang.J9VMInternals.initialize(J9VMInternals.java:200)
    ... 2 more
Caused by: java.lang.ClassCastException: com.ibm.websphere.persistence.PersistenceProviderImpl incompatible with javax.persistence.spi.PersistenceProvider
    at javax.persistence.spi.PersistenceProviderResolverHolder$DefaultPersistenceProviderResolver.getPersistenceProviders(PersistenceProviderResolverHolder.java:110)
    ... 11 more
Run Code Online (Sandbox Code Playgroud)

还有一个细节:在persistence.xml中,provider元素设置为专有的PersistenceProviderImpl而不是默认的Websphere持久性提供程序.那么这个websphere默认来自何处以及如何防止它?(另一个重要的注意事项:当我完全删除persistence.xml时,我得到了同样的错误)

谢谢

persistence openjpa websphere-7

5
推荐指数
1
解决办法
9487
查看次数