[jboss-user] [jBPM] - LocalTaskService don't remove listeners, it is a bug?

gardellajp do-not-reply at jboss.com
Tue Mar 6 07:41:18 EST 2012


gardellajp [https://community.jboss.org/people/gardellajp] created the discussion

"LocalTaskService don't remove listeners, it is a bug?"

To view the discussion, visit: https://community.jboss.org/message/721802#721802

--------------------------------------------------------------
Hi,

Recently I've found that when use LocalTaskService don't remove the listeners that are created in:

  public void registerForEvent(EventKey key, boolean remove, EventResponseHandler responseHandler) {
    SimpleEventTransport transport =
        new SimpleEventTransport(taskServiceSession, responseHandler, remove);
    taskServiceSession.getService().getEventKeys().register(key, transport);
  }


Notice that a client of this method can't remove it later, becouse the method return void.

This method is called by SyncWSHumanTaskHandler.connect() 

 private void registerTaskEvents() {
 TaskCompletedHandler eventResponseHandler = new TaskCompletedHandler();
        TaskEventKey key = new TaskEventKey(TaskCompletedEvent.class, -1);
        client.registerForEvent(key, false, eventResponseHandler);
        key = new TaskEventKey(TaskFailedEvent.class, -1);
        client.registerForEvent(key, false, eventResponseHandler);
        key = new TaskEventKey(TaskSkippedEvent.class, -1);
        client.registerForEvent(key, false, eventResponseHandler);
    }


See that the listeners aren't save to remove later. If don't remove the listeners, they are invoqued later. 

I fixed this with an update of LocalTaskService. When register the events, I save each listener to then dispose it.


  public void registerForEvent(EventKey key, boolean remove, EventResponseHandler responseHandler) {
    SimpleEventTransport transport =
        new SimpleEventTransport(taskServiceSession, responseHandler, remove);
    taskServiceSession.getService().getEventKeys().register(key, transport);
    //ADDED
    eventsRegistered.add(new KeyAndTransport(key, transport));
   //END ADDED
  }


The class KeyAndTransport have two instances variables, the key and the transport. The instance variable eventsRegistered is a collection. Then, when is disconnected, I remove the listeners.

public void disconnect() throws Exception {
    // do nothing
    // ADDED
    removeListeners();
   // END ADDED
  }



  private synchronized void removeListeners() {
    for (KeyAndTransport k : eventsRegistered) {
      taskServiceSession.getService().getEventKeys().unregister(k.getKey(), k.getTransport());
    }
    eventsRegistered.clear();
  }


I attach the complete file. I want to know if this is a bug or a miss use of this clasess. I have problems when use more than one session, with this change, work well with multiple sessions. Note that in my project I open and close session in each request, so when I close the session (and other resources) I can't remove the listener with the actual API.

Juan
--------------------------------------------------------------

Reply to this message by going to Community
[https://community.jboss.org/message/721802#721802]

Start a new discussion in jBPM at Community
[https://community.jboss.org/choose-container!input.jspa?contentType=1&containerType=14&container=2034]

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/jboss-user/attachments/20120306/96d1eed6/attachment.html 


More information about the jboss-user mailing list