java - Camel CXF(代码优先)Tomcat示例——如何部署客户端
问题描述
我基于 Camel CXF(代码优先)Tomcat 示例构建了一个项目,其中 CFX Web 服务由 java 接口定义。在示例中,WS 接口是 IncidentService.java。在我的项目中,服务接口称为 Ingester,并定义了一个上传(字符串正文,字符串 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");
客户端项目通过将服务器项目导入为引用项目(在 Eclipse 中)来引用 Ingester 接口。
这一切都按预期工作。
现在我只想在用户机器上部署客户端(并让它仍然工作)。
第一种方法我只是简单地 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 将传递给 body 参数,就像在上面的代码第一个示例中一样。
我不认为打包服务器并将其作为依赖存储库包含在内是正确的方法,主要是因为它看起来有点矫枉过正。
谢谢
解决方案
我得到了这个工作,但我不相信这是最好的解决方案。我将服务器作为依赖项包含在客户端中,这真的是个好主意吗?我在我的 POM 中添加了 Shade 插件的东西(从这个答案Apache CXF 客户端在 Eclipse 中加载正常,但独立 jar 在 WSDLServiceFactory 中抛出 NullpointerException)
推荐阅读
- qt - QFileDialog 中的工具提示(或其他操作)
- javascript - 如何从亚马逊 S3 返回变量
- firebase - 如何处理来自 Google 的此警告电子邮件:Google Cloud Platform 的可公开访问的 Google API 密钥?
- powershell - 为什么 PS Get-ChildItem 这么难
- c++ - Poco C++ 库发送异步服务器回复
- android - OnCompleteListener 的问题
在科特林 - mysql - 从没有用户定义变量的有序值中查找值范围?
- python - 基本 Flask 应用程序未在 Heroku Postgres 数据库中创建表
- deployment - 如何在远程服务器上部署网站,以便局域网中的其他人只能使用 IP 地址和端口号访问它?
- laravel - 如何使用按钮清除数据?拉拉维尔