Thanks for the reply, t-dome. Your solution has the advantage, that i only need 
to re-implement three classes: DBMessageService, DBMessageServiceFactory (for 
jbpm.cfg) and CommandExecutor. I my eyes, the only thing that is missing for 
clustering is the exception handling for the line


  | jbpmContext.getSession().lock(message, LockMode.UPGRADE);
  | 

When a LockAcquisitionException is thrown here, we must try to get the next 
message and skip the one we could not lock.

CommandExecutor.executeCommand():

  | ...
  | message = getAndLockNextMessage(dbMessageService, destination, 
jbpmContext.getSession());
  | // message = dbMessageService.receiveNoWait(destination);
  | 
  | // If we got a message here, we own the lock
  | if (message != null) {
  |     checkForMoreMessages = true;
  |     Command command = (Command) message;
  |     log.trace("executing command '" + command + "'");
  |     command.execute();
  |     // Because our DBMessageService does not delete the
  |     // message, we must delete it here
  |     jbpmContext.getSession().delete(message);
  | }
  | ...
  | 


  | private Message getAndLockNextMessage(DbMessageService dbMessageService, 
String destination, Session session) {
  |     Message message = dbMessageService.receiveNoWait(destination);
  |     if (message != null) {
  |     try {
  |             // try to lock the message
  |             session.lock(message, LockMode.WRITE);
  |             // Successfully locked
  |             return message;
  |     } catch (HibernateException e) {
  |             if (e.getCause() instanceof LockAcquisitionException) {
  |                     // Failed to acquire the lock - try to get next
  |                     return getAndLockNextMessage(dbMessageService, 
destination, session);
  |             } else {
  |                     throw e;
  |             }
  |     }
  |     } else {
  |     return null;
  |     }
  | }
  | 

>From the OO-Point-of-view, this is not the best solution (for me). I think 
>that the MessageService itself, regardless of which implementation is used, 
>should ensure, that the method "nextMessage()" or "receiveNoWait()" only 
>returns Message objects, that have successfully been locked.

View the original post : 
http://www.jboss.com/index.html?module=bb&op=viewtopic&p=3960288#3960288

Reply to the post : 
http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=3960288
_______________________________________________
jboss-user mailing list
jboss-user@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/jboss-user

Reply via email to