Created a simple Processor abstraction to leverage the Disruptor RingBuffer as close to the RingBuffer's optimal use as possible.

Facilitated use of Consumer for handling pre-allocated Operations that can hold an instance of user data. Operations are accessed via the prepare() method, the user data is set on the DTO, and the commit() method is called.

Alternatively, a batch mechanism is in place which allows the user to specify that operations occur in batch mode in the RingBuffer and a Consumer is passed to modify the user data rather than retrieving an instance from the RingBuffer. In either mode, an event Consumer can be placed on the Processor so that when the data is published into the RingBuffer, the Consumer is invoked.

Care has been taken to provide as simple and efficient use of the RingBuffer as possible for the highest possible throughput.
Added volatile to Event.id, also added synchronization for accessing id and headers since they are lazily-created. This should not be an issue, really, as its unlikely that multiple threads will be accessing and modifying an Event at once.