You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@camel.apache.org by Christian Müller <ch...@gmail.com> on 2013/04/04 17:22:53 UTC

Synchronuos onCompleation?

Camel version 2.8.0

We have a web servive route which use an idempotent repository (JDBC) to
prevent duplicates. If the processing of one exchange failed, the entry is
removed from the idempotent repository in the async onCompleation()
execution.

>From time to time we have the issue, that when the client send the request
again after only a few milli seconds, the entry wasn't removed from the
repository and processed as a duplicate.

Is there a way to process the onCompleation() synchronously (before the web
service response is send back)?

Thanks in advance,
Christian

Re: Synchronuos onCompleation?

Posted by Christian Müller <ch...@gmail.com>.
Ok, we will try this. I will let you know whether it works for us or not.

Have a nice weekend,
Christian


On Thu, Apr 4, 2013 at 11:59 PM, Raul Kripalani <ra...@evosent.com> wrote:

> Yes, that's exactly how I would go about it. When I said "Exchange
> Notifier", I actually meant "Event Notifier".
>
> Just extend EventNotifierSupport and enable the Exchange Failed and
> Exchange Completed events. Make them react accordingly by calling either
> the onFailure or onComplete method of the IdempotentOnCompletion
> Synchronization present on the Exchange.
>
> Worse comes to worst, if you don't manage to get it working like this, you
> can consider extending IdempotentConsumer and pluging it in as a normal
> Processor in your route. Within it, instead of injecting a Synchronization,
> add the messageId to the idempotent repository from inside an AsyncCallback
> that wraps the original one.
>
> It will then execute synchronously as the route unwinds and the
> AsyncCallbacks are called.
>
> Regards,
>
> *Raúl Kripalani*
> Enterprise Architect, Open Source Integration specialist, Program
> Manager | Apache
> Camel Committer
> http://about.me/raulkripalani | http://www.linkedin.com/in/raulkripalani
> http://blog.raulkr.net | twitter: @raulvk
>
> On Thu, Apr 4, 2013 at 8:58 PM, Christian Müller <
> christian.mueller@gmail.com> wrote:
>
> > Have in mind the IdempotentConsumer registers an IdempotentOnCompletion
> for
> > each new added exchange in the repository.
> >
> > Will the following work?:
> > We register an EventNotifier which will react on failed exchanges for a
> > give route. This custom EventNotifier is executed before the
> > onCompleation() is executed. So we can remove the IdempotentOnCompletion
> > from the exchange in our custom EventNotifier after we have executed it
> > synchronous. Right?
> >
> > Best,
> > Christian
> >
> >
> > On Thu, Apr 4, 2013 at 5:37 PM, Raul Kripalani <ra...@evosent.com> wrote:
> >
> > > BTW - In this Exchange Notifier, I suppose you'd call
> > > Exchange.handoverCompletions() to retrieve the Synchronizations, and
> then
> > > execute them straightaway.
> > >
> > > But I'm not 100% sure. Just a suggestion.
> > >
> > > Regards,
> > >
> > > *Raúl Kripalani*
> > > Enterprise Architect, Open Source Integration specialist, Program
> > > Manager | Apache
> > > Camel Committer
> > > http://about.me/raulkripalani |
> http://www.linkedin.com/in/raulkripalani
> > > http://blog.raulkr.net | twitter: @raulvk
> > >
> > > On Thu, Apr 4, 2013 at 4:28 PM, Raul Kripalani <ra...@evosent.com>
> wrote:
> > >
> > > > Hi Christian,
> > > >
> > > > I solved this once by using an ExchangeNotifier that processes the
> > > > Exchange Completed events.
> > > > The callback is executed synchronously.
> > > >
> > > > Mind you, there was a similar thread a few weeks ago, where more
> > options
> > > > were presented. But I'm still doubtful about some of them being
> > > synchronous
> > > > (and I haven't had time to dig into the code to verify it).
> > > >
> > > > Regards,
> > > >
> > > > *Raúl Kripalani*
> > > > Enterprise Architect, Open Source Integration specialist, Program
> > Manager
> > > > | Apache Camel Committer
> > > > http://about.me/raulkripalani |
> > http://www.linkedin.com/in/raulkripalani
> > > > http://blog.raulkr.net | twitter: @raulvk
> > > >
> > > > On Thu, Apr 4, 2013 at 4:22 PM, Christian Müller <
> > > > christian.mueller@gmail.com> wrote:
> > > >
> > > >> Camel version 2.8.0
> > > >>
> > > >> We have a web servive route which use an idempotent repository
> (JDBC)
> > to
> > > >> prevent duplicates. If the processing of one exchange failed, the
> > entry
> > > is
> > > >> removed from the idempotent repository in the async onCompleation()
> > > >> execution.
> > > >>
> > > >> From time to time we have the issue, that when the client send the
> > > request
> > > >> again after only a few milli seconds, the entry wasn't removed from
> > the
> > > >> repository and processed as a duplicate.
> > > >>
> > > >> Is there a way to process the onCompleation() synchronously (before
> > the
> > > >> web
> > > >> service response is send back)?
> > > >>
> > > >> Thanks in advance,
> > > >> Christian
> > > >>
> > > >
> > > >
> > >
> >
>

Re: Synchronuos onCompleation?

Posted by Raul Kripalani <ra...@evosent.com>.
Yes, that's exactly how I would go about it. When I said "Exchange
Notifier", I actually meant "Event Notifier".

Just extend EventNotifierSupport and enable the Exchange Failed and
Exchange Completed events. Make them react accordingly by calling either
the onFailure or onComplete method of the IdempotentOnCompletion
Synchronization present on the Exchange.

Worse comes to worst, if you don't manage to get it working like this, you
can consider extending IdempotentConsumer and pluging it in as a normal
Processor in your route. Within it, instead of injecting a Synchronization,
add the messageId to the idempotent repository from inside an AsyncCallback
that wraps the original one.

It will then execute synchronously as the route unwinds and the
AsyncCallbacks are called.

Regards,

*Raúl Kripalani*
Enterprise Architect, Open Source Integration specialist, Program
Manager | Apache
Camel Committer
http://about.me/raulkripalani | http://www.linkedin.com/in/raulkripalani
http://blog.raulkr.net | twitter: @raulvk

On Thu, Apr 4, 2013 at 8:58 PM, Christian Müller <
christian.mueller@gmail.com> wrote:

> Have in mind the IdempotentConsumer registers an IdempotentOnCompletion for
> each new added exchange in the repository.
>
> Will the following work?:
> We register an EventNotifier which will react on failed exchanges for a
> give route. This custom EventNotifier is executed before the
> onCompleation() is executed. So we can remove the IdempotentOnCompletion
> from the exchange in our custom EventNotifier after we have executed it
> synchronous. Right?
>
> Best,
> Christian
>
>
> On Thu, Apr 4, 2013 at 5:37 PM, Raul Kripalani <ra...@evosent.com> wrote:
>
> > BTW - In this Exchange Notifier, I suppose you'd call
> > Exchange.handoverCompletions() to retrieve the Synchronizations, and then
> > execute them straightaway.
> >
> > But I'm not 100% sure. Just a suggestion.
> >
> > Regards,
> >
> > *Raúl Kripalani*
> > Enterprise Architect, Open Source Integration specialist, Program
> > Manager | Apache
> > Camel Committer
> > http://about.me/raulkripalani | http://www.linkedin.com/in/raulkripalani
> > http://blog.raulkr.net | twitter: @raulvk
> >
> > On Thu, Apr 4, 2013 at 4:28 PM, Raul Kripalani <ra...@evosent.com> wrote:
> >
> > > Hi Christian,
> > >
> > > I solved this once by using an ExchangeNotifier that processes the
> > > Exchange Completed events.
> > > The callback is executed synchronously.
> > >
> > > Mind you, there was a similar thread a few weeks ago, where more
> options
> > > were presented. But I'm still doubtful about some of them being
> > synchronous
> > > (and I haven't had time to dig into the code to verify it).
> > >
> > > Regards,
> > >
> > > *Raúl Kripalani*
> > > Enterprise Architect, Open Source Integration specialist, Program
> Manager
> > > | Apache Camel Committer
> > > http://about.me/raulkripalani |
> http://www.linkedin.com/in/raulkripalani
> > > http://blog.raulkr.net | twitter: @raulvk
> > >
> > > On Thu, Apr 4, 2013 at 4:22 PM, Christian Müller <
> > > christian.mueller@gmail.com> wrote:
> > >
> > >> Camel version 2.8.0
> > >>
> > >> We have a web servive route which use an idempotent repository (JDBC)
> to
> > >> prevent duplicates. If the processing of one exchange failed, the
> entry
> > is
> > >> removed from the idempotent repository in the async onCompleation()
> > >> execution.
> > >>
> > >> From time to time we have the issue, that when the client send the
> > request
> > >> again after only a few milli seconds, the entry wasn't removed from
> the
> > >> repository and processed as a duplicate.
> > >>
> > >> Is there a way to process the onCompleation() synchronously (before
> the
> > >> web
> > >> service response is send back)?
> > >>
> > >> Thanks in advance,
> > >> Christian
> > >>
> > >
> > >
> >
>

Re: Synchronuos onCompleation?

Posted by Christian Müller <ch...@gmail.com>.
Have in mind the IdempotentConsumer registers an IdempotentOnCompletion for
each new added exchange in the repository.

Will the following work?:
We register an EventNotifier which will react on failed exchanges for a
give route. This custom EventNotifier is executed before the
onCompleation() is executed. So we can remove the IdempotentOnCompletion
from the exchange in our custom EventNotifier after we have executed it
synchronous. Right?

Best,
Christian


On Thu, Apr 4, 2013 at 5:37 PM, Raul Kripalani <ra...@evosent.com> wrote:

> BTW - In this Exchange Notifier, I suppose you'd call
> Exchange.handoverCompletions() to retrieve the Synchronizations, and then
> execute them straightaway.
>
> But I'm not 100% sure. Just a suggestion.
>
> Regards,
>
> *Raúl Kripalani*
> Enterprise Architect, Open Source Integration specialist, Program
> Manager | Apache
> Camel Committer
> http://about.me/raulkripalani | http://www.linkedin.com/in/raulkripalani
> http://blog.raulkr.net | twitter: @raulvk
>
> On Thu, Apr 4, 2013 at 4:28 PM, Raul Kripalani <ra...@evosent.com> wrote:
>
> > Hi Christian,
> >
> > I solved this once by using an ExchangeNotifier that processes the
> > Exchange Completed events.
> > The callback is executed synchronously.
> >
> > Mind you, there was a similar thread a few weeks ago, where more options
> > were presented. But I'm still doubtful about some of them being
> synchronous
> > (and I haven't had time to dig into the code to verify it).
> >
> > Regards,
> >
> > *Raúl Kripalani*
> > Enterprise Architect, Open Source Integration specialist, Program Manager
> > | Apache Camel Committer
> > http://about.me/raulkripalani | http://www.linkedin.com/in/raulkripalani
> > http://blog.raulkr.net | twitter: @raulvk
> >
> > On Thu, Apr 4, 2013 at 4:22 PM, Christian Müller <
> > christian.mueller@gmail.com> wrote:
> >
> >> Camel version 2.8.0
> >>
> >> We have a web servive route which use an idempotent repository (JDBC) to
> >> prevent duplicates. If the processing of one exchange failed, the entry
> is
> >> removed from the idempotent repository in the async onCompleation()
> >> execution.
> >>
> >> From time to time we have the issue, that when the client send the
> request
> >> again after only a few milli seconds, the entry wasn't removed from the
> >> repository and processed as a duplicate.
> >>
> >> Is there a way to process the onCompleation() synchronously (before the
> >> web
> >> service response is send back)?
> >>
> >> Thanks in advance,
> >> Christian
> >>
> >
> >
>

Re: Synchronuos onCompleation?

Posted by Raul Kripalani <ra...@evosent.com>.
BTW - In this Exchange Notifier, I suppose you'd call
Exchange.handoverCompletions() to retrieve the Synchronizations, and then
execute them straightaway.

But I'm not 100% sure. Just a suggestion.

Regards,

*Raúl Kripalani*
Enterprise Architect, Open Source Integration specialist, Program
Manager | Apache
Camel Committer
http://about.me/raulkripalani | http://www.linkedin.com/in/raulkripalani
http://blog.raulkr.net | twitter: @raulvk

On Thu, Apr 4, 2013 at 4:28 PM, Raul Kripalani <ra...@evosent.com> wrote:

> Hi Christian,
>
> I solved this once by using an ExchangeNotifier that processes the
> Exchange Completed events.
> The callback is executed synchronously.
>
> Mind you, there was a similar thread a few weeks ago, where more options
> were presented. But I'm still doubtful about some of them being synchronous
> (and I haven't had time to dig into the code to verify it).
>
> Regards,
>
> *Raúl Kripalani*
> Enterprise Architect, Open Source Integration specialist, Program Manager
> | Apache Camel Committer
> http://about.me/raulkripalani | http://www.linkedin.com/in/raulkripalani
> http://blog.raulkr.net | twitter: @raulvk
>
> On Thu, Apr 4, 2013 at 4:22 PM, Christian Müller <
> christian.mueller@gmail.com> wrote:
>
>> Camel version 2.8.0
>>
>> We have a web servive route which use an idempotent repository (JDBC) to
>> prevent duplicates. If the processing of one exchange failed, the entry is
>> removed from the idempotent repository in the async onCompleation()
>> execution.
>>
>> From time to time we have the issue, that when the client send the request
>> again after only a few milli seconds, the entry wasn't removed from the
>> repository and processed as a duplicate.
>>
>> Is there a way to process the onCompleation() synchronously (before the
>> web
>> service response is send back)?
>>
>> Thanks in advance,
>> Christian
>>
>
>

Re: Synchronuos onCompleation?

Posted by Raul Kripalani <ra...@evosent.com>.
Hi Christian,

I solved this once by using an ExchangeNotifier that processes the Exchange
Completed events.
The callback is executed synchronously.

Mind you, there was a similar thread a few weeks ago, where more options
were presented. But I'm still doubtful about some of them being synchronous
(and I haven't had time to dig into the code to verify it).

Regards,

*Raúl Kripalani*
Enterprise Architect, Open Source Integration specialist, Program
Manager | Apache
Camel Committer
http://about.me/raulkripalani | http://www.linkedin.com/in/raulkripalani
http://blog.raulkr.net | twitter: @raulvk

On Thu, Apr 4, 2013 at 4:22 PM, Christian Müller <
christian.mueller@gmail.com> wrote:

> Camel version 2.8.0
>
> We have a web servive route which use an idempotent repository (JDBC) to
> prevent duplicates. If the processing of one exchange failed, the entry is
> removed from the idempotent repository in the async onCompleation()
> execution.
>
> From time to time we have the issue, that when the client send the request
> again after only a few milli seconds, the entry wasn't removed from the
> repository and processed as a duplicate.
>
> Is there a way to process the onCompleation() synchronously (before the web
> service response is send back)?
>
> Thanks in advance,
> Christian
>