We recently purchased WLS 6.1 and we have been using the product for the last few months. I am having a problem which I have detailed below. I have provided as much information as possible. If you need additional information, please let me know. Server A Config: Pentium III, 1000Mhz Windows 2000, SP2 WLS WebLogic Server 6.1 SP2 12/18/2001 11:13:46 #154529 Server B Config: SunBlade 100 Solaris 5.8 WebLogic Server 6.1 SP2 12/18/2001 11:13:46 #154529 Server A contains a session EJB called GoalManager. This EJB has a method named cancel(). The transactional attribute for all methods supported by this bean is REQUIRED. GoalManager uses a transactional data source deployed on Server A named "goal". There is nothing special about this data source aside from the fact that I have enabled two phase commit for it because a previous error was indicating that this was a required setting for the pool. A JMS server exists on Server B. A queue named "emailQueue" is set up as a destination on this JMS server. I also have a MDB on Server B that listens for messages on this queue. When a message is received, the MDB's onMessage() method extracts some properties from the message and sends an email to the specified recipient in the message. I have confirmed that this queue and MDB are working properly because I ran a small test program from the command prompt which creates a message and sends it to the queue on Server B. The MDB gets the message and sends the email to the correct recipient, so I am sure there are no misconfigurations on the server. The problem is as follows: The cancel() method in the GoalManager EJB on Server A performs some database work. If no exceptions are raised, the last task in the method attempts to access the queue on Server B and send a message to the queue. Here is the code that I am using to access the queue: QueueConnectionFactory queueFactory = (QueueConnectionFactory)context.lookup( "javax.jms.QueueConnectionFactory"); QueueConnection queueConnection = queueFactory.createQueueConnection(); Queue queue = (Queue)context.lookup( "emailQueue"); QueueSession queueSession = queueConnection.createQueueSession( false, Session.AUTO_ACKNOWLEDGE); QueueSender queueSender = queueSession.createSender( queue);
The cancel() method executes without error, but when the EJB container on Server A attempts to commit the transaction at the end of the method, I am receiving the following error on Server A's log:
<Error> <EJB> <Exception during commit of transaction Name=[EJB com.frx.emp.go.ejb.session.goal.GoalManagerBean.cancelGoal(com.frx.emp.entity.Employee,com.frx.emp.go.entity.Goal)], Xid=0:7c2dda32cf39a36e(6911242), Status=Rolled back. [Reason=javax.transaction.xa.XAException], numRepliesOwedMe=0, numRepliesOwedOthers=0, seconds since begin=2, seconds left=10, ServerResourceInfo[weblogic.jdbc.jts.Connection]=(state=rolledback,assigned=server1), ServerResourceInfo[JMS_EMailServer_NotDurable]=(state=rolledback,assigned=server1), SCInfo[FRX+server1]=(state=rolledback), SCInfo[frxnet+wlsvr1]=(state=rolledback), properties=({weblogic.transaction.name=[EJB com.frx.emp.go.ejb.session.goal.GoalManagerBean.cancelGoal(com.frx.emp.entity.Employee,com.frx.emp.go.entity.Goal)], weblogic.jdbc=t3://172.16.200.9:9005}), OwnerTransactionManager=ServerTM[ServerCoordinatorDescriptor=(CoordinatorURL=server1+172.16.200.9:9005+FRX+, Resources={})], CoordinatorURL=server1+172.16.200.9:9005+FRX+): javax.transaction.xa.XAException at weblogic.jms.backend.BEXAResource.prepare(BEXAResource.java:853) at weblogic.transaction.internal.ServerResourceInfo.prepare(ServerResourceInfo.java:1124) at weblogic.transaction.internal.ServerResourceInfo.prepare(ServerResourceInfo.java:370) at weblogic.transaction.internal.ServerSCInfo.startPrepare(ServerSCInfo.java:186) at weblogic.transaction.internal.ServerTransactionImpl.localPrepare(ServerTransactionImpl.java:1822) at weblogic.transaction.internal.ServerTransactionImpl.globalPrepare(ServerTransactionImpl.java:1607) at weblogic.transaction.internal.ServerTransactionImpl.internalCommit(ServerTransactionImpl.java:218) at weblogic.transaction.internal.ServerTransactionImpl.commit(ServerTransactionImpl.java:190) at weblogic.ejb20.internal.BaseEJBObject.postInvoke(BaseEJBObject.java:231) at com.frx.emp.go.ejb.session.goal.GoalManagerBean_e3dvd2_EOImpl.cancelGoal(GoalManagerBean_e3dvd2_EOImpl.java:459) at com.frx.emp.go.web.handler.UpdateGoalHandler.handleRequest(UpdateGoalHandler.java:55) at com.frx.emp.web.mvc.HandlerMappedController.service(HandlerMappedController.java:115) at javax.servlet.http.HttpServlet.service(HttpServlet.java:853) at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:265) at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:200) at weblogic.servlet.internal.WebAppServletContext.invokeServlet(WebAppServletContext.java:2495) at weblogic.servlet.internal.ServletRequestImpl.execute(ServletRequestImpl.java:2204) at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:139) at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:120) --------------- nested within: ------------------ weblogic.transaction.RollbackException: Could not prepare resource 'JMS_EMailServer_NotDurable - with nested exception: [javax.transaction.xa.XAException] at weblogic.transaction.internal.TransactionImpl.throwRollbackException(TransactionImpl.java:1475) at weblogic.transaction.internal.ServerTransactionImpl.internalCommit(ServerTransactionImpl.java:263) at weblogic.transaction.internal.ServerTransactionImpl.commit(ServerTransactionImpl.java:190) at weblogic.ejb20.internal.BaseEJBObject.postInvoke(BaseEJBObject.java:231) at com.frx.emp.go.ejb.session.goal.GoalManagerBean_e3dvd2_EOImpl.cancelGoal(GoalManagerBean_e3dvd2_EOImpl.java:459) at com.frx.emp.go.web.handler.UpdateGoalHandler.handleRequest(UpdateGoalHandler.java:55) at com.frx.emp.web.mvc.HandlerMappedController.service(HandlerMappedController.java:115) at javax.servlet.http.HttpServlet.service(HttpServlet.java:853) at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:265) at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:200) at weblogic.servlet.internal.WebAppServletContext.invokeServlet(WebAppServletContext.java:2495) at weblogic.servlet.internal.ServletRequestImpl.execute(ServletRequestImpl.java:2204) at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:139) at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:120)
Just a quick note, I tried to change the following line to specify a "transacted" JMS session by passing "true" to the statement below. When I tested this, the cancel() method raised no exceptions, but the MDB on Server B is never invoked and the email is never sent. Strange. QueueSession queueSession = queueConnection.createQueueSession( true, Session.AUTO_ACKNOWLEDGE); Any help would be greatly appreciated! SAF
I agree. Here's the link: http://ej-technologies/jprofiler - if it wasn't for jprofiler, we would need to
run our stuff on 16 servers instead of 3.