This example is based on Udi Dahan's blog post SOA, EDA, and CEP a winning combo (2008)
There are three business services: Sales, Inventory, and Shipping.
Steps:
Note that in practise it's somewhat more complex than this. Given the inherrent complexity of the business, it's important to use straightforward technical solutions.
EDA using events as messages is not the simplest approach.
In the example above, only the orders received by the Sales service which pass validation cause an OrderTentativelyAccepted event to be raised, to be consumed by the Inventory service.
Rather than use event messages, this can instead be achieved by having the Sales service define a read-only view named OrderTentativelyAccepted which is a derived relvar defined as a restriction on the OrdersReceived events according to whether they pass validation.
view OrderTentativelyAccepted = OrdersReceived WHERE <validation>
Rather than have the Inventory service consume event messages, it instead has access to the OrderTentativelyAccepted view. The Inventory service declares an insert database trigger on this view to process orders that have been tentatively accepted by the Sales service.
See the recommended approach to implementing long running business processes.