日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/3 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 karaf osgi_在OSGi中为Karaf构建Camel-CXF REST服务–组播和聚合 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

karaf osgi

請查看我在Karaf的OSGi中構建普通CXF服務(無Camel)的其他文章 。

這是有關如何

  • 創建一個CXF REST服務
  • 使用駱駝多播(并并行化)傳入的請求
  • 來自兩個不同服務的源數據
  • 匯總響應并
  • 最后將合并結果作為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方法雖然有些粗糙,但是可以完成工作。

  • 每當所有多播端點完成時,都將調用aggregate方法。
  • 因此,第一次,oldExchange將為null。 我們以此為契機來構建我們想要響應用戶的最終合并結果實體。
  • 我們檢查傳入的newExchange是調用NameEmailService還是AgePhoneService的結果,并相應地填充合并的實體。
  • 最后,我們返回合并的實體–返還完成兩項工作。
  • 合并的實體以oldExchange形式出現,以供下一次調用aggregate方法。 (更像是鏈接–實體最后返回的對象是作為下一個調用的傳入交換傳入的對象)
  • 如果它是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服务–组播和聚合的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。