karaf osgi_在OSGi中为Karaf构建Camel-CXF REST服务–组播和聚合

karaf osgi

请查看我在Karaf的OSGi中构建普通CXF服务(无Camel)的其他文章 。

这是有关如何

  1. 创建一个CXF REST服务
  2. 使用骆驼多播(并并行化)传入的请求
  3. 来自两个不同服务的源数据
  4. 汇总响应并
  5. 最后将合并结果作为JSON返回给最终用户。

您可以从github下载整个代码库 。

简单来说,此应用程序可以做什么

此服务的预期结果是一个硬编码的响应,看起来像

最终输出

从图像中可以看到,响应的顶部来自一个名为NameEmailService的服务,响应的第二部分来自一个名为AgePhoneService的服务。 同时充实数据的调用和合并结果实体– ConsolidatedSearchResult被填充。

项目结构如下所示:

项目结构2

步骤1有两个婴儿步骤。

步骤1.a –创建CXF REST服务

您可能已经猜到了,这一步没有什么复杂的。 只是一个接口和一个实现。

RESTClassDiagram2

接口

@Path("rest")
public interface RestService {@GET@Path("query/{queryString}")@Produces(MediaType.APPLICATION_JSON)public String sourceResultsFromTwoSources(@PathParam("queryString") String queryString);}

实作

public class RestServiceImpl implements RestService {private static Logger logger= LoggerFactory.getLogger(AgePhoneServiceImpl.class);private NameEmailService nameEmailService;private AgePhoneService agePhoneService;public RestServiceImpl(){}//Do nothing. Camel intercepts and routes the requestspublic String sourceResultsFromTwoSources(String queryString) {return null;}public NameEmailResult getNameEmailResult(String queryString){logger.info("Invoking getNameEmailResult from RestServiceImpl");return nameEmailService.getNameAndEmail(queryString);}public AgePhoneResult getAgePhoneResult(String queryString){logger.info("Invoking getAgePhoneResult from RestServiceImpl");return agePhoneService.getAgePhoneResult(queryString);}public NameEmailService getNameEmailService() {return nameEmailService;}public AgePhoneService getAgePhoneService() {return agePhoneService;}public void setNameEmailService(NameEmailService nameEmailService) {this.nameEmailService = nameEmailService;}public void setAgePhoneService(AgePhoneService agePhoneService) {this.agePhoneService = agePhoneService;}
}

请注意,方法实现sourceResultsFromTwoSources返回null。 事实是,进行REST调用时甚至不会调用此方法。 骆驼拦截所有对URL的请求并将其路由到各个端点(在我们的例子中,调用两个方法– getNameEmailResult()getAgePhoneResult() )。

步骤1.b –创建服务实现

NameEmailService和AgePhoneService的Kiddish实现如下:

ServiceClassDiagram2

NameEmailServiceImpl

public class NameEmailServiceImpl implements NameEmailService {public NameEmailResult getNameAndEmail(String queryString){return new NameEmailResult("Arun", "arun@arunma.com");}}

AgePhoneServiceImpl

public class AgePhoneServiceImpl implements AgePhoneService {public AgePhoneResult getAgePhoneResult(String queryString){return new AgePhoneResult(32, "111-222-333");}
}

第2、3、4和5步

好吧,当我说2、3、4和5是4个步骤时,我撒了谎。 使用Camel路由及其企业集成模式实现,所有这些操作都只需一步即可完成。

RestToBeanRouter

public class RestToBeanRouter extends RouteBuilder {@Overridepublic void configure() throws Exception {from ("cxfrs://bean://rsServer").multicast().parallelProcessing().aggregationStrategy(new ResultAggregator()).beanRef("restServiceImpl", "getNameEmailResult").beanRef("restServiceImpl", "getAgePhoneResult").end().marshal().json(JsonLibrary.Jackson).to("log://camelLogger?level=DEBUG");}
}

我们的路由说明

简而言之,routerbuilder所做的就是

1) from ("cxfrs://bean://rsServer")拦截对在rest-blueprint.xml定义的JAX-RS服务器端点的所有请求,如下所示:

rest-blueprint.xml

<cxf:rsServer id="rsServer" address="/karafcxfcamel"serviceClass="me.rerun.karafcxfcamel.rest.RestServiceImpl"loggingFeatureEnabled="true" />

2) .multicast()将未更改的原始请求转发到

1. `getNameEmailResult`  &
2. `getAgePhoneResult` methods in `RestServiceImpl`

3) .parallelProcessing()并发调用这些方法。

4) .aggregationStrategy(new ResultAggregator())指定如何汇总来自各种多播源的结果。

我们的聚合器看起来像:

结果聚合器

