Changed how Consumers are assigned to Processors. Previously, a Consumer and error Consumer could only be passed into the constructor. This was limiting in not allowing user code to deregister a Consumer. Added code to allow multiple Consumers to be assigned to a processor after its creation and also provided a cancel(Consumer) method so user code could later remove a Consumer. Adding and removing Consumers will affect throughput as the message handling will synchronize around the Consumers in order to reduce the potential for message loss when Consumers are added or removed. The safest way to work with a Processor is to not add or remove Consumers but that may not always be practical. These methods provide that little extra bit of flexibility when Consumers should be dynamically added and removed.