当前位置: 代码迷 >> Web前端 >> 关于Web端调用Ejb 方法报Cannot commit transaction.的有关问题
  详细解决方案

关于Web端调用Ejb 方法报Cannot commit transaction.的有关问题

热度:737   发布时间:2012-11-21 08:23:25.0
关于Web端调用Ejb 方法报Cannot commit transaction.的问题

????? 我正在作一个消息处理方面的开发,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


???

  相关解决方案