A controller implementing the life cycle described in {@link IProcessingComponent}. Use {@link ControllerFactory} to obtain controllers with different characteristics, e.g.with or without pooling of {@link IProcessingComponent}, with or without caching of the processing results. If further customizations are needed, you can provide your own {@link IProcessingComponentManager} implementation.
Calls to {@link #process(Map,Class)} are thread-safe, although some care should begiven to initialization. Controller instance should be initialized (using any of the {@link #init()} methods) before other threads are allowed to see its instance.{@link #dispose()} should be called after all threads leave{@link #process(Map,Class)} and {@link #process(Map,Object)}.
Notice for {@link IProcessingComponent} developers: if data caching is used, values of{@link Output} attributes produced by the components whose output is to be cached(e.g., the {@link Document} instances in case {@link IDocumentSource} output is cached)may be accessed concurrently and therefore must be thread-safe.
@see ControllerFactory