public class ResultAggregator implements AggregationStrategy {@Overridepublic Exchange aggregate(Exchange oldExchange, Exchange newExchange) {ConsolidatedSearchResult consolidatedSearchResult=null;if (oldExchange==null){consolidatedSearchResult=new ConsolidatedSearchResult();}else{consolidatedSearchResult=oldExchange.getIn().getBody(ConsolidatedSearchResult.class);}NameEmailResult nameEmailResult=newExchange.getIn().getBody(NameEmailResult.class);AgePhoneResult agePhoneResult=newExchange.getIn().getBody(AgePhoneResult.class);if (nameEmailResult!=null){consolidatedSearchResult.setNameEmailResult(nameEmailResult);}if (agePhoneResult!=null){consolidatedSearchResult.setAgePhoneResult(agePhoneResult);}newExchange.getIn().setBody(consolidatedSearchResult);return newExchange;}
}

我们的聚合器解释

我们的ResultAggregator中的aggregate方法虽然有些粗糙,但是可以完成工作。

  1. 每当所有多播端点完成时,都将调用aggregate方法。
  2. 因此,第一次,oldExchange将为null。 我们以此为契机来构建我们想要响应用户的最终合并结果实体。
  3. 我们检查传入的newExchange是调用NameEmailService还是AgePhoneService的结果,并相应地填充合并的实体。
  4. 最后,我们返回合并的实体–返还完成两项工作。
    1. 合并的实体以oldExchange形式出现,以供下一次调用aggregate方法。 (更像是链接–实体最后返回的对象是作为下一个调用的传入交换传入的对象)
    2. 如果它是aggregate的最后一次调用(所有多播端点调用已完成),则将其返回给用户。

参考:在Rerun.me博客上,我们的JCG合作伙伴 Arun Manivannan从OSGi中为Karaf构建Camel-CXF REST服务–多播和聚合 。

翻译自: https://www.javacodegeeks.com/2013/10/building-camel-cxf-rest-service-in-osgi-for-karaf-multicasting-and-aggregation.html

karaf osgi

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/346507.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

10g gtx 光纤通信测试_光纤通信系统仿真实验

1实验四光纤通信系统仿真实验【实验目的】1.掌握光纤通信系统的组成及各部分功能。2.熟悉Optisystem实验环境&#xff0c;练习使用元件库中的常用元件组建光纤通信系统。3.利用Optisystem的仿真光纤通信系统&#xff0c;并进行分析。【实验仪器】Optisystem软件计算机【实验内容…

酒店wifi代理服务器没有响应,wn10连接酒店wifi的登录界面无法弹出如何处理

通常情况下&#xff0c;我们在连接酒店wifi后都会出现登录验证界面。不过&#xff0c;最近一位windows10系统用户在连接wifi后打开网页却遇到无法显示登陆界面情况&#xff0c;该怎么办呢&#xff1f;接下来&#xff0c;就随小编一起看看wn10连接酒店wifi的登录界面无法弹出问题…

监视和管理备份系统

上一次我们建立了一个强大的备份系统 &#xff0c;现在我们将研究如何监视备份集。 我们需要验证备份集是否已正确清理&#xff08;这称为删除策略&#xff09;以及它们是否一致&#xff08;称为一致性策略&#xff09;。 备份集可以包含多个文件集。 文件集是备份文件的集合&…

linux rsa登录改密码登录_linux服务器secureCRT RSA登录配置

为了保证生产服务器的安全&#xff0c;我们会做一些安全的登录验证措施&#xff01;不允许使用root账号直接登录服务器&#xff01;下面是通过secureCRT 设置RSA登录配置。1、RSA公钥配置方法(1)打开secureCRT选择一个连接然后点属性再如图所示(2)一直点下去 点击下一步要选RS…

python词云安装什么库_python词云安装什么库

python词云需要安装wordcloud库。 安装方法&#xff1a; 在cmd使用pip install wordcloud命令即可安装。 wordcloud库把词云当作一个WordCloud对象&#xff1a;wordcloud.WordCloud()代表一个文本对应的词云。 可以根据文本中词语出现的频率等参数绘制词云。 示例&#xff1a;f…

微软ODBC服务器驱动,解决安装SQL Server时[Microsoft][ODBC 驱动程序管理器] 未发现数据源的问题...

在Windows Server 2003 上安装 MS SQL Server 2000 时&#xff0c;最后阶段安装程序在配置服务器时&#xff0c;出现“[Microsoft][ODBC 驱动程序管理器] 未发现数据源”&#xff0c;具体提示为&#xff1a;#################################################################…

怎么wps解除合并单元格_wps表格怎么锁定单元格

wps表格怎么锁定单元格呢&#xff1f;很多用户对此还不是很清楚&#xff0c;小编这里就给大家带来有关wps表格怎么锁定单元格的回答&#xff0c;希望能够对大家有所帮助。一、整个表格进行锁定1、同时按住CtrlA&#xff0c;选中整个单元格&#xff0c;如图2、选中以后&#xff…

挡土墙计算软件_广联达软件如何计算钢板止水带?

原创作者&#xff1a;张向荣1、什么是钢板止水带&#xff1f;混凝土结构中&#xff0c;地下室墙体施工中&#xff0c;如果底板和墙体分开浇筑&#xff0c;就需要留置施工缝。施工缝&#xff1a;施工缝并不是一种真实存在的“缝”&#xff0c;它只是因先浇筑混凝土超过初凝时间&…

网站图片多服务器选多大,网站上的图片一般多大合适

