Как использовать RedeliveryPolicy в случае неудачных сообщений для исходящего-›входящего-›httpgateway(сообщения не работают здесь)-›ВНЕШНЯЯ СЛУЖБА

Как использовать RedeliveryPolicy в случае неудачных сообщений в исходящих-> входящих-> httpoutboundgateway (здесь сообщения не работают) -> внешняя служба

неудачные сообщения не повторяются на основе RedeliveryPolicy, главным образом потому, что сообщение уже удалено из очереди до того, как возникнет исключение.

<int:channel id="jmsOutChannel" />
    <jms:outbound-channel-adapter id="outboundJMSAdaptor" jms-template="jmsTemplate"
            channel="jmsOutChannel"
            destination-name="#{somebean.queueName}"/>

    <int:channel id="jmsInChannel" />
    <jms:message-driven-channel-adapter
            channel="jmsInChannel" destination-name="#{somebean.queueName}"
            connection-factory="jmsConnectionFactory" message-converter="jmsMessageConverter"/>

    <int:header-enricher input-channel="jmsInChannel" output-channel="outbound_gateway_channel">
        <int:header name="addressId" expression="payload.getId()"/>
        <int:header name="Accept-Language" value="en_GB"/>
        <int:header name="X-Source-CountryCode" value="GB"/>
        <int:header name="X-Source-Operator" value="Enterprise"/>
        <int:header name="X-Source-Division" value="CustomerManagement"/>
        <int:header name="X-Source-System" value="${sapwebservices.http.header.source.system}"/>
        <int:header name="X-Source-Timestamp" expression="new java.text.SimpleDateFormat('yyyy-MM-dd HH:mm:ss').format(new java.util.Date())"/>
        <int:header name="Accept" value="application/json"/>
        <int:header name="Content-Type" value="application/json;charset=UTF-8"/>
    </int:header-enricher>
    <bean id="httpRequestFactory" class="org.springframework.http.client.HttpComponentsClientHttpRequestFactory">
        <property name="connectTimeout" value="${sapwebservices.http.rest.timeout}"/>
        <property name="readTimeout" value="${sapwebservices.http.rest.timeout}"/>
        <property name="httpClient" ref="httpClient"/>
    </bean>
    <int:object-to-json-transformer input-channel="outbound_gateway_channel"
            output-channel="outbound_gateway_with_json"
            object-mapper="nonNullObjectMapper"/>
    <http:outbound-gateway mapped-request-headers="Accept*, Content-Type, X-*, HTTP_REQUEST_HEADERS"
            request-channel="outbound_gateway_with_json"
            reply-channel="print_payload"
            url="${sapwebservices.ws.uri.updatecustomershippingaddress}"
            http-method="PUT"
            expected-response-type="java.lang.String"
            charset="UTF-8"
            request-factory="httpRequestFactory">
        <http:uri-variable name="id" expression="headers['addressId']"/>
    </http:outbound-gateway>

И для политики повторной доставки у меня есть,

  <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
        <property name="messageConverter" ref="jmsMessageConverter" />
        <property name="connectionFactory">
            <bean class="org.springframework.jms.connection.SingleConnectionFactory">
                <property name="targetConnectionFactory">
                    <ref local="jmsConnectionFactory" />
                </property>
            </bean>
        </property>
    </bean>

    <bean id="jmsConnectionFactory" class="org.apache.activemq.spring.ActiveMQConnectionFactory">
        <property name="brokerURL" value="tcp://localhost:61616"/>
        <property name="userName" value="admin"/>
        <property name="password" value="admin"/>
        <property name="redeliveryPolicy" ref="redeliveryPolicy"/>
        <property name="nonBlockingRedelivery" value="true"/>
    </bean>

    <bean id="redeliveryPolicy" class="org.apache.activemq.RedeliveryPolicy">
        <property name="maximumRedeliveries" value="${sapwebservice.redeliveryPolicy.maximumRedeliveries}"/>
        <property name="initialRedeliveryDelay" value="${sapwebservice.redeliveryPolicy.initialRedeliveryDelay}"/>
        <property name="backOffMultiplier" value="${sapwebservice.redeliveryPolicy.backOffMultiplier}"/>
        <property name="useExponentialBackOff" value="${sapwebservice.redeliveryPolicy.useExponentialBackOff}"/>
        <property name="redeliveryDelay" value="${sapwebservice.redeliveryPolicy.redeliveryDelay}"/>
    </bean>

    <bean id="demoQueue" class="org.apache.activemq.command.ActiveMQQueue">
        <constructor-arg value="demo.queue"/>
    </bean>

    <bean id="jmsMessageConverter" class="sap.converter.JMSMessageConverter"/>

    <amq:broker useJmx="true" persistent="false">
        <amq:destinationPolicy>
            <amq:policyMap>
                <amq:defaultEntry>
                    <amq:policyEntry queue=">">
                        <amq:deadLetterStrategy>
                            <amq:individualDeadLetterStrategy queuePrefix="dlq." useQueueForQueueMessages="true"/>
                        </amq:deadLetterStrategy>
                    </amq:policyEntry>
                </amq:defaultEntry>
            </amq:policyMap>
        </amq:destinationPolicy>
        <amq:transportConnectors>
            <amq:transportConnector uri="tcp://localhost:0" />
        </amq:transportConnectors>
    </amq:broker>

Ожидаемый результат — повторная попытка на основе RedeliveryPolicy и, наконец, попадание в dlq, если все повторные попытки завершились неудачно.


person rowen    schedule 24.07.2019    source источник
comment
Какую версию Spring Integration вы используете? Поток контейнера запускается в транзакции по умолчанию (начиная с версии 4.2, поэтому транзакция (включая dequeue) будет откатываться при возникновении исключения.   -  person Gary Russell    schedule 24.07.2019
comment
приложение работает на spring-integration v2.1   -  person rowen    schedule 25.07.2019
comment
Действительно? Почему такой старый? Самый последний выпуск 2.1.x выпущен в 2013 году. Если вы действительно используете такую ​​старую версию, установите acknowledge="transacted" на адаптере, управляемом сообщениями. Но я действительно рекомендую вам быть более современным.   -  person Gary Russell    schedule 25.07.2019
comment
он поставляется с продуктом, и, поскольку мы используем более старую версию этого продукта в проекте поддержки, поэтому мы не можем изменить весеннюю версию. В любом случае, спасибо, предоставленное решение сработало.   -  person rowen    schedule 28.07.2019


Ответы (1)


Установите acknowledge="transacted" в адаптере канала, управляемого сообщениями.

Версии Spring Integration 4.2 и более поздние (текущая версия — 5.1.7) устанавливают это значение по умолчанию; для более ранних версий вы должны установить его в своей конфигурации, чтобы поток выполнялся в транзакции, а удаление из очереди откатывалось после создания исключения.

person Gary Russell    schedule 28.07.2019