CXF: предоставление разъединенной конечной точки через существующий транспорт сервлетов - PullRequest
1 голос
/ 09 ноября 2011

У меня есть приложение, которое предоставляет сервисы с использованием транспорта CXF Servlet и Jetty 6.1.Это приложение также должно использовать внешние сервисы.Все сервисы поддерживают спецификацию WS-Addressing (и WS-RM сверху).Чтобы использовать внешний сервис, я запускаю сгенерированный сервисный клиент из приложения.

Проблема в том, что когда я предоставляю разъединенную конечную точку для клиента (WS-RM нужна эта конечная точка для получения входящих сообщений через отдельное соединение http), CXF запускает другой экземпляр сервера Jetty (несмотря на то, чточто сервлетный транспорт (который предоставляет услуги) и клиент (который использует некоторые внешние услуги) совместно используют одну и ту же шину).Мне не нужны два экземпляра Jetty (не говоря уже о том, что они не могут работать на одном и том же порту HTTP).

Есть ли способ, которым я могу предоставить разъединенную конечную точку, используя существующий сервер Jetty и транспорт Servlet?

Пока что я включаю разъединенную конечную точку следующим образом:

Client client = ClientProxy.getClient(port);
HTTPConduit httpConduit = (HTTPConduit) client.getConduit();
httpConduit.getClient().setDecoupledEndpoint(
     "http://domain.com:port/services/dec_endpoints/TestDecEndpoint");

Если я предоставляю относительный путь ("/ dec_endpoints / TestDecEndpoint", так же как относительные пути используются с предоставлением услугчерез сервлетный транспорт), HTTP-канал не указывает полный путь в заголовках SOAP-сообщения, поэтому это тоже не работает (сервер просто не может отправить сообщение в /dec_endpoints/TestDecEndpoint).

1 Ответ

2 голосов
/ 10 ноября 2011

Хорошо, я сам нашел решение. Вам необходимо указать относительный путь для разъединенной конечной точки и вручную изменить свойства адресации сообщения (после перехватчика MAPAggregator, поскольку он устанавливает разъединенное место назначения), чтобы сервер мог отправлять ответы на ваш адрес.

Итак, что мы имеем:

  1. разделить пункт назначения, используя относительный путь: /dec_endpoints/SomeDestination
  2. <ReplyTo> заголовок с абсолютным путем: http://addr.com:port/servlet_path/dec_endpoints/SomeDestination

Вот пример того, как можно изменить путь:

public class ReplyToInterceptor extends AbstractPhaseInterceptor<Message>
{
    public ReplyToInterceptor() {
        super(Phase.PRE_LOGICAL);
        addAfter(MAPAggregator.class.getName());
    }

    public void handleMessage(Message message) {
        AddressingProperties maps = ContextUtils.retrieveMAPs(message, false, 
           true);
        EndpointReferenceType replyTo = maps.getReplyTo();
        replyTo.getAddress().setValue(
           "http://address.com:port/servlet_path/dec_endpoints/SomeDestination");
    }
}
...