You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@camel.apache.org by "Rafał Gała (JIRA)" <ji...@apache.org> on 2018/01/09 12:05:00 UTC
[jira] [Created] (CAMEL-12131) CacheProducer should not put
services in Camel context, that are not singletons and are not
ServicePoolAware
Rafał Gała created CAMEL-12131:
----------------------------------
Summary: CacheProducer should not put services in Camel context, that are not singletons and are not ServicePoolAware
Key: CAMEL-12131
URL: https://issues.apache.org/jira/browse/CAMEL-12131
Project: Camel
Issue Type: Bug
Components: camel-core
Reporter: Rafał Gała
Priority: Minor
When the org.apache.camel.impl.ProducerCache *doGetProducer* method is called from *org.apache.camel.processor.SendProcessor's doStart()* method, it will create new instance of a Producer, and put it into Camel context by calling *getCamelContext().addService(answer, false);*. However, it will not put the object into producers or the pool map, because it is not ServicePoolAware and is not a singleton. This results in a service that will later be started by *DeferServiceStartupListener* and will stay started until the whole context is closed.
{code:java}
protected synchronized Producer doGetProducer(Endpoint endpoint, boolean pooled) {
String key = endpoint.getEndpointUri();
Producer answer = producers.get(key);
if (pooled && answer == null) {
// try acquire from connection pool
answer = pool.acquire(endpoint);
}
if (answer == null) {
// create a new producer
try {
answer = endpoint.createProducer();
// add as service which will also start the service
// (false => we and handling the lifecycle of the producer in this cache)
*getCamelContext().addService(answer, false);*
} catch (Throwable e) {
throw new FailedToCreateProducerException(endpoint, e);
}
// add producer to cache or pool if applicable
if (pooled && answer instanceof ServicePoolAware) {
LOG.debug("Adding to producer service pool with key: {} for producer: {}", endpoint, answer);
answer = pool.addAndAcquire(endpoint, answer);
} else if (answer.isSingleton()) {
LOG.debug("Adding to producer cache with key: {} for producer: {}", endpoint, answer);
producers.put(key, answer);
}
}
if (answer != null) {
// record statistics
if (extendedStatistics) {
statistics.onHit(key);
}
}
return answer;
}
{code}
Here is the part of *doStart()* method from *SendProcessor* class. The producer is acquired and after that is immediately released in *ProducerCache*, however it is not removed from Camel context and stays there as a Service and will later by started by *DeferServiceStartupListener*
{code:java}
Producer producer = producerCache.acquireProducer(destination);
if (producer instanceof ServicePoolAware || !producer.isSingleton()) {
// no we cannot optimize it - so release the producer back to the producer cache
// and use the producer cache for sending
producerCache.releaseProducer(destination, producer);
} else {
// yes we can optimize and use the producer directly for sending
this.producer = AsyncProcessorConverterHelper.convert(producer);
}
{code}
--
This message was sent by Atlassian JIRA
(v6.4.14#64029)