You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@camel.apache.org by Vyacheslav Boyko <ma...@gmail.com> on 2021/11/03 11:25:21 UTC

Give me suggestions about how to use ProducerTemplate correctly please

Hello.

I have faced with important notice in JavaDoc of 
org.apache.camel.CamelContext#createProducerTemplate() and it makes me 
rethink how to use it.

JavaDoc prescribes: Important: Make sure to call ProducerTemplate.stop() 
when you are done using the template, to clean up any resources.

So, when I implement RouteBuilder in SpringBoot project I make it like:

@Component
class BusinessRouteBuilder extends RouteBuilder {
   @Override
   public void configure() {
     from("seda://start")
       .to("seda://business-start"); // to process in separated thread
   }
   public void sendMessage(Msg msg) {
     getContext().createProducerTemplate().sendBody("seda://start", msg);
   }
}


My question and concern is: am I doing it correctly?

It seems I have to stop ProducerTemplate created before. But where to 
close it? Right after it was used in sendMessage() like the following?

   public void sendMessage(Msg msg) {
     ProducerTemplate producerTemplate = 
getContext().createProducerTemplate();
     producerTemplate.sendBody("seda://start", msg);
     producerTemplate.stop();
   }

Or maybe it will be better to create one ProducerTemplate per Spring 
bean and to stop it in @PreDestroy method like the following?

@Component
class BusinessRouteBuilder extends RouteBuilder {
   ProducerTemplate producerTemplate;
   @Override
   public void configure() {
     producerTemplate = getContext().createProducerTemplate();
     from("seda://start")
       .to("seda://business-start"); // to process in separated thread
   }
   public void sendMessage(Msg msg) {
     producerTemplate.sendBody("seda://start", msg);
   }
   @PreDestroy
   public void preDestroy() {
     producerTemplate.stop();
   }
}

___
Vyacheslav Boyko
mailto:mail4bvn@gmail.com


Re: Give me suggestions about how to use ProducerTemplate correctly please

Posted by Claus Ibsen <cl...@gmail.com>.
Hi

See this FAQ
https://camel.apache.org/manual/faq/why-does-camel-use-too-many-threads-with-producertemplate.html

You do not create a template per message you send, you create it once
/ or better you dependency inject it into the route builder.
Since you use spring you can use @Autowired or @Inject etc

On Wed, Nov 3, 2021 at 12:25 PM Vyacheslav Boyko <ma...@gmail.com> wrote:
>
> Hello.
>
> I have faced with important notice in JavaDoc of
> org.apache.camel.CamelContext#createProducerTemplate() and it makes me
> rethink how to use it.
>
> JavaDoc prescribes: Important: Make sure to call ProducerTemplate.stop()
> when you are done using the template, to clean up any resources.
>
> So, when I implement RouteBuilder in SpringBoot project I make it like:
>
> @Component
> class BusinessRouteBuilder extends RouteBuilder {
>    @Override
>    public void configure() {
>      from("seda://start")
>        .to("seda://business-start"); // to process in separated thread
>    }
>    public void sendMessage(Msg msg) {
>      getContext().createProducerTemplate().sendBody("seda://start", msg);
>    }
> }
>
>
> My question and concern is: am I doing it correctly?
>
> It seems I have to stop ProducerTemplate created before. But where to
> close it? Right after it was used in sendMessage() like the following?
>
>    public void sendMessage(Msg msg) {
>      ProducerTemplate producerTemplate =
> getContext().createProducerTemplate();
>      producerTemplate.sendBody("seda://start", msg);
>      producerTemplate.stop();
>    }
>
> Or maybe it will be better to create one ProducerTemplate per Spring
> bean and to stop it in @PreDestroy method like the following?
>
> @Component
> class BusinessRouteBuilder extends RouteBuilder {
>    ProducerTemplate producerTemplate;
>    @Override
>    public void configure() {
>      producerTemplate = getContext().createProducerTemplate();
>      from("seda://start")
>        .to("seda://business-start"); // to process in separated thread
>    }
>    public void sendMessage(Msg msg) {
>      producerTemplate.sendBody("seda://start", msg);
>    }
>    @PreDestroy
>    public void preDestroy() {
>      producerTemplate.stop();
>    }
> }
>
> ___
> Vyacheslav Boyko
> mailto:mail4bvn@gmail.com
>


-- 
Claus Ibsen
-----------------
http://davsclaus.com @davsclaus
Camel in Action 2: https://www.manning.com/ibsen2