阿帕奇骆驼备忘单
輪詢一個(gè)空目錄(并發(fā)送一個(gè)空消息,正文為空):
from('file://temp?sendEmptyMessageWhenIdle=true')停止路線:
.process(new Processor() {public void process(Exchange exchange) throws Exception {getContext().stopRoute('ROUTE_ID');} })訪問主體中對象的屬性:
承認(rèn)對象有一個(gè)名為'getMydata()'的方法:
new ValueBuilder(simple('${body.mydata}')).isEqualTo(...)定義一個(gè)聚合器:
.aggregate(simple('${header.id}.substring(0,15)'), genericAggregationStrategy) .completionPredicate(header(Exchange.BATCH_COMPLETE).isEqualTo(Boolean.TRUE))- '${header.id}.substring(0,15)' :標(biāo)記以區(qū)分消息(此處,返回的字符串是所有消息所共有,我們將它們匯總在一起)
- Exchange.BATCH_COMPLETE :謂詞表示輪詢結(jié)束(例如,解析的所有文件)
- genericAggregationStrategy :上面是一個(gè)聚合器的示例,該聚合器將列表中所有消息的內(nèi)容分組:
手動(dòng)觸發(fā)聚合的完成(無論它是什么):
發(fā)送標(biāo)題為Exchange.AGGREGATION_COMPLETE_ALL_GROUPS = true的消息
可以執(zhí)行from('bean:...') ,因?yàn)橹涝揵ean將被永久輪詢(如使用'file')并每次都被實(shí)例化。 使用以下命令修改路線上的郵件正文 :
與myExpression :
public class MyExpression implements Expression {public <T> T evaluate(Exchange exchange, Class<T> type) {MyBean newData = ...;return exchange.getContext().getTypeConverter().convertTo(type, newData);} }使用JaxB:
- 在路線上: .[un]marshal().jaxb('my.business_classes.package')
- 具有可配置的DataFormat: .[un]marshal(jaxbDataFormat)
與:
線程管理的一般概念:
- 一個(gè)from(...) =一個(gè)線程
- 除了from('direct:...') wich會(huì)創(chuàng)建一個(gè)具有唯一標(biāo)識(shí)符的“命名路由”,該標(biāo)識(shí)符只能由另一條路由(與調(diào)用方在同一線程中)調(diào)用。
- 組件.resequence().batch()創(chuàng)建一個(gè)新線程以重新拋出消息。
定義關(guān)閉策略:
getContext().setShutdownStrategy(new MyShutdownStrategy(getContext()));與:
public class MyShutdownStrategy extends DefaultShutdownStrategy {protected CamelContext camelContext;private long timeout = 1;private TimeUnit timeUnit = TimeUnit.SECONDS;public SpiralShutdownStrategy(CamelContext camelContext) {this.camelContext = camelContext;}@Overridepublic long getTimeout() {return this.timeout;}@Overridepublic TimeUnit getTimeUnit() {return this.timeUnit;}@Overridepublic CamelContext getCamelContext() {return this.camelContext;}/*** To ensure shutdown**/@Overridepublic void suspend(CamelContext context, List<RouteStartupOrder> routes) throws Exception {doShutdown(context, routes, getTimeout(), getTimeUnit(), false, false, false);}/*** To ensure shutdown**/@Overridepublic void shutdown(CamelContext context, List<RouteStartupOrder> routes, long timeout, TimeUnit timeUnit) throws Exception {doShutdown(context, routes, this.timeout, this.timeUnit, false, false, false);}/*** To ensure shutdown**/@Overridepublic boolean shutdown(CamelContext context, RouteStartupOrder route, long timeout, TimeUnit timeUnit, boolean abortAfterTimeout)throws Exception {super.shutdown(context, route, this.timeout, this.timeUnit, false);return true;} }停止批處理:
.process(new Processor() {public void process(Exchange exchange) throws Exception {context.stop();} });從路由調(diào)用bean的方法:
- public void myMethod(Exchange e) :
不會(huì)修飾身體 - public boolean myMethod(Exchange e) :
布爾值(或任何原始類型)將在主體中設(shè)置 - public Object myMethod(Exchange e) :
該對象將被放置在主體中(即使為null) - public Message myMethod(Exchange e) :
郵件將被放置在正文中(最好避免這種情況) - public List<Object> myMethod(Exchange e) :
該列表將在正文中設(shè)置:與.split()使用時(shí),每個(gè)對象將以新消息發(fā)送 - public List<Message> myMethod(Exchange e) :
該列表將在正文中設(shè)置: .split()將為每個(gè)元素創(chuàng)建一條新消息(最好避免,見上)
- public void myMethod(Exchange e) :
完整的交換將通過 - public void myMethod(Object o) :
駱駝將嘗試在所需參數(shù)的類中轉(zhuǎn)換主體 - public void myMethod(@Body File o, @Header('myHeader') String myParamHeader) :
駱駝將按規(guī)定注入每個(gè)參數(shù)
路線上的例外管理:
- 以全局方式(在所有路徑之前聲明): onException(MyException.class, RuntimeCamelException.class).to(...)...
- 真正處理異常而不在路徑(和日志)中冒泡: onException(...).handled(true).to(...)...
- 在Exception之后繼續(xù)在路由中進(jìn)行處理: onException(...).continued(true).to(...)...
- 例外是“已處理”或“繼續(xù)”
- 本地方式(沿路線): from(...) .onException(...).to('manage_error').log('FAIL !!').end() .to('continue_route')...
要寫入文件,只需要標(biāo)題Exchange.FILE_NAME 。
使用
- 使用表達(dá)式從唯一的可比較“鍵”(數(shù)字,字符串或自定義比較器)計(jì)算消息的新順序
- 兩種方式:
- .batch():批處理模式。
用標(biāo)記分裂身體:
.split(body().tokenize('TOKEN'))知道令牌將從內(nèi)容中刪除。 例如,如果收到包含以下內(nèi)容的消息:“ data1TOKENdata2TOKENdata3”,則創(chuàng)建的消息將為:“ data1”,“ data2”,“ data3”。 因此,在處理XML數(shù)據(jù)時(shí)應(yīng)避免這種情況,建議使用“ tokenizeXML()”。
動(dòng)態(tài)訪問人體數(shù)據(jù):
- 輕量級(jí)“腳本”語言: 簡單表達(dá)語言
- 讀取文件數(shù)據(jù): 文件表達(dá)語言
發(fā)送郵件:
from('direct:mail').setHeader('To', constant(mailTo)).setHeader('From', constant(mailFrom)) .setHeader('Subject', constant(mailSubject)) .to('smtp://${user}@${server}:${port}?password=${password}');帶有附件:
.beanRef(MAIL_ATTACHER, 'attachLog'); //with public class MailAttacher {public void attachLog(Exchange exc) throws Exception {File toAttach = ...; exc.getIn().addAttachment(toAttach.getName(), new DataHandler(new FileDataSource(toAttach)));// if neededexc.setProperty(Exchange.CHARSET_NAME, 'UTF-8');} }有用的Exchange屬性:
- Exchange.AGGREGATED_ *:聚合管理
- Exchange.BATCH_ *:已處理的郵件管理
- Exchange.FILE_ *:文件消息管理
- Exchange.HTTP_ *:Web請求管理
- Exchange.LOOP_ *:循環(huán)管理
- Exchange.REDELIVERY_ *:異常管理
- Exchange.SPLIT_ *:分割內(nèi)容管理
循環(huán)路線:
from('direct:...') .loop(countExpression) .to('direct:insideLoop') .end()其中“ countExpression”是用于動(dòng)態(tài)計(jì)算循環(huán)計(jì)數(shù)(評(píng)估進(jìn)入循環(huán))的表達(dá)式。 如果過程很復(fù)雜,最好將循環(huán)的代碼移動(dòng)到新的路徑中。
標(biāo)頭管理:
消息的標(biāo)題是在其創(chuàng)建時(shí)定義的。 當(dāng)使用'.split()'時(shí),所有后續(xù)消息都將具有與原始消息相同的標(biāo)頭(因此,在管理文件時(shí)要小心)。 聚合中,必須手動(dòng)管理自定義標(biāo)頭,以保留在其余路由中。
截取消息
并執(zhí)行路由并行化(在路由之前聲明):
interceptSendToEndpoint('ENDPOINT_TO_INTERSEPT').to(...)...參考: Developpef博客上來自我們JCG合作伙伴 Paul-Emmanuel的Apache Camel Cheatsheet 。
翻譯自: https://www.javacodegeeks.com/2013/01/apache-camel-cheatsheet.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
- 上一篇: 战车对战手游(安卓战车大战)
- 下一篇: 流利的对象创建