Thank you Claus and Willem.
The plot thickened a bit this morning.
Hoping that disabling JMX would disable the leak, I turned it off (by adding
an <agent> definition to my application context). This slowed but did not
eliminate the leak. Further digging showed that, even with management
disabled, there is a collection in DefaultCamelContext (servicesToClose)
that still results in retention of Producers.
Hoping to defeat the leak, I took Claus' advice and defined a named producer
template (with <template id="XXX"/>) in the camel context definition, and
used @Autowired to have spring inject the PT. However, I found that Spring
was still injecting a new PT instance every time. Further investigation
showed that org.apache.camel.spring.CamelProducerTemplateFactoryBean is, at
least in 2.2.0, hardwired to always create "prototype" beans rather than
singletons. i.e., its getObject() method will always return a new PT every
time.
Out of desperation I explicitly configured a DefaultProducerTemplate as a
Spring singleton bean:
<bean id="camelProducerTemplate"
class="org.apache.camel.impl.DefaultProducerTemplate">
<constructor-arg ref="camel"/>
</bean>
and used @Resource(name="camelProducerTemplate") to inject it by name. This
solved the problem and reliably injected the same PT instance, but I was a
bit unhappy about having to reference an .impl. class directly.
Willem I'm not sure I understand your suggestion:
> It's a good idea to inject a new ProducerTemplate per request.
It seems instead like a very bad idea; at least in 2.2.0 any pattern which
results in unbounded creation of ProducerTemplates will result in a
reference leak, as best as I can tell.
Please let me know if any of this should be considered a bug and I'll be
happy to file a ticket or tickets.
Thanks again for your replies.
Matt
Claus Ibsen-2 wrote:
>
> On Tue, Apr 13, 2010 at 1:22 AM, matthewm <[email protected]> wrote:
>>
>> Hello,
>>
>> We are using Camel 2.2.0 with Spring 3.0.1.RELEASE in the context of a
>> web
>> service.
>>
>> We've been using @EndpointInject to inject ProducerTemplates into our
>> beans.
>> Some of our beans are request scoped, and so a new ProducerTemplate is
>> created and injected on each request.
>>
>> After more study this seems to run counter to the idea of
>> ProducerTemplate,
>> which appears to have been conceived as a long-lived object rather than
>> transient. It seems perhaps the documentation of @EndpointInject might
>> point this out; injecting into singletons makes perfect sense but
>> injecting
>> into request-scoped beans may be undesirable.
>>
>
> The FAQ has some details on producer template
> http://camel.apache.org/why-does-camel-use-too-many-threads-with-producertemplate.html
>
> You can just use @Autowired or other Spring IoC stuff.
>
> @Autowired
> private ProducerTemplate template;
>
> Camel will automatic enlist a ProducerTemplate if you do not explict
> set a <template id="xxx"/> in the <camelContext/> tag.
> Then it will use the shared instance of ProducerTemplate instead of
> creating a new one each time.
>
>
>> Specifically, the issue we found is that each ProducerTemplate creates a
>> Producer which then is registered with JMX. Eventually we wind up with
>> thousands of Producers referenced by JMX (but otherwise garbage)
>> resulting
>> in OOM errors.
>>
>
> Yeah this is fixed in 2.3-SNAPSHOT.
>
>> It seems like a bug that Camel's JMX integration prevents producers from
>> being eligible for GC. But how best to proceed with making a
>> ProducerTemplate available to request scoped beans?
>>
>> Thanks!
>>
>> Matt
>> --
>> View this message in context:
>> http://old.nabble.com/Injecting-ProducerTemplates%2C-scoping%2C-and-JMX-memleak-tp28219199p28219199.html
>> Sent from the Camel - Users mailing list archive at Nabble.com.
>>
>>
>
>
>
> --
> Claus Ibsen
> Apache Camel Committer
>
> Author of Camel in Action: http://www.manning.com/ibsen/
> Open Source Integration: http://fusesource.com
> Blog: http://davsclaus.blogspot.com/
> Twitter: http://twitter.com/davsclaus
>
>
--
View this message in context:
http://old.nabble.com/Injecting-ProducerTemplates%2C-scoping%2C-and-JMX-memleak-tp28219199p28237439.html
Sent from the Camel - Users mailing list archive at Nabble.com.