Christian,

Sorry for the long delay in responding. I agree that changing the logic only
in the case of this SMPP-specific exception, ProcessRequestException, is a
relatively straight-forward way to go. I've got the camel-smpp code checked
out, if you'd like me to take the first stab at a patch.

The other option is to have a configuration parameter which indicates that
we want to send a failure to the SMSC in the event of an exception. In this
case, we'd both execute the exception handler AND throw
a ProcessRequestException back to jsmpp to notify the SMSC.

Both options could be implemented in a complementary manner.

--
Tolga

On Tue, Jun 21, 2011 at 2:51 PM, Christian Müller <
christian.muel...@gmail.com> wrote:

> Tolga,
>
> today I had the time to look into it.
> At present the SmppConsumer catches any Exception in the
> onAcceptDeliverSm(DeliverSm) and let the exception handler handle it. This
> is the way Camel handle the exceptions.
> In a real production system, I would not expect that you will let the
> logging error handler handle the exception. I think you will use a
> redelivery error handler or dead letter error handler. The error handler is
> responsible for a proper handling of the exception.
>
> However, the SMPP protocol gives you (the ESME) the possibility to signal
> the SMSC to resend the message at a later time in case of an exception.
> Then
> the SMSC mas to redeliver the message. Onfortunately, providing your own
> ExceptionHandler which returns a ProcessRequestException with the proper
> error code is not a solution, because the ExceptionHandler interface do not
> define any exceptions on the handleException() method.
>
> The only thing I can imagine is to
> throw new ProcessRequestException(e.getMessage(), 0x00000064, e); //
> ESME_RX_T_APPN: ESME Receiver Temporary App Error Code
> for each request which fails. But this doesn't look right for me. We do not
> know whether a redelivery is useful or not.
>
> The "best" solution I have in my mind is that we have a different exception
> handling for ProcessRequestException and for all other exception. We could
> only rethrow the ProcessRequestException and the user (you) is responsible
> to set the proper error code. For all the other Exceptions the behavior is
> unchanged. What do you think?
>
> How would you suggested patch look like?
>
> I will raise a JIRA.
>
> Best,
> Christian
>
> On Wed, May 25, 2011 at 3:09 AM, Tolga Tarhan <to...@netbrains.com> wrote:
>
> > All,
> >
> > The SMPP protocol allows a ESME to reject a message temporarily if
> > it's having trouble processing it (by responding with ESME_RX_T_APPN -
> > ESME Receiver temporary error). This seems to be the most logical
> > thing to do when an exception occurs during
> > onAcceptDeliverSm(DeliverSm) so that the SMSC will try to deliver the
> > message again later.
> >
> > However, the behavior currently in SmppConsumer is to use the default
> > exception handler, which is LoggingExceptionHandler, and still return
> > from onAcceptDeliverSm as normal (thus, JSMPP returns a success to the
> > SMSC). Further, the SmppConsumer ignores any faults (it's an InOnly
> > endpoint). As a result, the SMSC believes the message was delivered
> > when there's an exception or fault.
> >
> > The fix is trivial, and I'm happy to submit a patch. Being that I'm
> > new to Camel, however, I wanted to ask if this was a reasonable thing
> > to do. Specifically, I propose changing SmppConsumer so that in the
> > event of an exception during getProcessor().process(exchange) inside
> > onAcceptDeliverSm(DeliverSm), we would throw a ProcessRequestException
> > back to JSMPP, which causes it respond with a failure to the SMSC,
> > rather than a success as it currently does.
> >
> > If that change make sense, then I'd also like to ask if changing the
> > MEP to InOut makes sense, so that we can capture faults from the
> > processor. Obviously, an actual out message never make sense, but we
> > could use a fault message to specify an error code to use in the
> > ProcessRequestException. Do other components which can report faults,
> > but not have any real out messages, work as InOut components or as
> > InOnly components?
> >
> > Thanks for your advice,
> > Tolga
> >
>

Reply via email to