La journalisation chameau exceptions et à l'envoi de la lettre morte du canal

J'ai un Chameau route, de course à l'intérieur de Karaf, pour lequel j'ai ajouté une Lettre Morte du Canal. C'est pour gérer les cas où l'itinéraire échoue et que je veux garder le message du problème et du journal la cause. Je ne peux pas lancer l'exception à l'application appelante comme je suis à la manipulation de certains traitement asynchrone.

À partir de la lecture de la documentation et d'essayer un certain nombre de cas, il n'est pas clair pour moi comment les deux journaux de l'exception dans Karaf du journal et le dépôt de l'original message dans la file d'attente de lettres mortes.

Voici un extrait de ce que j'ai:-

<bean id="deadLetterQueue" class="org.apache.camel.builder.DeadLetterChannelBuilder">
    <property name="deadLetterUri" value="activemq:dead.letter.queue"/>
    <property name="redeliveryPolicy" ref="redeliveryPolicy"/>
</bean>

<bean id="redeliveryPolicy" class="org.apache.camel.processor.RedeliveryPolicy">
    <property name="maximumRedeliveries" value="1"/>
    <property name="redeliveryDelay" value="1000"/>
</bean>

<camelContext id="notification" errorHandlerRef="deadLetterQueue"
    trace="false" xmlns="http://camel.apache.org/schema/blueprint">
    <onException>
        <exception>org.xyz.exceptions.unchecked.notificationException</exception>
        <log logName="notifications" loggingLevel="ERROR"
            message="Exception from notification Camel route" />
    </onException>

    <route id="DoSomething" errorHandlerRef="deadLetterQueue">
        <from uri="activemq:notification.in" />
        <log logName="notifications" loggingLevel="TRACE"
            message="Notification route initiated" />
        <bean ref="NotificationProcessor" method="doStuff" />
    </route>
</camelContext>

Si je supprime le "onException" de la structure, puis, dans tous les cas d'exception, le message de la source apparaît sur la lettre morte de la file d'attente, mais n'est pas connecté.

Si je le lance en tant que ci-dessus, alors l'exception de la trace est enregistrée dans Karaf log (si c'est un "notificationException"), mais la source du message n'est pas annulée à la lettre morte de la file d'attente et disparaît dans l'éther (sans doute car il pense que j'ai traitée dans le "onException" structure).

Avoir regardé les différentes sortes de gestionnaires d'erreur, j'ai essayé d'ajouter des choses au lieu de les DeadLetterChannelBuilder comme...

<property name="logName" value="notifications"/>
<property name="level" value="ERROR"/>

...mais ce ne sont pas légales propriétés.

Aussi il me semble que le fait d'avoir de lister les différentes exceptions explicitement dans le onException clause ne peut pas être correcte.

Alors, comment puis-je obtenir la lettre morte du canal à enregistrer l'exception de trace en tant que bien que de mettre le message dans la file d'attente? Peut-être la lettre morte du canal n'est pas le bon gestionnaire - je ne suis pas vraiment intéressé automatique de relivraison dans ce cas.

Merci pour les conseils,

J.

OriginalL'auteur Jeremy Gooch | 2012-12-04