WSO2 esb в качестве производителя jms с тайм-аутом передачи при сбое

Используя wso2 esb 4.9.0, я хотел бы, чтобы API-интерфейс HTTP отправлял сообщения в очередь JMS (activemq). Отправка jms должна использовать аварийное переключение, но если ни один из брокеров activemq недоступен, он должен выполнить последовательность ошибок после тайм-аута (например, 15 секунд) (в последовательности ошибок ответ http должен быть отправлен исходному клиенту с ошибкой http код 500 и тело JSON)

Я попытался использовать следующий URL-адрес для моей фабрики соединений activemq:

<parameter name="java.naming.provider.url" locked="false">failover:(tcp://localhost:61616)?timeout=3000</parameter>

Я также попытался установить параметр тайм-аута в uri в моем api.xml (опуская другие параметры):

<send>
    <endpoint>
        <address uri="jms:/MyQueue?java.naming.provider.url=failover:(tcp://localhost:616161)?timeout=3000"/>
    </endpoint>
</send>

Мой API по-прежнему блокируется на неопределенный срок, когда я убиваю всех своих брокеров activemq:

curl -XPOST -H "Content-Type: application/json" -d '{}' -k "https://localhost:8243/myApi/send"
^C # I have to kill it manually; instead it should return an error

Как реализовать это с помощью wso2 esb?

Документацию по параметру тайм-аута см. в справочнике по отказоустойчивому транспорту activemq: http://activemq.apache.org/failover-transport-reference.html

Примечания

При отказоустойчивом транспорте операции отправки по умолчанию блокируются на неопределенный срок, когда брокер становится недоступным. Есть два варианта обработки этого сценария. Во-первых, либо установите TransportListener непосредственно в ActiveMQConnectionFactory, чтобы он был на месте перед любым запросом, который может потребовать перехода по сети, либо во-вторых, установите параметр тайм-аута. Опция тайм-аута приводит к сбою текущей операции отправки по истечении указанного тайм-аута.

Пример:

отработка отказа: (tcp://основной:61616)?время ожидания=3000

В этом примере, если соединение не установлено, время ожидания операции отправки истекает через 3 секунды. Важно отметить, что соединение не разрывается, когда происходит тайм-аут. Поэтому можно повторно отправить затронутое сообщение (сообщения) позже, используя то же соединение, как только брокер станет доступным.


person jonenst    schedule 01.06.2018    source источник


Ответы (2)


Попробуйте использовать <property name="ClientApiNonBlocking" action="remove" scope="axis2"/> перед посредником отправки.

person Thishani Lucas    schedule 05.06.2018
comment
Почему это сработает? Нужен ли параметр тайм-аута? куда ? - person jonenst; 12.06.2018

В моем случае это было создание соединения, поэтому установка startupMaxReconnectAttempts=X позволила мне «тайм-аут» после нескольких попыток повторного подключения. При настройках по умолчанию (экспоненциальная отсрочка) значение X=10 истечет примерно через 5 секунд. Так что я использовал

<address uri="jms:/MyQueue?java.naming.provider.url=failover:(tcp://localhost:616161)?startupMaxReconnectAttempts=10"/>
person jonenst    schedule 14.06.2018