The consumers that update the state representation consume the CDI events as well. The following snippet shows the bean that contains the meal order state representations:
@Stateless public class MealOrders { @PersistenceContext EntityManager entityManager; public MealOrder get(UUID orderId) { return entityManager.find(MealOrder.class, orderId.toString()); } public void apply(@Observes OrderPlaced event) { MealOrder order = new MealOrder(event.getOrderInfo()); entityManager.persist(order); } public void apply(@Observes OrderStarted event) { apply(event.getOrderId(), MealOrder::start); } public void apply(@Observes MealDelivered event) { apply(event.getOrderId(), MealOrder::deliver); } private void apply(UUID orderId, Consumer<MealOrder> consumer) { MealOrder order = entityManager.find(MealOrder.class, orderId.toString()); if (order != null) consumer.accept(order); } }
This simple example represents the state of the meal orders in a relational database. As soon as a new CDI event arrives, the state of the orders is updated. The current state can be retrieved by the get() method.
The meal order domain entity is persisted via JPA. It contains the status of the order that is updated via observed CDI events:
@Entity @Table("meal_orders") public class MealOrder { @Id private String orderId; @Embedded private MealSpecification specification; @Enumerated(EnumType.STRING) private OrderState state; private MealOrder() { // required for JPA } public MealOrder(OrderInfo orderInfo) { orderId = orderInfo.getOrderId().toString(); state = OrderState.PLACED; // define specifications } public void start() { state = OrderState.STARTED; } public void deliver() { state = OrderState.DELIVERED; } ... }