barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)

среда, 25 декабря 2013 г.

WSO2 ESB 4.5.1: Callout-mediator и ConnectionPoolTimeoutException

Проблема

В прокси-сервисе используется callout-медиатор для вызова некоторого веб-сервиса. Вызов приводит к ошибке (ошибка может быть любым AxisFault'ом, например, таймаутом, но в моем случае это была HTTP-ошибка 404). Проблема заключается в том, что после 2-3 вызов корректная ошибка сменяется на "org.apache.commons.httpclient.ConnectionPoolTimeoutException: Timeout waiting for connection", которая продолжает валиться даже после того, как вызываемый сервис починен и начал корректно отвечать. Через некоторое время проблема сама собой уходит, и конечный сервис начинает вызываться (если же его не починили - снова начинает падать с 404-ой ошибкой).

Причина

При возникновении AxisFault'а callout-медиатор не возвращает http-соединение в Connection-пул, в итоге пул кончается, и попытки достать из него соединение заканчиваются ошибкой (таймаутом ожидания соединения из пула). Через некоторое время такие невозвращенные коннекты сами закрываются по таймауту, и пул снова начинает выдавать коннекты.
Был заведен соответствующий баг (https://wso2.org/jira/browse/ESBJAVA-922), вроде бы исправленный в 4.5.0 M4, тем не менее, он снова воспроизводится на 4.5.1, может смерджить забыли =)

Решение

Берем сорцы synapse 2.1.0 (http://svn.apache.org/viewvc/synapse/tags/2.1.0/), там открываем проект synapse-core (modules/core), идем в класс org.apache.synapse.mediators.builtin.CalloutMediator, на строку 114, и приводим catch-блок к виду:
            } catch (AxisFault axisFault) {
                sc.cleanupTransport();
                handleFault(synCtx, axisFault);
            }
Собираем проект, берем скомпилированный класс CalloutMediator.class, подкладываем его в %WSO2_HOME%/repository/components/plugins/synapse-core_2.1.0.wso2v8.jar/org/apache/synapse/mediators/builtin/ (на остановленной шине), стартуем шину, радуемся.

Комментариев нет:

Отправить комментарий