analamala [
http://community.jboss.org/people/analamala] created the discussion
"Re: How to Complete a WorkItem using REST API"
To view the discussion, visit:
http://community.jboss.org/message/631358#631358
--------------------------------------------------------------
Hello Chris,
Thanks a lot for your time. Let me step back and thank you sincerely for the information
that you posted at
http://community.jboss.org/thread/166755?start=0&tstart=0
http://community.jboss.org/thread/166755?start=0&tstart=0. Really helped in many
ways.
Coming back to this discussion, I made some progress on how to complete a workitem by
extending the REST API. To answer your question, yes, the code that I modified, is running
in the context of a jbpm engine. Here are my changes to
"gwt-console-server\WEB-INF\classes\org\jboss\bpm\console\server\ProcessMgmtFacade.java"
@POST
@Path("definition/{id}/ctr_component_complete")
@Produces("application/json")
public Response ctrComponentComplete(@PathParam("id") String definitionId,
@FormParam("sessionID") String sessionID,
@FormParam("workitemID") String workItemID) {
try {
EntityManagerFactory emf = Persistence
.createEntityManagerFactory("org.jbpm.persistence.jpa");
Environment env = KnowledgeBaseFactory.newEnvironment();
env.set(EnvironmentName.ENTITY_MANAGER_FACTORY, emf);
env.set(EnvironmentName.TRANSACTION_MANAGER,
TransactionManagerServices.getTransactionManager());
UserTransaction ut = (UserTransaction) new InitialContext()
.lookup("java:comp/UserTransaction");
env.set(EnvironmentName.TRANSACTION, ut);
StatefulKnowledgeSession ksession = JPAKnowledgeService
.loadStatefulKnowledgeSession(
new Integer(sessionID).intValue(),
readKnowledgeBase(), null, env);
ksession.getWorkItemManager().completeWorkItem(
new Long(workItemID).longValue(), null);
ksession.dispose();
return createJsonResponse("SUCCESS");
} catch (Throwable t) {
throw new WebApplicationException(t, 500);
}
}
private KnowledgeBase readKnowledgeBase() throws Exception {
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory
.newKnowledgeBuilder();
kbuilder.add(ResourceFactory.newClassPathResource("CTRWorkflow.bpmn"),
ResourceType.BPMN2);
KnowledgeBase kbase = kbuilder.newKnowledgeBase();
kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
return kbase;
}
As you can see, I am creating a new KnowledgeBase and using the parameters,
'sessionID' and 'workitemID' to accomplish this. Everything seems to be
working as per the process design. However, in the jbpm-console web application's
'Process Overview' tab, the process instance is still showing up as
'RUNNING', eventhough I can see from the logs that the process has reached the end
state. To confirm that the state is not changing, I clicked on the 'Diagram'
button to bring up the process image. The image is coming up but not updating with the
latest state.
I have a feeling that this issue may be related to creating a new KnowledgeBase rather
than using the existing KnowledgeBase that JBPM engine and the jbpm-console web
application share. To mitigate this problem, I tried to get a reference to the
KnowledgeBase by trying several alternate approaches. But by these alternate approaches, I
am not able to even complete the workitem. Here is one of the approaches that I tried.
private KnowledgeBase readKnowledgeBase() throws Exception {
KnowledgeBase kbase = null;
try {
ResourceChangeScannerConfiguration sconf =
ResourceFactory.getResourceChangeScannerService().newResourceChangeScannerConfiguration();
sconf.setProperty( "drools.resource.scanner.interval",
"10" );
ResourceFactory.getResourceChangeScannerService().configure( sconf );
ResourceFactory.getResourceChangeScannerService().start();
ResourceFactory.getResourceChangeNotifierService().start();
KnowledgeAgentConfiguration aconf =
KnowledgeAgentFactory.newKnowledgeAgentConfiguration();
aconf.setProperty("drools.agent.newInstance", "false");
KnowledgeAgent kagent = KnowledgeAgentFactory.newKnowledgeAgent("Guvnor
default", aconf);
kagent.applyChangeSet(ResourceFactory.newClassPathResource("ChangeSet.xml"));
kbase = kagent.getKnowledgeBase();
for (org.drools.definition.process.Process process: kbase.getProcesses()) {
log.debug("Loading process from Guvnor: " + process.getId());
}
} catch (Throwable t) {
if (t instanceof RuntimeException
&& "KnowledgeAgent exception while trying to
deserialize".equals(t.getMessage())) {
log.error("Could not connect to guvnor");
if (t.getCause() != null) {
System.out.println(t.getCause().getMessage());
}
}
log.error("Could not load processes from guvnor: " +
t.getMessage());
t.printStackTrace();
}
if (kbase == null) {
System.out.println("kbase is NULL");
kbase = KnowledgeBaseFactory.newKnowledgeBase();
}
return kbase;
}
Here is my process image. Note that both the domain specific service tasks,
'Extraction' & 'Validation' operate in asynchronous mode, by EXCLUDING
the "manager.completeWorkItem(workItem.getId(), null);" call.
http://community.jboss.org/servlet/JiveServlet/showImage/2-631358-17153/C...
http://community.jboss.org/servlet/JiveServlet/downloadImage/2-631358-171...
I really apreciate your time on this and hope this discussion helps few more community
members out there.
Thank you.
-Ajay
--------------------------------------------------------------
Reply to this message by going to Community
[
http://community.jboss.org/message/631358#631358]
Start a new discussion in jBPM at Community
[
http://community.jboss.org/choose-container!input.jspa?contentType=1&...]