Я создал проект, основанный на примере 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, как это делается в первом примере кода выше.
Я не чувствую, что упаковка сервера и включение его в качестве зависимого хранилища - правильный путь, в основном потому, что это выглядит как перебор.
спасибо