Я начал с этого примера веб-приложения JBPM как основу моего кода. Я внес достаточно изменений, чтобы использовать код для развертывания в JBoss EAP 6.3 с помощью JBPM6.1.0.Final (мне не удалось развернуть его в WildFly 8.1 или 8.2). Я хотел изменить веб-приложение, чтобы на самом деле выполнять некоторые пользовательские базовые задачи, выполняемые человеком. Я создал объект POJO под названием PurchaseRequest и создал переменную процесса типа PurchaseRequest с именем request. Следующий код показывает, как я запускаю процесс.
PurchaseRequest purchaseRequest = new PurchaseRequest(item, user, cost);
Map<String, Object> params = new HashMap<String, Object>();
params.put("request", purchaseRequest);
processInstanceId = processService.startProcess(processId, params);
Я добавил следующую задачу сценария, чтобы показать, что переменная процесса устанавливается.
if (request == null) {
System.out.println("Output1: request is NULL");
} else {
System.out.println("Output1: request is VALID");
System.out.println("\trequester: "+request.getRequester());
System.out.println("\titem: "+request.getItem());
System.out.println("\tcost: "+request.getCost());
}
Внутри TaskServlet я добавил следующие переменные экземпляра
@Inject
@Singleton
private RuntimeEnvironment runtimeEnvironment;
Я также добавил в сервлет следующий частный метод
private void printTaskInfo(TaskSummary summary) {
RuntimeEngine runtime = processService.getRuntimeManager().getRuntimeEngine(EmptyContext
.get());
KieSession ksession = runtime.getKieSession();
ProcessInstance pi = ksession.getProcessInstance(summary.getProcessInstanceId());
//Exception is occuring on this line
org.kie.api.definition.process.Process procsess = pi.getProcess();
}
Когда я извлекаю активные задачи с помощью метода taskService.retrieveTaskList (user), я циклически просматриваю коллекцию экземпляров TaskSummary и вызываю закрытый метод, указанный выше. Когда я вызываю метод, я получаю следующую ошибку
java.lang.RuntimeException: Process instance 1[com.sample.bpmn] is disconnected.
Я чувствую, что, возможно, отклонился от цели, так как не смог найти никаких примеров того, как получить доступ к переменным процесса. Может ли кто-нибудь указать мне на пример того, как правильно получить доступ к переменным процесса из контейнера Java EE / CDI?
РЕДАКТИРОВАТЬ: Вот код, который я придумал для JBPM 6.1.
public Object getProcessVariable(Long processInstanceId, String variable) {
RuntimeEngine runtime = singletonManager.getRuntimeEngine(EmptyContext.get());
KieSession ksession = runtime.getKieSession();
ProcessInstance pi = ksession.getProcessInstance(processInstanceId);
RuleFlowProcessInstance rfpi = (RuleFlowProcessInstance)pi;
if (rfpi == null) {
return null;
}
return rfpi.getVariable(variable);
}