Calvin Chu [https://community.jboss.org/people/calvinchu101] created the 
discussion

"Re: Async service task questions"

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

--------------------------------------------------------------
Here's my quick and dirty changes for my demo.

First, I implement a WorkItemHandler to send JMS message to a request queue,
public class JmsRequestWorkItemHandler implements WorkItemHandler {
 
public void executeWorkItem(WorkItem workItem, WorkItemManager workItemMgr) {
          MessageProducer producer ;
//Some initialization of your JMS MessageProducer
...
            MapMessage mapMsg = session.createMapMessage() ;
            // Put the task ID in JMS message
            mapMsg.setString("taskid",String.valueOf(workItem.getId())) ;
            // Send the JMS message to queue
            producer.send(mapMsg);
 
           //DON'T complete the workitem here
           //workItemMgr.completeWorkItem(workItem.getId(), map) ;
}
...
}


Then register the handler in 
src/main/resources/META-INF/CustomWorkItemHandlers.conf of the 
jpm-gwt-console-server project,
[
  "Log": new org.jbpm.process.instance.impl.demo.SystemOutWorkItemHandler(),
    "JmsRequest": new my.process.workitem.jms.JmsRequestWorkItemHandler(),
]


And then create a MDB in the jpm-gwt-console-server project,
@MessageDriven(name = "ExternalResponseMDB", activationConfig = {
        @ActivationConfigProperty(propertyName = "destinationType", 
propertyValue = "javax.jms.Queue"),
        @ActivationConfigProperty(propertyName = "destination", propertyValue = 
"queue/response"),
        @ActivationConfigProperty(propertyName = "acknowledgeMode", 
propertyValue = "Auto-acknowledge") })
public class ExternalResponseMDB implements MessageListener {
 
    private final static Logger log = 
Logger.getLogger(ExternalResponseMDB.class.getName());
    
    public void onMessage(Message rcvMessage) {
        MapMessage msg = null;
        log.info("Message received by ExternalResponseMDB") ;
            if (rcvMessage instanceof MapMessage) {
                msg = (MapMessage) rcvMessage;
 
                // retrieve sessionId from message
               String id = msg.getString("taskid") ;                
 
                if (id != null && id.length()>0) {
                    try {
 
                         // Get knowledge session by 
StatefulKnowledgeSessionUtil which provided in jbpm-gwt-core-5.3.0.Final.jar
                         // As your MDB is deployed within the 
jbpm-gwt-console-server.war, gwt-core jar already in lib
                        StatefulKnowledgeSession session = 
StatefulKnowledgeSessionUtil.getStatefulKnowledgeSession() ;
 
                        // With the session, you can complete the work item here
                        
session.getWorkItemManager().completeWorkItem(Long.parseLong(id), null) ;
 
                    } catch (Throwable t) {
                        log.severe("completeWorkItem:"+t.getMessage()) ;
                    }
                }
            } else {
                log.warning("Message of wrong type: "
                        + rcvMessage.getClass().getName());
            }
    }
}


Maven clean install your jpm-gwt-console-server project and deploy it. Then you 
can use the JmsRequest service task in you workflow to send request to external 
application. The external application should keep the "taskid" and reply back 
to the response queue such that the MDB can complete the process. Please be 
noted that the StatefulKnowledgeSessionUtil would try to find and reuse a 
serialized session ID, not sure if there are any issue if the session created 
by jbpm-console and MDB shares the same session ID.

As I mention above, it is my quick and dirty approach. I think a more 
appropiate way to do this is to wait for a signal and let the 
JmsRequestWorkItemHandler to complete the work item, when response received the 
MDB then signal the workflow to continue. i.e. calling 
session.signalEvent(arg0, arg1) in MDB instead of 
session.getWorkItemManager().completeWorkItem(arg0, arg1)

Like this, unfortunately I don't have any working sample yet.
 
https://community.jboss.org/servlet/JiveServlet/showImage/2-772085-19772/HelloWorkflow-image.jpg
  
https://community.jboss.org/servlet/JiveServlet/downloadImage/2-772085-19772/450-386/HelloWorkflow-image.jpg
--------------------------------------------------------------

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

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

_______________________________________________
jboss-user mailing list
[email protected]
https://lists.jboss.org/mailman/listinfo/jboss-user

Reply via email to