@SuppressWarnings("rawtypes") public SagaBuilder activity(String name, Class adapterClass) { // this is very handy and could also be done inline above directly String id = "Activity-" + name.replace(" ", "-"); // risky thing ;-) saga = saga.serviceTask(id).name(name).camundaClass(adapterClass.getName()); return this; }
private void createFlow() { engine.getRepositoryService().createDeployment() // .addModelInstance("order.bpmn", Bpmn.createProcess("order").executable() // .startEvent() .serviceTask().name("Retrieve payment").camundaClass(RetrievePaymentAdapter.class.getName()) .serviceTask().name("Fetch goods").camundaClass(FetchGoodsAdapter.class.getName()) .serviceTask().name("Ship goods").camundaClass(ShipGoodsAdapter.class.getName()) .endEvent().camundaExecutionListenerClass("end", OrderDeliveredAdapter.class.getName()) .done() ).deploy(); }
@SuppressWarnings("rawtypes") public SagaBuilder compensationActivity(String name, Class adapterClass) { if (!(saga instanceof AbstractActivityBuilder)) { throw new RuntimeException("Compensation activity can only be specified right after activity"); } String id = "Activity-" + name.replace(" ", "-") + "-compensation"; // risky thing ;-) ((AbstractActivityBuilder)saga) .boundaryEvent() .compensateEventDefinition() .compensateEventDefinitionDone() .compensationStart() .serviceTask(id).name(name).camundaClass(adapterClass.getName()) .compensationDone(); return this; }
/** just for visualization, needed on blog post / slide **/ private void createComplexFlow() { engine.getRepositoryService().createDeployment() // .addModelInstance("order.bpmn", Bpmn.createProcess("order").executable() // .startEvent() .serviceTask().name("A") .parallelGateway("fork1") .serviceTask().name("B") .parallelGateway("join2") .moveToNode("fork1") .serviceTask().name("C") .parallelGateway("fork2") .serviceTask().name("D") .parallelGateway("join1") .moveToNode("fork2") .serviceTask().name("E") .connectTo("join1") .connectTo("join2") .endEvent() .done() ).deploy(); } private void createCompensationFlow() {
public static void main(String[] args) { BpmnModelInstance model = Bpmn.createExecutableProcess("payment") .startEvent() .serviceTask().id("charge").name("Charge credit card").camundaClass(ChargeCreditCardAdapter.class.getName()) // .boundaryEvent().error() .serviceTask().name("Ask customer to update credit card").camundaExpression("#{true}") // noop .receiveTask().id("wait").name("Wait for new credit card data").message("CreditCardUpdated") .boundaryEvent().timerWithDuration("PT7D") // 7 days .endEvent().camundaExecutionListenerClass("end", PaymentFailedAdapter.class.getName()) .moveToActivity("wait").connectTo("charge") // loop back with new data .moveToActivity("charge") .endEvent().camundaExecutionListenerClass("end", PaymentCompletedAdapter.class.getName()) .done(); File file = new File("result.bpmn"); Bpmn.writeModelToFile(file, model); } }
private void createCompensationFlow() { engine.getRepositoryService().createDeployment() // .addModelInstance("travel.bpmn", Bpmn.createProcess("travel").executable() // .startEvent() .serviceTask().name("Reserve car") //.camundaClass(ReserveCar.class) .boundaryEvent().compensateEventDefinition().activityRef("compensateCar").compensateEventDefinitionDone() .done() ).deploy(); } }
.serviceTask("car").name("Reserve car").camundaClass(ReserveCarAdapter.class) .boundaryEvent().compensateEventDefinition().compensateEventDefinitionDone() .compensationStart().serviceTask("CancelCar").camundaClass(CancelCarAdapter.class).compensationDone() .serviceTask("hotel").name("Book hotel").camundaClass(BookHotelAdapter.class) .boundaryEvent().compensateEventDefinition().compensateEventDefinitionDone() .compensationStart().serviceTask("CancelHotel").camundaClass(CancelHotelAdapter.class).compensationDone() .serviceTask("flight").name("Book flight").camundaClass(BookFlightAdapter.class) .boundaryEvent().compensateEventDefinition().compensateEventDefinitionDone() .compensationStart().serviceTask("CancelFlight").camundaClass(CancelFlightAdapter.class).compensationDone()