我正在作一个消息处理方面的开发,Ejb的方法已经写好,但是web端调用时报错java.lang.IllegalStateException: Cannot commit transaction. xid=106:2fded26aad02662a, status=Committed
我的Ejb 方法的代码如下:
实现方法:
public final void Message(Long msgId) throws PFException {
// begin-user-code
//System.out.println("Message Driven Bean got message " + jmsMsg);
// TODO: do business logic here
String strDealResult = "FAILED";
if (log.isDebugEnabled()) log.debug("开始消息bean收到数据...");
try {
Thread.sleep(2000);
Resources res = Resources.currentThreadResources("消息处理BEAN");
res.commitCurrentTransaction();
log.debug("msgId:"+msgId);
try {
res.beginNewTransaction(Resources.tableToUWFE,false);
OmsMessageLog OmsMessage = (OmsMessageLog)findSession().get(OmsMessageLog.class,msgId);
LongJmsMessageId = msgId;
strMessageContent = OmsMessage.getMsg1();
strMessageType = OmsMessage.getMsgType();
OmsInterfaceData jmsData = new OmsInterfaceData(OmsMessage.getMsg1());
//根据xml解析过来的WORK_FLOW_TEMPLATE_CODE获得定单类型,然后根据定单类型进行不同的消息处理
dealMessage(jmsData);
res.commitTransaction();
strDealResult = "SUCCESS";
} catch (java.lang.Throwable t) {
try{
res.rollbackTransaction();
}catch(java.lang.Throwable t1){
log.error(t.getMessage(),t);
t1.printStackTrace();
}
log.error(t.getMessage(), t);
t.printStackTrace();
}
try{
res.beginNewTransaction(Resources.tableToUWFE,false);
if (log.isDebugEnabled()) log.debug("开始执行修改消息处理结果!");
if(strDealResult.equals("SUCCESS"))
{
PreparedStatement preparedstatement = null;
try{
preparedstatement = findSession().connection().prepareStatement("DELETE FROM OMS_MESSAGE_FAIL_LOG WHERE MESSAGE_ID = ? ");
preparedstatement.setLong(1, msgId.longValue());
preparedstatement.executeUpdate();
}catch( SQLException se ){
throw new RMException( "删除OMS_MESSAGE_FAIL_LOG表时出错,设备ID是:" + msgId + "SQLEror是:"+ se.getMessage() );
}finally{
if( preparedstatement != null ){
try{
preparedstatement.close();
}catch( SQLException e ){
log.error( "关闭preparedStatment失败,继续运行" + e );
}
}
}
}
AgentHelper.recordMessageDealResult(msgId,strDealResult);
if (log.isDebugEnabled()) log.debug("结束提交修改消息处理结果!");
res.commitTransaction();
if (log.isDebugEnabled()) log.debug("结束提交修改消息处理结果!");
}catch(java.lang.Throwable t){
try{
if (log.isDebugEnabled()) log.debug("回滚提交修改消息处理结果!");
res.rollbackTransaction();
if (log.isDebugEnabled()) log.debug("结束回滚提交修改消息处理结果!");
}catch(java.lang.Throwable t1){
log.error(t.getMessage(),t);
t1.printStackTrace();
}
}
}
catch (java.lang.Throwable t) {
log.error(strMessageTitle + ":发送消息发生异常!" + t.getMessage(), t);
throw new PFException(strMessageTitle + ":发送消息发生异常!" + t.getMessage());
}
finally{
Resources.closeThreadResources("消息处理BEAN");
}
log.debug("消息处理结束");
}
Ejb Bean调用:
public void Message (Long strMsgId) throws PFException {
try {
Config newConfig = new Config();
newConfig.Message(strMsgId);
log.debug("OMS消息重发调用结束");
} catch (java.lang.Throwable t) {
log.error(strMessageTitle + ":重新发送消息发生异常!" + t.getMessage(), t);
throw new PFException(strMessageTitle + ":重新发送消息发生异常!" + t.getMessage());
}
}
web端的调用方法:
public void Message(HttpServletRequest request,
HttpServletResponse response) throws Throwable {
request.setCharacterEncoding("GBK");
String strMsgId = request.getParameter("strMsgId");
PrintWriter writer = response.getWriter();
log.debug("strMsgId:"+strMsgId);
log.debug("Long.getLong(strMsgId):"+new Long(strMsgId));
try {
if (OmsConst.ServicePosition.equals(OmsConst.ServicePosition_REMOTE)) {
ComponentDispatcher remote = OmsHelper.findRemoteComponentDispatcher();
log.debug("消息重发调用结束web");
remote.Message(new Long(strMsgId));
log.debug("消息重发调用结束web");
remote.remove();
}
else if (OmsConst.ServicePosition.equals(OmsConst.ServicePosition_LOCAL)){
ComponentDispatcherLocal local = OmsHelper.findLocalComponentDispatcher();
log.debug("消息重发调用结束web");
local.Message(new Long(strMsgId));
log.debug("消息重发调用结束web");
local.remove();
}
writer.print("TRUE");
}catch (java.lang.Throwable t) {
writer.print("TRUE");
log.error( ":发送消息发生异常!" +t.getMessage(),t);
throw new Throwable( ":发送消息发生异常!" +t.getMessage());
}
}
日志报:
(DEBUG)(Config.java:233)--开始执行修改消息处理结果!
(WARN )(Resources.java:240)--请输入申请Resources的附加信息
(WARN )(Resources.java:240)--请输入申请Resources的附加信息
(DEBUG)(Config.java:254)--结束提交修改消息处理结果!
(DEBUG)(Config.java:256)--结束提交修改消息处理结果!
(DEBUG)(Config.java:275)--OMS消息重发结束
(DEBUG)(ComponentDispatcherBean.java:997)--OMS消息重发调用结束
(ERROR)(Message.java:96)--:发送消息发生异常!Exception while commiting Tx : 106:2fded26aad02662a; nested exception is:
java.lang.IllegalStateException: Cannot commit transaction. xid=106:2fded26aad02662a, status=Committed
java.rmi.RemoteException: Exception while commiting Tx : 106:2fded26aad02662a; nested exception is:
java.lang.IllegalStateException: Cannot commit transaction. xid=106:2fded26aad02662a, status=Committed
at weblogic.ejb20.internal.EJBRuntimeUtils.throwRemoteException(EJBRuntimeUtils.java:103)
at weblogic.ejb20.internal.BaseEJBObject.postInvoke(BaseEJBObject.java:323)
at weblogic.ejb20.internal.StatelessEJBObject.postInvoke(StatelessEJBObject.java:141)
at com.ai.oms.pf.component.ejb.ComponentDispatcherBean_b9t84k_EOImpl.ResendMessage(ComponentDispatcherBean_b9t84k_EOImpl.java:2862)
at com.ai.oms.web.config.Message.ResendMessage(Message.java:82)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:324)
at com.ai.appframe2.web.action.RequestProcessor.exeMethod(RequestProcessor.java:91)
at com.ai.appframe2.web.action.RequestProcessor.process(RequestProcessor.java:51)
at com.ai.appframe2.web.action.CentralControlServlet.execute(CentralControlServlet.java:73)
at com.ai.appframe2.web.BaseServer.processPost(BaseServer.java:123)
at com.ai.appframe2.web.BaseServer.doGet(BaseServer.java:97)
at com.ai.appframe2.web.BaseServer.doPost(BaseServer.java:87)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:760)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at weblogic.servlet.internal.ServletStubImpl$ServletInvocationAction.run(ServletStubImpl.java:1104)
at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:430)
at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:20)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:27)
at com.ai.appframe2.monitor.util.URLMonitorFilter.doFilter(URLMonitorFilter.java:87)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:27)
at com.ai.oms.web.util.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:107)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:27)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:5770)
at weblogic.security.service.SecurityServiceManager.runAs(SecurityServiceManager.java:690)
at weblogic.servlet.internal.WebAppServletContext.invokeServlet(WebAppServletContext.java:3230)
at weblogic.servlet.internal.ServletRequestImpl.execute(ServletRequestImpl.java:2642)
at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:262)
at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:224)
Caused by: java.lang.IllegalStateException: Cannot commit transaction. xid=106:2fded26aad02662a, status=Committed
at weblogic.transaction.internal.TransactionImpl.throwIllegalStateException(TransactionImpl.java:1626)
at weblogic.transaction.internal.TransactionImpl.checkIfCommitPossible(TransactionImpl.java:1528)
at weblogic.transaction.internal.ServerTransactionImpl.internalCommit(ServerTransactionImpl.java:256)
at weblogic.transaction.internal.ServerTransactionImpl.commit(ServerTransactionImpl.java:234)
at weblogic.ejb20.internal.BaseEJBObject.postInvoke(BaseEJBObject.java:300)
... 29 more