[jboss-user] [JBoss Seam] - Help with MDB + Seam + jBPM - transaction issue?
bsmithjj
do-not-reply at jboss.com
Thu Feb 8 09:48:12 EST 2007
Hello,
I have an MDB that invokes a SLSB method - the method does some persistence work and signals a jBPM ProcessInstance. I am consistently getting an exception related to transactions from jBPM. Here are the classes being used:
The MDB:
| @MessageDriven(activationConfig = {
| @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
| @ActivationConfigProperty(propertyName = "destination", propertyValue = "java:/SonicJMS/Queues/AccessControl/Receive"),
| @ActivationConfigProperty(propertyName = "providerAdapterJNDI", propertyValue = "java:/SonicJMSProvider"),
| @ActivationConfigProperty(propertyName = "useDLQ", propertyValue = "false")
| }
| )
| @Name("accessControlReceiveMDB")
| public class AccessControlReceiveMDB implements MessageListener {
|
| private Log log = LogFactory.getLog(AccessControlReceiveMDB.class);
|
| @EJB(beanName = "ProvisionSuccessBean")
| private ProvisionSuccess successfulResponse;
|
| @EJB(beanName = "ProvisionFailureBean")
| private ProvisionFailure failedResponse;
|
| @Resource
| MessageDrivenContext context;
|
| //@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
| public void onMessage(javax.jms.Message message) {
| log.info("AccessControlReceiveMDB : onMessage()");
| log.info(message);
| try {
| // Grab Message Type from header.
| MessageTypes messageType = null;
| try {
| messageType = MessageTypes.valueOf(message
| .getStringProperty(MessageHeaderKeys.MessageType
| .toString()));
| } catch (Exception e) {
| messageType = MessageTypes.UnknownMessageType;
| }
|
| Long processId = null;
|
| switch (messageType) {
| case ProvisionSuccess:
| // Grab process id from header.
| try {
| processId = Long.valueOf(message.getStringProperty(MessageHeaderKeys.ProcessId.toString()));
| log.info("processId -> "+processId);
| Contexts.getEventContext().set("processId",processId);
| if (successfulResponse == null) {
| log.error("successResponse bean is null.");
| }
| successfulResponse.confirmProvisioning();
| } catch (Exception e) {
| log.error(e,e);
| log.error(
| "\nMissing Process ID in message header for message "
| + message.getJMSMessageID()
| +".\nMessage will be consumed but no processing will occur.\n"
| );
| }
| break;
|
| case ProvisionFailure:
| // Grab process id from header.
| try {
| processId = Long.valueOf(message.getStringProperty(MessageHeaderKeys.ProcessId.toString()));
| } catch (Exception e) {
| throw new Exception("Missing Process Id in Message Header. " + e);
| }
|
| failedResponse.confirmProvisioning(
| processId,
| message.getStringProperty(MessageHeaderKeys.ProvisionException.toString())
| );
| break;
|
| case ActiveUserList:
| break;
|
| case ActiveUserListCSV:
| break;
|
| case UnknownMessageType:
| log.info("Discarding message of type '"+messageType+"' - unknown message type.");
| break;
|
| }
| } catch (JMSException jmse) {
| log.error("Allowed MessageTypes -> " + Arrays.asList(MessageTypes.values()));
| log.error(jmse, jmse);
| context.setRollbackOnly();
| } catch (Exception e) {
| log.error(e, e);
| context.setRollbackOnly();
| }
| }
| }
|
The SLSB:
| @Stateless
| @Name("provisionSuccess")
| public class ProvisionSuccessBean implements ProvisionSuccess {
|
| //@Logger
| //protected Log log;
| private Log log = LogFactory.getLog(ProvisionSuccessBean.class);
|
| @PersistenceContext(unitName = "accessControlDatabase")
| protected EntityManager em;
|
| @In(create = true)
| private JbpmContext jbpmContext;
|
| public String confirmProvisioning(Long processId) {
| log.info("confirmProvisioning: " + processId);
|
| log.info("injected jbpmConext -> " + jbpmContext);
|
| ProcessInstance process = jbpmContext.getProcessInstance(processId);
| Long accessRequestId = (Long) process.getContextInstance().getVariable("accessRequestId");
|
| log.info("Access Request Id: " + accessRequestId);
| AccessRequest accessRequest = em.find(AccessRequest.class,accessRequestId.longValue());
| log.info("AccessRequest: " + accessRequest);
|
| .... A LOT OF BUSINESS LOGIC CUTOUT FROM HERE ....
| // Update the Access Request Decisions to include a complete decision.
| // Update the status of the Access Request to complete
| AccessRequestDecision decision = accessRequest.getDistributedSecurityAdminDecision();
| decision.setDecision(AccessRequestStatus.Complete);
| accessRequest.setRequestStatus(AccessRequestStatus.Complete);
| em.merge(decision);
| em.merge(accessRequest);
|
| // Signal to jBPM to move the workflow along
| log.info("Signaling workflow -> ProvisionSuccess");
|
| process.signal("ProvisionSuccess");
| jbpmContext.save(process);
|
| return "success";
| }
|
| }
|
|
The exception as seen in the JBoss console:
| 09:23:10,158 ERROR [StdServerSession] failed to commit/rollback
| org.jboss.tm.JBossRollbackException: Unable to commit, tx=TransactionImpl:XidImpl[FormatId=257, GlobalId=DEIBKST-6KZFT61/14, BranchQual=, localId=14] status=STATUS_NO_TRANSACTION; - nested throwable:
| (java.lang.NullPointerException)
| at org.jboss.tm.TransactionImpl.commit(TransactionImpl.java:372)
| at org.jboss.tm.TxManager.commit(TxManager.java:240)
| at org.jboss.jms.asf.StdServerSession.onMessage(StdServerSession.java:351)
| at progress.message.jimpl.Session.dU_(Unknown Source)
| at progress.message.jimpl.Session.run(Unknown Source)
| at org.jboss.jms.asf.StdServerSession.run(StdServerSession.java:196)
| at EDU.oswego.cs.dl.util.concurrent.PooledExecutor$Worker.run(PooledExecutor.java:743)
| at java.lang.Thread.run(Thread.java:595)
| Caused by: java.lang.NullPointerException
| at org.jboss.seam.core.ManagedJbpmContext.beforeCompletion(ManagedJbpmContext.java:94)
| at org.jboss.tm.TransactionImpl.doBeforeCompletion(TransactionImpl.java:1491)
| at org.jboss.tm.TransactionImpl.beforePrepare(TransactionImpl.java:1110)
| at org.jboss.tm.TransactionImpl.commit(TransactionImpl.java:324)
| ... 7 more
|
|
I think the following log statements from server.log show jBPM actually getting a handle to the UserTransaction:
| 2007-02-08 09:23:10,111 DEBUG [org.jbpm.persistence.db.DbPersistenceServiceFactory] creating persistence service
| 2007-02-08 09:23:10,111 DEBUG [org.jbpm.persistence.db.DbPersistenceService] creating hibernate session
| 2007-02-08 09:23:10,111 DEBUG [org.hibernate.impl.SessionImpl] opened session at timestamp: 4796189041094656
| 2007-02-08 09:23:10,127 DEBUG [org.hibernate.transaction.JTATransaction] Looking for UserTransaction under: UserTransaction
| 2007-02-08 09:23:10,127 DEBUG [org.hibernate.transaction.JTATransaction] Obtained UserTransaction
| 2007-02-08 09:23:10,127 DEBUG [org.jboss.mx.loading.RepositoryClassLoader] setRepository, repository=org.jboss.mx.loading.HeirarchicalLoaderRepository3 at 40a1e1, cl=org.jboss.mx.loading.HeirarchicalLoaderRepository3$CacheClassLoader at d3e5cc{ url=null ,addedOrder=0}
| 2007-02-08 09:23:10,127 DEBUG [org.jboss.seam.interceptors.BijectionInterceptor] disinjecting dependencies of: provisionSuccess
| 2007-02-08 09:23:10,142 DEBUG [org.jboss.seam.Component] instantiating Seam component: org.jboss.seam.core.events
|
and here we see Seam tearing down the jBPM Context and the transaction exception occuring from the server.log:
| 2007-02-08 09:23:10,142 DEBUG [org.jboss.seam.core.ManagedJbpmContext] destroying seam managed jBPM context
| 2007-02-08 09:23:10,142 DEBUG [org.jbpm.JbpmContext] closing JbpmContext
| 2007-02-08 09:23:10,142 DEBUG [org.jbpm.svc.Services] closing service 'persistence': org.jbpm.persistence.db.DbPersistenceService at 1c4f6f6
| 2007-02-08 09:23:10,142 DEBUG [org.jbpm.persistence.db.DbPersistenceService] flushing hibernate session
| 2007-02-08 09:23:10,142 DEBUG [org.hibernate.jdbc.JDBCContext] successfully registered Synchronization
| 2007-02-08 09:23:10,142 DEBUG [org.jbpm.persistence.db.DbPersistenceService] closing hibernate session
| 2007-02-08 09:23:10,142 DEBUG [org.jboss.seam.core.ManagedJbpmContext] done destroying seam managed jBPM context
| 2007-02-08 09:23:10,142 DEBUG [org.jboss.seam.Component] instantiating Seam component: org.jboss.seam.core.events
| 2007-02-08 09:23:10,142 DEBUG [org.jboss.seam.Component] initializing new instance of: org.jboss.seam.core.events
| 2007-02-08 09:23:10,142 DEBUG [org.jboss.seam.Component] done initializing: org.jboss.seam.core.events
| 2007-02-08 09:23:10,142 DEBUG [org.jboss.seam.Component] instantiating Seam component: org.jboss.seam.core.events
| 2007-02-08 09:23:10,142 DEBUG [org.jboss.seam.Component] initializing new instance of: org.jboss.seam.core.events
| 2007-02-08 09:23:10,142 DEBUG [org.jboss.seam.Component] done initializing: org.jboss.seam.core.events
| 2007-02-08 09:23:10,142 DEBUG [org.jboss.seam.core.Events] Processing event:org.jboss.seam.postDestroyContext.EVENT
| 2007-02-08 09:23:10,158 DEBUG [org.jboss.seam.contexts.Lifecycle] <<< End call
| 2007-02-08 09:23:10,158 DEBUG [org.jboss.seam.core.ManagedJbpmContext] flushing seam managed jBPM context
| 2007-02-08 09:23:10,158 DEBUG [org.jboss.util.NestedThrowable] org.jboss.util.NestedThrowable.parentTraceEnabled=true
| 2007-02-08 09:23:10,158 DEBUG [org.jboss.util.NestedThrowable] org.jboss.util.NestedThrowable.nestedTraceEnabled=false
| 2007-02-08 09:23:10,158 DEBUG [org.jboss.util.NestedThrowable] org.jboss.util.NestedThrowable.detectDuplicateNesting=true
| 2007-02-08 09:23:10,158 ERROR [org.jboss.jms.asf.StdServerSession] failed to commit/rollback
| org.jboss.tm.JBossRollbackException: Unable to commit, tx=TransactionImpl:XidImpl[FormatId=257, GlobalId=DEIBKST-6KZFT61/14, BranchQual=, localId=14] status=STATUS_NO_TRANSACTION; - nested throwable: (java.lang.NullPointerException)
| at org.jboss.tm.TransactionImpl.commit(TransactionImpl.java:372)
| at org.jboss.tm.TxManager.commit(TxManager.java:240)
| at org.jboss.jms.asf.StdServerSession.onMessage(StdServerSession.java:351)
| at progress.message.jimpl.Session.dU_(Unknown Source)
| at progress.message.jimpl.Session.run(Unknown Source)
| at org.jboss.jms.asf.StdServerSession.run(StdServerSession.java:196)
| at EDU.oswego.cs.dl.util.concurrent.PooledExecutor$Worker.run(PooledExecutor.java:743)
| at java.lang.Thread.run(Thread.java:595)
| Caused by: java.lang.NullPointerException
| at org.jboss.seam.core.ManagedJbpmContext.beforeCompletion(ManagedJbpmContext.java:94)
| at org.jboss.tm.TransactionImpl.doBeforeCompletion(TransactionImpl.java:1491)
| at org.jboss.tm.TransactionImpl.beforePrepare(TransactionImpl.java:1110)
| at org.jboss.tm.TransactionImpl.commit(TransactionImpl.java:324)
| ... 7 more
|
Any help on this is appreciated.
Thanks,
Brad Smith
View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4013058#4013058
Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4013058
More information about the jboss-user
mailing list