网站上的图片一般多大合适 内容精选换一换安装了SSL证书后&#xff0c;访问网站时&#xff0c;HTTPS比HTTP要多几次握手的时间&#xff0c;HTTPS协议握手阶段比较费时&#xff0c;同时还要进行RSA校验&#xff0c;因此使用了SSL证书后&#xff0c;相较于HTTP访问&#xff0c;访…

web网站服务器宕机应急,web服务器的宕机诊断方法

宕机诊断方法编辑步骤1&#xff1a;发生了什么事系统管理员必须肩负起分析和判断Web服务器宕机原因的责任。需要解决如下的问题&#xff1a;是否是断电&#xff0c;发电机测试以及其他类似问题影响了整体物理环境?和Web服务器的通信是否已经完全被阻断&#xff0c;还是某些IP段…

eclipsejvm内存不足_Eclipse无法调试及编译时内存不足的解决

Eclipse下Debug时&#xff0c;弹出错误提示&#xff1a;“Unable to install breakpoint due to missing line number attributes. Modify compiler options to generate line number attributes”&#xff0c;无法进行调试。遇到这个错误时找到的解答方案汇总&#xff1a;1、修…

怎么在自己的网站上显示其它网站_自己做网站要怎么选域名?

域名是一种无形的资产注册一个好的域名能让你的网站更加容易取得成功&#xff0c;那么什么样的域名才是好域名呢?自己做网站域名要怎么选呢?1.好记的域名如果一个喜欢你网站的网友&#xff0c;电脑硬盘坏了丢失了收藏夹里所有的网址&#xff0c;或者在他人机器上上网&#xf…

Java的String.format可以静态导入

JDK-8203630 [“为String :: format添加等效的实例方法”]假定“将String :: format实现为静态的参数似乎是可以静态导入 format方法&#xff0c;因此其行为与C的sprintf比较 。” 在有关该主题的StackOverflow.com线程上 &#xff0c; Brandon Yarbrough写道&#xff1a;“通过…

微信朋友圈删除后服务器还有吗,删了的朋友圈还可以找回来吗

演示工具&#xff1a;手机型号&#xff1a;iphone12系统版本&#xff1a;ios14软件版本&#xff1a;微信7.0.20删除的朋友圈动态不能找回来。删除是从网络服务器上面把此信息删除了&#xff0c;是无法找回的&#xff0c;而已删除掉以后&#xff0c;好友那边此条动态也是同步删除…

mysql drop_mysql恢复drop掉的表

手贱drop了几个表&#xff0c;以为能从昨天的备份中恢复&#xff0c;结果发现最近两个月的备份都是空文件&#xff0c;因为备份脚本在两个月前改错了&#xff01;难道就这样丢失两个月的数据&#xff1f;镇定镇定——先看看mysql的配置文件cat /etc/my.cnf发现如下字样说明有救…

修改网站首页批处理_几个神奇的批处理,万事不求人!

文字 | 配图 | 排版 |©老Y网站&#xff1a;www.youquhome.cn小白可能会问啥事批处理&#xff1f;批处理(Batch)&#xff0c;也称为批处理脚本。是对某对象进行批量的处理&#xff0c;通常被认为是一种简化的脚本语言&#xff0c;它应用于DOS和Windows系统中。批处理文件的…

全境封锁服务器维护 2018,全境封锁全域事件2018年8月活动什么时候开始_全域事件怎么玩...

本文给大家带来全境封锁全域事件2018年8月活动时间介绍&#xff0c;全境封锁全域事件三进击即将到来&#xff0c;想要刷面具的不要错过哦。全域事件三&#xff1a;进击重新回归了!开始时间&#xff1a;8 月 27 日周一结束时间&#xff1a;9 月 2 日周日参加这一次的全域事件将会…

linux下部署mysql数据库连接_Linux远程部署MySQL数据库详细步骤

Linux远程部署MySQL数据库&#xff0c;供大家参考&#xff0c;具体内容如下1.0 安装 yum install lrzsz -y 命令(导入外界压缩包插件(已下载无视即可))1.1 将mysql压缩包拷贝到 /usr/local 文件目录下进行解压&#xff1a;1.2 将导入的Mysql压缩包进行解压,输入&#xff1a;tar…

nginx 电子书_Nginx最详细的反向代理配置步骤,拿去不谢

点击“蓝字”关注我们#今日份技术干货#使用Nginx实现Web反向代理功能&#xff0c;实现如下功能&#xff1a;◆后端Web服务器两台&#xff0c;可以使用httpd实现◆Nginx采用轮询的方式调用后端Web服务器◆两台Web服务器的权重要求设置为不同的值◆最大失败次数为1&#xff0c;失…

wdcp安装mysql_安装wdCP,无法连接mysql,解决方法

安装wdCP&#xff0c;无法连接mysql&#xff0c;解决方法在ubuntu 12.04版本上安装wdCP&#xff0c;采用编译安装的方式&#xff0c;一路装下来最后悲催地报错了&#xff1a;ERROR 2002 (HY000): Cant connect to local MySQL server through socket /tmp/mysql.sock (2)无法连…