在OSGi中为Karaf构建Camel-CXF REST服务–组播和聚合
請查看我在Karaf的OSGi中構建普通CXF服務(不使用Camel)的其他文章 。
這是有關如何
您可以從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方法雖然有些粗糙,但是可以完成工作。
翻譯自: https://www.javacodegeeks.com/2013/10/building-camel-cxf-rest-service-in-osgi-for-karaf-multicasting-and-aggregation.html
總結
以上是生活随笔為你收集整理的在OSGi中为Karaf构建Camel-CXF REST服务–组播和聚合的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 封闭式净值型理财产品会亏吗?
- 下一篇: 什么是期货高频交易?
