testProcess4.bpmn (31.3 KB)
public class SmartShipGoodService extends PublishSubscribeAdapter {
private static Integer count = 0;
public void execute(final ActivityExecution context) throws Exception {
addMessageSubscription(context, "Message_shipping");
System.out.println("(back-end | ShipGoodAdapter) call (Supplier) micro service n° "+context.getVariable("loopCounter"));
}
}
public class PublishSubscribeAdapter extends AbstractBpmnActivityBehavior {
public void signal(ActivityExecution execution, String signalName, Object signalData) throws Exception {
leave(execution);
}
protected void addMessageSubscription(final ActivityExecution context, String eventName) {
ExecutionEntity executionEntity = (ExecutionEntity)context;
EventSubscriptionEntity eventSubscriptionEntity = new EventSubscriptionEntity(executionEntity, EventType.MESSAGE);
eventSubscriptionEntity.setEventName(eventName);
eventSubscriptionEntity.setActivity(executionEntity.getActivity());
eventSubscriptionEntity.insert();
}
}
@Test
@Deployment(resources = {"testProcess4.bpmn"})
public void shouldExecuteProcess4() {
ProcessInstance processInstance = runtimeService().startProcessInstanceByKey("testProcess4");
List<Execution> messagesShipping = getExecutions(processInstance); // cardinality is 5 for the subprocess
for (int i = 0; i < messagesShipping.size(); i++) {
Map<String, Object> variables = new HashMap<String, Object>();
if (i == 3) { // set i == 30 to avoid sub process signal and arrive to the global compensation
System.out.println("-------------------");
System.out.println("(back-end) send step 2 ship good compensation !!!!");
System.out.println("-------------------");
variables.put("success", false);
} else {
variables.put("success", true);
}
// compensate received message added programmatically be SmartShipGoodService
// some message sending can failed due to sub process signal launch and the compensation already append
runtimeService().messageEventReceived("Message_shipping", messagesShipping.get(i).getId(), variables);
}
}
private List<Execution> getExecutions(ProcessInstance processInstance) {
return executionQuery().processInstanceId(processInstance.getId()).messageEventSubscriptionName("Message_shipping").list();
}