IllegalStateException на маршруте верблюда cxf в FUSE (servicemix) ESB - PullRequest
0 голосов
/ 07 апреля 2011

Я пытаюсь настроить маршрут верблюда (версия 2.4.0) в контейнере FUSE (версия 4.3.0) ESB / OSGi. Это должен быть простой cxf-прокси для маршрутизации вызова WebService с адреса «прокси» на реальный сервис.

Я прочитал несколько документов:

и настройте следующую конфигурацию пружины:

<?xml version="1.0" encoding="UTF-8"?>
<beans
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:camel="http://camel.apache.org/schema/spring"
    xmlns:osgi="http://www.springframework.org/schema/osgi"
    xmlns:cxf="http://camel.apache.org/schema/cxf"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
        http://www.springframework.org/schema/osgi
        http://www.springframework.org/schema/osgi/spring-osgi.xsd
        http://camel.apache.org/schema/osgi
        http://camel.apache.org/schema/osgi/camel-osgi.xsd
        http://camel.apache.org/schema/spring
        http://camel.apache.org/schema/spring/camel-spring.xsd
        http://camel.apache.org/schema/cxf
        http://camel.apache.org/schema/cxf/camel-cxf.xsd">

    <import
        resource="classpath:META-INF/cxf/cxf.xml" />
    <import
        resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
    <import
        resource="classpath:META-INF/cxf/cxf-extension-http.xml" />
    <import
        resource="classpath:META-INF/cxf/osgi/cxf-extension-osgi.xml" />

    <!-- the proxy service -->
    <cxf:cxfEndpoint
        id="myServiceProxy"
        address="http://localhost:9003/cxf/myService"
        serviceClass="foo.bar.iface.MyServiceInterface" />

    <!-- my real existing cxf soap service -->
    <cxf:cxfEndpoint
        id="myService"
        address="http://foo.bar/services/myService"
        wsdlURL="http://foo.bar/services/myService?wsdl"
        serviceClass="foo.bar.iface.MyServiceInterface"
        serviceName="s:MyService"
        endpointName="s:MyServiceEndpoint"
        xmlns:s="http://foo.bar/iface/" />

    <!-- route -->
    <camel:camelContext>
        <camel:route>
            <camel:from
                uri="cxf:bean:myServiceProxy" />
            <camel:to
                uri="cxf:bean:myService" />
        </camel:route>
    </camel:camelContext>

</beans>

Попытка запустить пакет в FUSE приводит к этому исключению

karaf@root> Exception in thread "SpringOsgiExtenderThread-22" org.apache.camel.RuntimeCamelException: java.lang.IllegalStateException: Endpoint address should be a relative URI wrt to the servlet address (use '/xxx' for example)
        at org.apache.camel.util.ObjectHelper.wrapRuntimeCamelException(ObjectHelper.java:1126)
        at org.apache.camel.spring.SpringCamelContext.onApplicationEvent(SpringCamelContext.java:103)
        at org.apache.camel.spring.CamelContextFactoryBean.onApplicationEvent(CamelContextFactoryBean.java:231)
        at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:97)

Я не знаю, что не так. Я сомневаюсь, что мой адрес конечной точки неверен, и я не знаю, какой у меня адрес сервлета (отсутствует атрибут адреса cxf: cxfEndoint servelt).

Буду признателен за любую помощь, которая приведет меня в правильном направлении для решения этой проблемы.

Спасибо Клаус

1 Ответ

1 голос
/ 07 апреля 2011

Я наконец узнал, что не так.

Вместо

<!-- the proxy service -->
<cxf:cxfEndpoint
    id="myServiceProxy"
    address="http://localhost:9003/cxf/myService"
    serviceClass="foo.bar.iface.MyServiceInterface" />

должно быть

<!-- the proxy service -->
<cxf:cxfEndpoint
    id="myServiceProxy"
    address="/myService"
    serviceClass="foo.bar.iface.MyServiceInterface" />

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

Внутри FUSE будет использоваться встроенный HTTP-сервер (localhost: 8181), а URL-адрес службы будет расширен до http://localhost:8181/cxf/myService.

...