Потребитель Camel CXF, метод веб-сервиса не отвечает - PullRequest
1 голос
/ 16 декабря 2010

Я пытаюсь использовать веб-сервис от верблюда, используя компонент cxf, например:

<cxf:cxfEndpoint id="webservice"
                 address="http://webservice.url.com/webservice"
                 serviceClass="com.url.webservice.MyWebService"/>

<camel:camelContext>
    <camel:route>
        <camel:from uri="direct:a"/>
        <camel:inOnly uri="cxf:bean:webservice?defaultOperationName=sendMessage"/>
    </camel:route>
</camel:camelContext>

Метод sendMessage не имеет ответа, следовательно, inOnly вместо to (хотя у меня та же проблема, когда я пытаюсь to вместо).Проблема в том, что, по-видимому, верблюд все еще ожидает ответа, и маршрут зависает, ожидая его.Я полагаю, что если я позволю этому попробовать достаточно долго, это в конечном итоге истечет.

Чтобы было ясно, я использую тестовый метод:

/* ... */

@Produce(uri = "direct:a")
protected ProducerTemplate directA;

@Test
public void sendMessage() throws Exception {
    directA.sendBody(new String[] {"client id", "message"});
    directB.sendBody(new String[] {"client id", "message 2"});
}

И я вижу эффектпервого вызова (т. е. сообщение поступает на сервер), но не второго, и метод не завершает работу (опять же, я предполагаю, что в какой-то момент он истечет ... если так,тайм-аут довольно длинный: я запустил тест, когда начал писать, и он все еще работает).

Я что-то упустил?Это ошибка?Это просто плохая практика иметь методы веб-сервиса без ответа?

Кстати, при тестировании методов, у которых есть ответ, он работает нормально.

Ответы [ 2 ]

2 голосов
/ 18 декабря 2010

Я думаю, что Виллем Цзян недавно недавно исправил проблему с односторонним CXF в Camel. Может быть, попробуйте Camel 2.6-SNAPSHOT из багажника.

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

1 голос
/ 05 марта 2011

производитель camel-cxf решает, будет ли он обрабатывать ответное сообщение, проверяя, является ли операция односторонней. Даже если операция sendMessage является односторонним вызовом, ваш сервер должен отправить клиенту сообщение Http states 202 в соответствии с протоколом HTTP, в противном случае производитель camel-cxf все равно будет ждать ответа.

Кстати, я думаю, что проблема [1], которая, по словам Клауса, была связана с асинхронным вызовом производителя camel-cxf с односторонним сообщением, не уверен, что это та же проблема, о которой вы упоминали (я не знал, какая версия camel ты используешь).

[1] https://issues.apache.org/jira/browse/CAMEL-3426

Willem

...