Как перестать использовать сообщения на верблюжьем маршруте, когда пункт назначения недоступен - PullRequest
0 голосов
/ 21 октября 2019

Я соединяю очереди IBM и ActiveMQ с Camel.

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

Верблюд должен перестать потреблятьиз источника, если пункт назначения недоступен, и запускайте его снова, когда он становится доступным, но я не могу найти правильный шаблон / конфигурацию для этого.

Я настраиваю маршруты, подобные следующему из IBM MQ в IBM MQ, ноЯ ищу способ решить любую комбинацию IBM и ActiveMQ.

<bean id="lsywmq" class="org.apache.camel.component.jms.JmsComponent">
    <property name="connectionFactory">
        <bean class="com.ibm.mq.jms.MQQueueConnectionFactory">
            <property name="transportType" value="1" />
            <property name="hostName" value="${mq_lsy_hostname}" />
            <property name="port" value="${mq_lsy_port}" />
            <property name="queueManager" value="${mq_lsy_queuemanager}" />
            <property name="channel" value="${mq_lsy_channel}" />
            <property name="useConnectionPooling" value="true" />
        </bean>
    </property>
</bean>

<bean id="wmq" class="org.apache.camel.component.jms.JmsComponent">
    <property name="connectionFactory">
        <bean class="com.ibm.mq.jms.MQQueueConnectionFactory">
            <property name="transportType" value="1" />
            <property name="hostName" value="${mq_hostname}" />
            <property name="port" value="${mq_port}" />
            <property name="queueManager" value="${mq_queuemanager}" />
            <property name="channel" value="${mq_channel}" />
            <property name="useConnectionPooling" value="true" />
        </bean>
    </property>
</bean>

<camelContext xmlns="http://camel.apache.org/schema/blueprint"
    allowUseOriginalMessage="false" >
    <route id="EFF2AVIO">
        <from uri="lsywmq:queue:{{mq_lsy_queue}}"/>
        <to uri="wmq:queue:{{mq_queue}}"/>
            </route>
</camelContext>

Я бы хотел, чтобы он работал как конвейер, если он застрянет в пункте назначения, все трубы останутся застрявшими.

1 Ответ

0 голосов
/ 22 октября 2019

Вам необходимо установить для свойства transacted JMS connectionFactory значение true.
Это на самом деле не остановит вашего потребителя, но вы реализуете шаблон EIP Гарантированной доставки, поэтому ваши сообщения не будут 'больше не будет потеряно.
С этого момента вы также можете предоставить политику повторной доставки для ActiveMQ connectionFactory, что будет актуально для вас, например, длинный redeliveryDelay

Youможет использовать объект JMSConfiguration для настройки параметров JMS следующим образом

<bean id="wmq" class="org.apache.camel.component.jms.JmsComponent">
    <property name="configuration" ref="jmsConfig"/>
</bean>

<bean id="jmsConfig" class="org.apache.camel.component.jms.JmsConfiguration">
    <property name="transacted" value="true"/>
    <property name="connectionFactory" ref="myConnectionFactory"/>
</bean>

<bean id="myConnectionFactory" class="com.ibm.mq.jms.MQQueueConnectionFactory">
    <property name="transportType" value="1" />
    <property name="hostName" value="${mq_lsy_hostname}" />
    <property name="port" value="${mq_lsy_port}" />
    <property name="queueManager" value="${mq_lsy_queuemanager}" />
    <property name="channel" value="${mq_lsy_channel}" />
    <property name="useConnectionPooling" value="true" />
</bean>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...