websphere集群环境下使用sqlserver XA存储EJB Timer的 xa_rollback异常处理



websphere集群环境下使用sqlserver XA存储EJB Timer的 xa_rollback异常处理

Tomcat用的多啊,自从跳槽,接触的都是JBoss,WebSphere,weblogic什么的,看来环境不一样,用的东西真是差太多了。

记录下来到这里后遇到的第一个问题。

问题描述:公司产品使用的EJB Timer实现任务调度(我X),结果在WAS集群环境发现EJB Timer启动出现异常,异常信息(红毛儿语言,〇疼):
Java代码 收藏代码
data(000001473dcb128200000001000000790307be0ccbedc421199f30b5b214d3174ae0cade000001473dcb12820000000
1000000790307be0ccbedc421199f30b5b214d3174ae0cade000000010000000000000000000000000001)}
: javax.transaction.xa.XAException: Функция ROLLBACK: завершилась ошибкой.
Состояние: -4. Ошибка: “*** SQLJDBC_XA DTC_ERROR Context: xa_rollback,
state=1, StatusCode:-4 (0xFFFFFFFC) ***”.

at
com.microsoft.sqlserver.jdbc.SQLServerXAResource.DTC_XA_Interface(SQLServerXAResource.java:550)

at
com.microsoft.sqlserver.jdbc.SQLServerXAResource.rollback(SQLServerXAResource.java:718)

at
com.ibm.ws.rsadapter.spi.WSRdbXaResourceImpl.rollback(WSRdbXaResourceImpl.java:1321)

at
com.ibm.ejs.j2c.XATransactionWrapper.rollback(XATransactionWrapper.java:1303)
问题背景和解决方案:


首先,集群环境为了保证各节点的Timer同步,舍弃了WAS自带的Timer持久化,而使用我们自己的数据库作为WAS存储Timer数据的地方。WAS存储Timer的四张表:”LMGR”,”LMPR”,”TASK”,”TREG”。

其次,因为不同的节点,所以要使用分布式事务(XA),SQLServer在2012之前默认是不启用这个功能的,需要手动实现,配置方式详见http://guanzhilibai.blog.163.com/blog/static/13587993201171052712887/
记录一下基本步骤:
1.MSDTC中启动XA功能
2.将sqljdbc_xa.dll拷贝到SQLServer的Binn目录
3.执行xa_install.sql存储脚本,会在master表的Programability–Extended Stored Procedures下生成一堆存储过程,并且生成一个新的role:sqlJDBCXAUser。在你要使用的用户设置中,UserMapping–>选中master行–>勾选下面的sqlJDBCXAUser即可。
4.应用中必须使用SQLServer提供的sqljdbc4.jar这个Driver

再次,依据上面所说的,在WAS中创建Scheduler,并且使用这个XA的数据源和sqljdbc4的驱动。

问题出现后,发现数据库中WAS的表已经创建,已经确定XA配置无误。

在WAS的Resources–Schedulers中点击Drop table,报错无法删除。

在数据库中手动Drop table(那四个表),再回到WAS的schedulers中点击Create table,问题解决。

原因不明,估计这四个表是在XA没配置好的时候就创建了,再使用XA导致出现异常。