Используя 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 секунды. Важно отметить, что соединение не разрывается, когда происходит тайм-аут. Поэтому можно повторно отправить затронутое сообщение (сообщения) позже, используя то же соединение, как только брокер станет доступным.