karaf osgi

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

这是有关如何

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

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

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

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

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

项目结构如下所示:

步骤1有两个婴儿步骤。

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

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

接口

@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实现如下:

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

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

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

    请查看我在Karaf的OSGi中构建普通CXF服务(不使用Camel)的其他文章 . 这是有关如何 创建一个CXF REST服务 使用骆驼多播(并并行化)传入的请求 来自两个不同服务的源数据 汇总响应 ...

  2. spring cloud构建互联网分布式微服务云平台-断路器聚合监控(Hystrix Turbine)

    一.Hystrix Turbine简介 看单个的Hystrix Dashboard的数据并没有什么多大的价值,要想看这个系统的Hystrix Dashboard数据就需要用到Hystrix Turbi ...

  3. 组播技术中IP地址到MAC地址的映射

    以太网组播MAC地址 以太网传输单播IP报文的时候,目的MAC地址使用的是接收者的MAC地址.但是在传输组播数据包时,其目的地不再是一个具体的接收者,而是一个成员不确定的组,所以要使用组播MAC地址. ...

  4. RPF检查在组播数据转发中的应用

    组播路由协议通过已有的单播路由信息来确定上.下游邻居设备,创建组播路由表项.运用RPF检查机制,来确保组播数据流能够沿组播分发树(路径)正确的传输,同时可以避免转发路径上环路的产生.         ...

  5. Karaf教程第1部分 安装Karaf与第一个应用

    原文链接:http://blog.csdn.net/wusandi/article/details/78172261 1.1 karaf入门 在这个帖子中,我将编写关于Apache Karaf的一系列 ...

  6. 在k8s中使用gradle构建java web项目镜像Dockerfile

    在k8s中使用gradle构建java web项目镜像Dockerfile FROM gradle:6-jdk8 AS build COPY --chown=gradle:gradle . /home ...

  7. 通过前序遍历和中序遍历构建二叉树 python实现

    前言 通过前序遍历和中序遍历构建二叉树的原理,主要是找前序遍历根节点在中序遍历中的位置,然后将二叉树而成左子树和右子树,然后依次进行这样的操作,思路还是比较简单的 代码 class Node:def ...

  8. dubbo2.5-spring4-mybastis3.2-springmvc4-mongodb3.4-redis3(十)之Spring MVC中使用 Swagger2 构建Restful API...

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u010046908/article/details/55047193 1.Swagger2是什么? ...

  9. Spring Boot中使用Swagger2构建RESTful APIs

    关于 Swagger Swagger能成为最受欢迎的REST APIs文档生成工具之一,有以下几个原因: Swagger 可以生成一个具有互动性的API控制台,开发者可以用来快速学习和尝试API. S ...

最新文章

  1. 电子商务网站是这样诞生的
  2. 零基础学编程学java还是python-零基础学编程,Java和Python你pick谁?
  3. Angular单元测试如何只执行指定的测试用例,提高测试速度
  4. 邢台职业技术学院计算机系宿舍,邢台职业技术学院宿舍条件怎么样 男生女生宿舍图片...
  5. 最详细的U-net论文笔记
  6. sql server 常用语句
  7. mysqldump 导入导出数据
  8. 搭建MySQL高可用架构MHA
  9. java的map的方法_Java中Map集合(接口)的基本方法程序演示
  10. excel查标准正态分布_Excel有关正态分布函数NORMSDIST做正态分布图
  11. 修改linux主机名称
  12. 抽象工厂模式---游戏等级
  13. Eclipse中如何创建文件夹管理多个项目
  14. v-for中的key是什么作用?
  15. 1217: 青蛙(二)
  16. 计算机组成原理~计算机系统简介①
  17. 关于“Android Studio and Gradle are using different locations for the JDK.”提示的解决方法
  18. 深度学习模型实战-深度学习模型在各大公司实际生产环境的应用讲解文章
  19. 3g显卡测试软件,GTX1060显卡6G、5G、3G性能对比测试
  20. GAE初探-一鼻子灰

热门文章

  1. 【记忆化搜索】【dfs】【递归】Chocolate
  2. NCPC2018 D.Delivery Delays[二分答案+DP check]
  3. 2.数据湖DeltaLake之DDL操作
  4. JavaFX中WebView的java与JS代码互相调用
  5. Google的面试题长啥样
  6. Java中的List你真的会用吗
  7. php如何接收前端返回的各种类型的数据
  8. 亦云小组KTV点歌系统简介
  9. ssh(Spring+Spring mvc+hibernate)——BaseDaoImpl.java
  10. 电脑基本快捷键的使用