Spring 使用Camel和ActiveMq的重试机制-忽略重试策略

Spring 使用Camel和ActiveMq的重试机制-忽略重试策略,spring,apache-camel,activemq,karaf,Spring,Apache Camel,Activemq,Karaf,我正在使用camel和activeMq研究重试机制。我想做的是,如果我正在调用的某个服务器停机,启动重试机制,将请求添加到我的队列中,并每隔一小时将其重新发送到服务器。一切正常,但我的重试策略似乎被忽略(当我的请求进入我的队列时,它们会重新发送,并且在达到重试次数后,它们不会被添加到DLQ中) 我的配置如下所示(值从.cfg文件读取): 调用我的服务的驼峰路线: <route id="addRegistrationRoute"> <from uri="di

我正在使用camel和activeMq研究重试机制。我想做的是,如果我正在调用的某个服务器停机,启动重试机制,将请求添加到我的队列中,并每隔一小时将其重新发送到服务器。一切正常,但我的重试策略似乎被忽略(当我的请求进入我的队列时,它们会重新发送,并且在达到重试次数后,它们不会被添加到DLQ中)

我的配置如下所示(值从.cfg文件读取):


调用我的服务的驼峰路线:

<route id="addRegistrationRoute">
        <from uri="direct:addRegistrationRoute"/>

        <to uri="cxf:bean:addRegistrationEndpoint"/>

        <onException>
            <exception>java.net.ConnectException</exception>
            <onWhen>
                <el>${in.headers['previousRoute'] != 'registrationRetryRoute'}</el>
            </onWhen>
            <handled>
                <constant>true</constant>
            </handled>

            <setBody>
                <simple>${headers.request}</simple>
            </setBody>
            <removeHeaders pattern="*"/>
            <to uri="activemq:queue:registrationRetryQueue"/>
            <stop/>
        </onException>
        <onException>
            <exception>org.apache.cxf.interceptor.Fault</exception>
            <onWhen>
                <el>${in.headers['previousRoute'] != 'registrationRetryRoute'}</el>
            </onWhen>
            <handled>
                <constant>true</constant>
            </handled>

            <setBody>
                <simple>${headers.request}</simple>
            </setBody>
            <removeHeaders pattern="*"/>

            <to uri="activemq:queue:registrationRetryQueue"/>
            <stop/>
        </onException>
        <onException>
            <exception>javax.xml.soap.SOAPFault</exception>
            <handled>
                <constant>true</constant>
            </handled>

        </onException>
    </route>
    <route id="registrationRetryRoute">
        <from uri="activemq:queue:registrationRetryQueue"/>

        <setHeader headerName="previousRoute">
            <simple>registrationRetryRoute</simple>
        </setHeader>
        <to uri="direct:addRegistrationRoute"/> <!-- Back to the initial flow. -->
    </route>

java.net.ConnectException
${in.headers['previousRoute']!='registrationRetryRoute'}
符合事实的
${headers.request}
org.apache.cxf.interceptor.Fault
${in.headers['previousRoute']!='registrationRetryRoute'}
符合事实的
${headers.request}
javax.xml.soap.SOAPFault
符合事实的
注册路线
如果有人能告诉我我在配置activeMq时做错了什么,我将非常感激

问候,,
Roxana

ActiveMQ仅当您从消费者(或消息侦听器)抛出错误时才将消息推送到DLQ中。因此,请尝试捕获异常并将其抛出,以便相应地启用重试策略。

这就是我要做的。我只是第一次捕获异常,并将消息添加到队列中。然后,当消息被使用时,我让异常被抛出,以便可以开始重试,但问题是我上面发布的ActiveMQ配置被忽略,并且当抛出异常时,重试没有正确执行。我必须指出,这不是我第一次实现重试机制,blueprint使用了确切的配置。
<route id="addRegistrationRoute">
        <from uri="direct:addRegistrationRoute"/>

        <to uri="cxf:bean:addRegistrationEndpoint"/>

        <onException>
            <exception>java.net.ConnectException</exception>
            <onWhen>
                <el>${in.headers['previousRoute'] != 'registrationRetryRoute'}</el>
            </onWhen>
            <handled>
                <constant>true</constant>
            </handled>

            <setBody>
                <simple>${headers.request}</simple>
            </setBody>
            <removeHeaders pattern="*"/>
            <to uri="activemq:queue:registrationRetryQueue"/>
            <stop/>
        </onException>
        <onException>
            <exception>org.apache.cxf.interceptor.Fault</exception>
            <onWhen>
                <el>${in.headers['previousRoute'] != 'registrationRetryRoute'}</el>
            </onWhen>
            <handled>
                <constant>true</constant>
            </handled>

            <setBody>
                <simple>${headers.request}</simple>
            </setBody>
            <removeHeaders pattern="*"/>

            <to uri="activemq:queue:registrationRetryQueue"/>
            <stop/>
        </onException>
        <onException>
            <exception>javax.xml.soap.SOAPFault</exception>
            <handled>
                <constant>true</constant>
            </handled>

        </onException>
    </route>
    <route id="registrationRetryRoute">
        <from uri="activemq:queue:registrationRetryQueue"/>

        <setHeader headerName="previousRoute">
            <simple>registrationRetryRoute</simple>
        </setHeader>
        <to uri="direct:addRegistrationRoute"/> <!-- Back to the initial flow. -->
    </route>