Using Savepoints
AepMessageSender sender;
AepEngine engine;
@EventHandler
public void onNewOrder(NewOrderMessage newOrder, MyAppState state) {
// create a savepoint
int beforeProcessing = engine.createTransactionSavePoint();
Customer customer = state.getCustomers().getCustomer(newOrder.getCustomerId());
// update customer order count
customer.setOrdersReceived(customer.getOrdersReceived() + 1);
// on the customer's thousandth order send them a promotion
if(customer.getOrdersReceived() == 1000) {
sender.sendMessage("customer-promotions", createPromotionMessage(customer, order));
}
Product product = state.getProducts(order.getProductId());
if(product.getItemsAvailable() > newOrder.getQuantity()) {
product.setItemsAvailable(product.getItemsAvailable() - newOrder.getQuantity());
messageSender.sendMessage("order-accepted", prepareOrderAccept(newOrder));
}
else {
//uh-oh, guess we shouldn't have sent that promotion!
engine.rollbackToSavepoint(beforeProcessing);
customer.setOrdersRejected(customer.getOrdersRejected() + 1);
messageSender.sendMessage("order-rejected", prepareOrderReject(newOrder));
}
}Creating Savepoints
Getting the current savepoint
Rolling Back to a Savepoint
Rollback Errors
Outbound Message Considerations
State and Embedded Entity Considerations
Savepoints and Adaptive Batching
Savepoints and Multiple Event Handlers
Savepoint Restrictions
Savepoints and HA
State Replication
Event Sourcing
Last updated