Threads processor that leverage a thread pool for continue processing the Exchanges
using the asynchronous routing engine.

Notice: For transacted routes then this ThreadsProcessor is not in use, as we want to
process messages using the same thread to support all work done in the same transaction. The reason
is that the transaction manager that orchestrate the transaction, requires all the work to be done
on the same thread.

Pay attention to how this processor handles rejected tasks.

Abort - The current exchange will be set with a RejectedExecutionException exception,
and marked to stop continue routing.
The UnitOfWork will be regarded as failed, due the exception.

Discard - The current exchange will be marked to stop continue routing (notice no exception is set).
The UnitOfWork will be regarded as successful, due no exception being set.

DiscardOldest - The oldest exchange will be marked to stop continue routing (notice no exception is set).
The UnitOfWork will be regarded as successful, due no exception being set.
And the current exchange will be added to the task queue.

CallerRuns - The current exchange will be processed by the current thread. Which mean the current thread
will not be free to process a new exchange, as its processing the current exchange.

callback - the AsyncCallback will be invoked when the processing of the exchange is completed.
If the exchange is completed synchronously, then the callback is also invoked synchronously.
The callback should therefore be careful of starting recursive loop.

doStop

Implementations override this method to support customized start/stop.

Important: Camel will invoke this ServiceSupport.doStop() method when
the service is being stopped. This method will also be invoked
if the service is still in uninitialized state (eg has not
been started). The method is always called to allow the service
to do custom logic when the service is being stopped, such as when
CamelContext is shutting down.