How to Customize Work Item Handlers in jBPM 6

W/ Configuration File

1) Create the SampleWorkItemHandler.java file:

import java.util.HashMap;
import java.util.Map;

import org.kie.api.runtime.process.WorkItem;
import org.kie.api.runtime.process.WorkItemHandler;
import org.kie.api.runtime.process.WorkItemManager;

public class SampleWorkItemHandler implements WorkItemHandler {

  public void abortWorkItem(WorkItem item, WorkItemManager manager) {
    manager.abortWorkItem(item.getId());
  }

  public void executeWorkItem(WorkItem item, WorkItemManager manager) {
    Map<String, Object> resultMap = new HashMap<String, Object>();

    resultMap.put("name", "value");

    manager.completeWorkItem(item.getId(), resultMap);
  }

}

2) Create the /META-INF/SampleWorkItemHandlers.conf file:

[
  "Sample": new SampleWorkItemHandler() # incompatible with CDI
]

3) Create the /META-INF/drools.session.conf file:

drools.workItemHandlers=SampleWorkItemHandlers.conf

W/ KIE API

1) Create the SampleWorkItemHandler.java file:

import java.util.HashMap;
import java.util.Map;

import org.kie.api.runtime.process.WorkItem;
import org.kie.api.runtime.process.WorkItemHandler;
import org.kie.api.runtime.process.WorkItemManager;

public class SampleWorkItemHandler implements WorkItemHandler {

  public void abortWorkItem(WorkItem item, WorkItemManager manager) {
    manager.abortWorkItem(item.getId());
  }

  public void executeWorkItem(WorkItem item, WorkItemManager manager) {
    Map<String, Object> resultMap = new HashMap<String, Object>();

    resultMap.put("name", "value");

    manager.completeWorkItem(item.getId(), resultMap);
  }

}

2) Create the SampleServlet.java file:

import java.util.HashMap;
import java.util.Map;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.kie.api.runtime.KieSession;
import org.kie.api.runtime.manager.RuntimeEngine;
import org.kie.api.runtime.manager.RuntimeManager;
import org.kie.api.runtime.process.WorkItemManager;

@WebServlet(name = "SampleServlet", value = "/")
public class SampleServlet extends HttpServlet {

  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
    RuntimeManager runtimeManager = ... // or inject it

    RuntimeEngine runtimeEngine = runtimeManager.getRuntimeEngine(...);

    KieSession sess = engine.getKieSession();

    WorkItemManager workItemManager = sess.getWorkItemManager();

    workItemManager.registerWorkItemHandler("Sample", new SampleWorkItemHandler()); // or inject it

    ...
  }

}

W/ Work Item Handler Producer

1) Create the SampleWorkItemHandler.java file:

import java.util.HashMap;
import java.util.Map;

import org.kie.api.runtime.process.WorkItem;
import org.kie.api.runtime.process.WorkItemHandler;
import org.kie.api.runtime.process.WorkItemManager;

public class SampleWorkItemHandler implements WorkItemHandler {

  public void abortWorkItem(WorkItem item, WorkItemManager manager) {
    manager.abortWorkItem(item.getId());
  }

  public void executeWorkItem(WorkItem item, WorkItemManager manager) {
    Map<String, Object> resultMap = new HashMap<String, Object>();

    resultMap.put("name", "value");

    manager.completeWorkItem(item.getId(), resultMap);
  }

}

2) Create the SampleWorkItemHandlerProducer.java file:

import java.util.HashMap;
import java.util.Map;

import org.jbpm.runtime.manager.api.WorkItemHandlerProducer;
import org.kie.api.runtime.process.WorkItemHandler;

public class SampleWorkItemHandlerProducer implements WorkItemHandlerProducer {

  @Override
  public Map<String, WorkItemHandler> getWorkItemHandlers(String identifier, Map<String, Object> params) {
    Map<String, WorkItemHandler> workItemHandlers = new HashMap<String, WorkItemHandler>();

    workItemHandlers.put("Sample", new SampleWorkItemHandler()); // inject if using CDI

    return workItemHandlers;
  }

}

3) Create the SampleServlet.java file:

import java.util.HashMap;
import java.util.Map;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.jbpm.runtime.manager.impl.cdi.InjectableRegisterableItemsFactory;
import org.kie.api.runtime.KieSession;
import org.kie.api.runtime.manager.RuntimeEngine;
import org.kie.api.runtime.manager.RuntimeEnvironment;
import org.kie.api.runtime.manager.RuntimeEnvironmentBuilder;
import org.kie.api.runtime.manager.RuntimeManager;

@WebServlet(name = "SampleServlet", value = "/")
public class SampleServlet extends HttpServlet {

  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
    RuntimeEnvironment env = RuntimeEnvironmentBuilder.Factory.get()...registerableItemsFactory(new InjectableRegisterableItemsFactory()).get(); // or inject it

    RuntimeManager runtimeManager = ... // or inject it

    RuntimeEngine runtimeEngine = runtimeManager.getRuntimeEngine(...);

    KieSession sess = engine.getKieSession();

    ...
  }

}

Published by:

Fernando Ribeiro

Experienced tech executive with a 24-year track record in enterprise computing. Leading AWS's professional services application modernization division in Brazil. He's held diverse roles including management, solutions architecture, sales consultancy, and full-stack development at major players like Oracle, Red Hat, and IBM. Fernando also contributes to open source and writes about emerging technologies. The views expressed here are his own and do not necessarily reflect the views of AWS.

Categories SoftwareTags , , Leave a comment

Leave a comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.