Пример Camel CXF (сначала код) Tomcat - как развернуть клиент - PullRequest
0 голосов
/ 06 ноября 2018

Я создал проект, основанный на примере Tomcat Camel CXF (сначала код), в котором веб-сервис CFX определяется Java-интерфейсом. В этом примере интерфейс WS - это IncidentService.java. В моем проекте интерфейс службы называется Ingester и определяет метод upload (String body, String id). Служба развертывается в tomcat, и я вызываю службу из клиента в другом проекте, используя этот код:

ClientProxyFactoryBean factory = new ClientProxyFactoryBean();
                factory.setServiceClass(Ingester.class);
                factory.setAddress(toURL);
                Ingester client = (Ingester) factory.create();
                String out = client.upload(exchange.getIn().getBody(String.class),"2");

Клиентский проект ссылается на интерфейс Ingester, импортируя проект сервера как ссылочный проект (в Eclipse).

Все работает как положено.

Теперь я хочу развернуть только клиент на пользовательском компьютере (и он все еще работает).

Первый подход: я просто jar'd клиента (используя maven). Когда я запускаю исполняемый файл jar, я получаю сообщение об ошибке, что класс ws.Ingester не найден.

    org.apache.camel.CamelExecutionException: Exception occurred during execution on the exchange: Exchange[ID-VSWINLT019-1541482662292-0-1]
        at org.apache.camel.util.ObjectHelper.wrapCamelExecutionException(ObjectHelper.java:1846)
        at org.apache.camel.impl.DefaultExchange.setException(DefaultExchange.java:385)
        at org.apache.camel.processor.DelegateSyncProcessor.process(DelegateSyncProcessor.java:66)
        at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:548)
        at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:201)
        at org.apache.camel.processor.Pipeline.process(Pipeline.java:138)
        at org.apache.camel.processor.Pipeline.process(Pipeline.java:101)
        at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:201)
        at org.apache.camel.component.timer.TimerConsumer.sendTimerExchange(TimerConsumer.java:197)
        at org.apache.camel.component.timer.TimerConsumer$1.run(TimerConsumer.java:79)
        at java.util.TimerThread.mainLoop(Unknown Source)
        at java.util.TimerThread.run(Unknown Source)
Caused by: java.lang.NoClassDefFoundError: ws.Ingester 
        at qp.PullRoute$1.process(PullRoute.java:54)
        at org.apache.camel.processor.DelegateSyncProcessor.process(DelegateSyncProcessor.java:63)
        ... 9 more
Caused by: java.lang.ClassNotFoundException: ws.Ingester

Я не уверен, какой путь пойти по этому пути, и я попробовал несколько подходов без успеха.

Я бы хотел сделать что-то вроде следующего, удалив ссылку на интерфейс IncidentService:

.to("cxf://http://localhost:8080/data-ingest-service/webservices/ws"
            + "?serviceClass=ws.Ingester"
            + "?serviceName=upload"
            + "?id=1")

Это правильное направление? Я получаю следующее исключение, как заставить это работать?

Exception in thread "main" org.apache.camel.RuntimeCamelException: org.apache.camel.FailedToCreateRouteException: Failed to create route route1 at: >>> To[cxf://http://localhost:8080/data-ingest-service/webservices/ws?serviceClass=ws.Ingester?serviceName=upload?id=1] <<< in route: Route(route1)[[From[timer://Timer?period=60000]] -> [OnExcep... because of Failed to resolve endpoint: cxf://http://localhost:8080/data-ingest-service/webservices/ws?serviceClass=ws.Ingester%3FserviceName%3Dupload%3Fid%3D1 due to: ws.Ingester?serviceName=upload?id=1

Может кто-нибудь дать мне совет по этому вопросу, пожалуйста. Параметр id, кажется, является частью проблемы, и я предполагаю, что тело будет передано параметру body, как это делается в первом примере кода выше.

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

спасибо

Ответы [ 2 ]

0 голосов
/ 18 ноября 2018

У меня получилось, но я не уверен, что это лучшее решение. Я включил сервер в качестве зависимости в клиенте, неужели это хорошая идея? Я добавил материал плагина Shade в свой POM (из этого ответа Клиент Apache CXF нормально загружается в Eclipse, но автономный jar создает исключение NullpointerException в WSDLServiceFactory )

0 голосов
/ 06 ноября 2018

Я думаю, что проще всего, если вы упаковываете войну (измените packaging в вашем pom.xml) на WEB-INF/web.xml

Первый шаг в вашем pom.xml:

<packaging>war</packaging>

Теперь для вашего web.xml:

<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

  <display-name>Web Application</display-name>

  <!-- Context loader -->
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:camel-context.xml</param-value>
  </context-param>

  <!-- CXF servlet -->
  <servlet>
    <servlet-name>CXFServlet</servlet-name>
    <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>CXFServlet</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>
</web-app>

Тогда вы можете запустить войну в веб-контейнере, например. кот.

В качестве альтернативы, если вы хотите просто запустить jar, вы должны посмотреть на встроенный jetty сервер или что-то в этом роде.

...