Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
Apache Camel¿ìËÙÈëÃÅ£¨Ï£©
 
  10050  次浏览      27
 2018-1-22 
 
±à¼­ÍƼö:
±¾ÎÄÀ´×ÔÓÚcsdn£¬ÎÄÕ½ô½Ó×ÅÉÏÁ½¸öÄÚÈÝ,±¾ÎÄÖ÷Òª½²½âÁËCamelContext£¬´úÂëʾÀý½²½â±È½ÏÏêϸ¡£

½ÓÉÏÎÄApache Camel¿ìËÙÈëÃÅ£¨ÖУ©

3-5-2-3Ñ­»·¶¯Ì¬Â·ÓÉ Dynamic Router

¶¯Ì¬Ñ­»·Â·ÓɵÄÌØµãÊÇ¿ª·¢ÈËÔ±¿ÉÒÔͨ¹ýÌõ¼þ±í´ïʽµÈ·½Ê½£¬¶¯Ì¬¾ö¶¨ÏÂÒ»¸ö·ÓÉλÖá£ÔÚÏÂһ·ÓÉλÖô¦ÀíÍê³ÉºóExchange½«±»ÖØÐ·µ»Øµ½Â·ÓÉÅжϵ㣬²¢Óɶ¯Ì¬Ñ­»·Â·ÓÉÔÙ´Î×ö³öз¾¶µÄÅжϡ£Èç´ËÑ­»·Ö´ÐÐÖ±µ½¶¯Ì¬Ñ­»·Â·Óɲ»ÄÜÔÙÕÒµ½ÈκÎÒ»ÌõеķÓÉ·¾¶ÎªÖ¹¡£ÏÂͼÀ´Ô´ÓÚ¹ÙÍø£¬Õ¹Ê¾Á˶¯Ì¬Ñ­»·Â·ÓɵŤ×÷Ч¹û£º

ÕâÀï¿ÉÒÔ¿´³ö¶¯Ì¬Ñ­»·Â·ÓÉ£¨dynamicRouter£©ºÍ֮ǰ½éÉܵĶ¯Ì¬Â·ÓÉ£¨recipientList£©ÔÚ¹¤×÷·½Ê½ÉϵIJîÒì¡£dynamicRouterÒ»´ÎÑ¡ÔñÖ»ÄÜÈ·¶¨Ò»Ìõ·ÓÉ·¾¶£¬¶ørecipientListÖ»½øÐÐÒ»´ÎÅжϲ¢È·¶¨¶àÌõ·ÓÉ·Ö֧·¾¶£»dynamicRouterÈ·¶¨µÄÏÂһ·ÓÉÔÚÖ´ÐÐÍê³Éºó£¬Exchange¶ÔÏ󻹻ᱻ·µ»Øµ½dynamicRouterÖÐÒԱ㿪ʼµÚ¶þ´ÎÑ­»·Åжϣ¬¶ørecipientList»áΪ¸÷¸ö·Ö֧·Óɸ´ÖÆÒ»¸ö¶ÀÁ¢µÄExchange¶ÔÏ󣬲¢ÇÒ¸÷¸ö·Ö֧·ÓÉÖ´ÐÐÍê³ÉºóExchange¶ÔÏóÒ²²»»á·µ»Øµ½recipientList£»ÏÂÃæÎÒÃÇ»¹ÊÇͨ¹ýÔ´´úÂëÆ¬¶Î£¬Ïò¸÷λ¶ÁÕßչʾdynamicRouterµÄʹÓ÷½Ê½¡£ÔÚ´úÂëÖУ¬ÎÒÃDZàÅÅÁËÈý¸ö·ÓÉDirectRouteAÖ÷Òª¸ºÔðͨ¹ýHttpЭÒé½ÓÊÕ´¦ÀíÇëÇ󣬲¢Ö´ÐÐdynamicRouter¡£DirectRouteBºÍDirectRouteCÁ½¸ö·ÓÉÊÇ¿ÉÄܱ»dynamicRouterÑ¡ÔñµÄ·Ö֧·¾¶£º

DirectRouteA

/**
* µÚÒ»¸ö·ÓÉ£¬Ö÷ÒªÓÃÓÚ¶¨ÒåÕû¸ö·Óɵįðµã
* ͨ¹ýHttpЭÒé½ÓÊÕ´¦ÀíÇëÇó
* @author yinwenjie
*/
public class DirectRouteA extends RouteBuilder {

/* (non-Javadoc)
* @see org.apache.camel.builder.RouteBuilder#configure()
*/
@Override
public void configure() throws Exception {
from("jetty:http://0.0.0.0:8282/dynamicRouterCamel")
// ʹÓÃdynamicRouter£¬½øÐС°¶¯Ì¬Â·ÓÉ¡±Ñ­»·£¬
// Ö±µ½Ö¸¶¨µÄÏÂÒ»¸öÔªËØÎªnullΪֹ
.dynamicRouter().method(this, "doDirect")
.process(new OtherProcessor());
}

/**
* ¸Ã·½·¨ÓÃÓÚ¸ù¾Ý¡°¶¯Ì¬Ñ­»·¡±µÄ´ÎÊý£¬È·¶¨ÏÂÒ»¸öÖ´ÐеÄEndpoint
* @param properties ͨ¹ý×¢½âÄܹ»»ñµÃµÄExchangeÖÐpropertiesÊôÐÔ£¬¿ÉÒÔ½øÐвÙ×÷£¬²¢·´Ó³ÔÚÕû¸ö·Óɹý³ÌÖÐ
* @return
*/
public String doDirect(@Properties Map<String, Object> properties) {
// ÔÚExchangeµÄpropertiesÊôÐÔÖУ¬È¡³öDynamic RouterµÄÑ­»·´ÎÊý
AtomicInteger time = (AtomicInteger)properties.get("time");
if(time == null) {
time = new AtomicInteger(0);
properties.put("time", time);
} else {
time = (AtomicInteger)time;
}
LOGGER.info("ÕâÊÇDynamic RouterÑ­»·µÚ£º¡¾" + time.incrementAndGet() + "¡¿´ÎÖ´ÐУ¡Ö´ÐÐỊ̈߳º" + Thread.currentThread().getName());

// µÚÒ»´ÎÑ¡ÔñDirectRouteB
if(time.get() == 1) {
return "direct:directRouteB";
}
// µÚ¶þ´ÎÑ¡ÔñDirectRouteC
else if(time.get() == 2) {
return "direct:directRouteC";
}
// µÚÈý´ÎÑ¡ÔñÒ»¸öLog4j-EndpointÖ´ÐÐ
else if(time.get() == 3) {
return "log:DirectRouteA?showExchangeId=true&showProperties=ture&showBody=false";
}

// ÆäËüÇé¿ö·µ»Ønull£¬ÖÕÖ¹ dynamicRouterµÄÖ´ÐÐ
return null;
}
}

ÔÚDirectRouteAÖÐÎÒÃÇʹÓá°Í¨¹ýÒ»¸ömethod·½·¨·µ»ØÐÅÏ¢¡±µÄ·½Ê½È·¶¨dynamicRouter¡°¶¯Ì¬Ñ­»·Â·ÓÉ¡±µÄÏÂÒ»¸öEndpoint¡£µ±È»ÔÚʵ¼ÊʹÓÃÖУ¬¿ª·¢ÈËÔ±»¹¿ÉÒÔÓкܶ෽ʽÏòdynamicRouter¡°¶¯Ì¬Ñ­»·Â·ÓÉ¡±·µ»ØÖ¸¶¨µÄÏÂÒ»Endpoint¡£ÀýÈçʹÓÃJsonPathÖ¸¶¨JSON¸ñʽÊý¾ÝÖеÄij¸öÊôÐÔÖµ£¬»òÕßʹÓÃXPathÖ¸¶¨XMLÊý¾ÝÖеÄij¸öÊôÐÔÖµ£¬ÓÖ»òÕßʹÓÃheader·½·¨Ö¸¶¨ExchangeÖÐHeader²¿·ÖµÄij¸öÊôÐÔ¡£µ«ÊÇÎÞÂÛÈçºÎÇ뿪·¢ÈËԱȷ¶¨Ò»¼þÊÂÇ飺ÏòdynamicRouterÖ¸¶¨ÏÂÒ»¸öEndpointµÄ·½Ê½ÖÐÊǻ᷵»Ønull½øÐÐÑ­»·ÖÕÖ¹µÄ£¬·ñÔòÕû¸ödynamicRouter»áÎÞÏÞµÄÖ´ÐÐÏÂÈ¥¡£

ÒÔÉÏdoDirect·½·¨ÖУ¬ÎÒÃǽ«Ò»¸ö¼ÆÊýÆ÷´æ´¢ÔÚÁËExchange¶ÔÏóµÄpropertiesÇøÓò£¬ÒÔ±ãÔÚͬһ¸öExchange¶ÔÏóÖ´ÐÐdoDirect·½·¨Ê±½øÐмÆÊý²Ù×÷¡£µ±Í¬Ò»¸öExchange¶ÔÏóµÚÒ»´ÎÖ´Ðж¯Ì¬Ñ­»·Â·ÓÉÅжÏʱ£¬Ñ¡ÔñdirectRouteB×îΪһÏ·ÓÉ·¾¶£»µ±Exchange¶ÔÏóµÚ¶þ´ÎÖ´Ðж¯Ì¬Ñ­»·Â·ÓÉÅжÏʱ£¬Ñ¡ÔñDirectRouteC×÷ΪÏÂһ·ÓÉ·¾¶£»µ±Exchange¶ÔÏóµÚÈý´ÎÖ´ÐÐʱ£¬Ñ¡ÔñÒ»¸öLog4j-Endpoint×÷ΪÏÂÒ»¸ö·ÓÉ·¾¶£»µ±Exchange¶ÔÏóµÚËÄ´ÎÖ´ÐÐʱ£¬×÷Ϊ·ÓÉ·¾¶Åжϵķ½·¨doDirect·µ»Ønull£¬ÒÔ±ãÖÕÖ¹dynamicRouterµÄÖ´ÐС£

²»ÄÜÔÚDirectRouteAÀàÖж¨ÒåÒ»¸öÈ«¾Ö±äÁ¿×÷Ϊѭ»·Â·ÓɵļÆÊýÆ÷£¬ÒòΪÓÉJetty-HttpConsumerÉú³ÉµÄÏ̳߳ØÖУ¬Ïß³ÌÊýÁ¿ºÍÏ̶߳ÔÏóÊǹ̶¨µÄ£¬²¢ÇÒCamelÒ²²»ÊÇΪÿһ¸öExchange¶ÔÏóµÄÔËÐд´½¨ÐµÄDirectRouteA¶ÔÏóʵÀý¡£ËùÒÔÈç¹ûÔÚDirectRouteAÀàÖж¨ÒåÈ«¾Ö±äÁ¿×÷Ϊѭ»·Â·ÓɵļÆÊýÆ÷£¬¸÷λ¶ÁÕß×Ô¼ºÏëÏë»á·¢ÉúʲôÑùµÄ½á¹û°É¡£±ðÂîÄï¡­¡­

DirectRouteB ºÍ DirectRouteC

/**
* ÕâÊÇÁíÒ»Ìõ·ÓÉ·ÖÖ§
* @author yinwenjie
*/
public class DirectRouteC extends RouteBuilder {
@Override
public void configure() throws Exception {
from("direct:directRouteC")
.to("log:DirectRouteC?showExchangeId=true&showProperties=ture&showBody=false");
}
}

ÓÉÓÚDirectRouteBºÍDirectRouteCÁ½¸ö·Óɶ¨ÒåµÄ´úÂë·Ç³£ÀàËÆ£¬ËùÒÔÕâÀïÖ»Ìù³öÆäÖÐÒ»¸ö¡£

Æô¶¯CamelÓ¦ÓóÌÐò£¬²¢½«Â·ÓɼÓÈëCamelContext

......
public static void main(String[] args) throws Exception {
// ÕâÊÇcamelÉÏÏÂÎĶÔÏó£¬Õû¸ö·ÓɵÄÇý¶¯È«¿¿ËüÁË¡£
ModelCamelContext camelContext = new DefaultCamelContext();
// Æô¶¯route
camelContext.start();
// ½«ÎÒÃDZàÅŵÄÒ»¸öÍêÕûÏûϢ·Óɹý³Ì£¬¼ÓÈëµ½ÉÏÏÂÎÄÖÐ
DynamicRouterCamel dynamicRouterCamel = new DynamicRouterCamel();
camelContext.addRoutes(dynamicRouterCamel.new DirectRouteA());
camelContext.addRoutes(dynamicRouterCamel.new DirectRouteB());
camelContext.addRoutes(dynamicRouterCamel.new DirectRouteC());

// ͨÓÃûÓоßÌåÒµÎñÒâÒåµÄ´úÂ룬ֻÊÇΪÁ˱£Ö¤Ö÷Ï̲߳»Í˳ö
synchronized (DynamicRouterCamel.class) {
DynamicRouterCamel.class.wait();
}
}
......

ÔËÐÐЧ¹û

[2016-06-27 20:44:52] INFO qtp1392999621-16 ÕâÊÇDynamic RouterÑ­»·µÚ£º¡¾1¡¿´ÎÖ´ÐУ¡Ö´ÐÐỊ̈߳ºqtp1392999621-16 (DynamicRouterCamel.java:105)

[2016-06-27 20:44:56] INFO qtp1392999621-16 Exchange[Id: ID-yinwenjie-240-57818-1467030193866-0-3, ExchangePattern: InOut, BodyType: org.apache.camel.converter.stream.InputStreamCache] (MarkerIgnoringBase.java:96)

[2016-06-27 20:44:56] INFO qtp1392999621-16 ÕâÊÇDynamic RouterÑ­»·µÚ£º¡¾2¡¿´ÎÖ´ÐУ¡Ö´ÐÐỊ̈߳ºqtp1392999621-16 (DynamicRouterCamel.java:105)

[2016-06-27 20:44:56] INFO qtp1392999621-16 Exchange[Id: ID-yinwenjie-240-57818-1467030193866-0-3, ExchangePattern: InOut, BodyType: org.apache.camel.converter.stream.InputStreamCache] (MarkerIgnoringBase.java:96)

[2016-06-27 20:44:56] INFO qtp1392999621-16 ÕâÊÇDynamic RouterÑ­»·µÚ£º¡¾3¡¿´ÎÖ´ÐУ¡Ö´ÐÐỊ̈߳ºqtp1392999621-16 (DynamicRouterCamel.java:105)

[2016-06-27 20:44:56] INFO qtp1392999621-16 Exchange[Id: ID-yinwenjie-240-57818-1467030193866-0-3, ExchangePattern: InOut, BodyType: org.apache.camel.converter.stream.InputStreamCache] (MarkerIgnoringBase.java:96)

[2016-06-27 20:44:56] INFO qtp1392999621-16 ÕâÊÇDynamic RouterÑ­»·µÚ£º¡¾4¡¿´ÎÖ´ÐУ¡Ö´ÐÐỊ̈߳ºqtp1392999621-16 (DynamicRouterCamel.java:105)

[2016-06-27 20:44:56] INFO qtp1392999621-16 ×îºóexchangeID = ID-yinwenjie-240-57818-1467030193866-0-3 | org.apache.camel.converter.stream.InputStreamCache@2abaa89c || ±»OtherProcessor´¦Àí | time = 4 (DynamicRouterCamel.java:150)

´ÓÒÔÉÏÖ´ÐÐЧ¹û¿´£¬ÎÞÂÛdynamicRouterÖ´ÐеÄÊǵڼ¸´ÎÑ­»·Åжϣ¬Exchange¶¼ÊÇͬһ¸ö£¨IDºÅΪ¡¾ID-yinwenjie-240-57818-1467030193866-0-3¡¿£©¡£

3-6¡¢ServiceÓëÉúÃüÖÜÆÚ

ÔÚApache CamelÖÐÓÐÒ»¸ö±ÈEndpoint¡¢Component¡¢CamelContextµÈÔªËØ¸ü»ù´¡µÄ¸ÅÄîÔªËØ£ºService¡£Camel¹Ù·½ÎĵµÖжÔServiceµÄ½âÊÍÊÇ£º

Camel uses a simple lifecycle interface called Service which has a single start() and stop() method.

Various classes implement Service such as CamelContext along with a number of Component and Endpoint classes.

When you use Camel you typically have to start the CamelContext which will start all the various components and endpoints and activate the routing rules until the context is stopped again.

......

°üÀ¨Endpoint¡¢Component¡¢CamelContextµÈÔªËØÔÚÄڵĴó¶àÊý¹¤×÷ÔÚCamelÖеÄÔªËØ£¬¶¼ÊÇÒ»¸öÒ»¸öµÄService¡£ÀýÈ磬ÎÒÃÇËäÈ»¶¨ÒåÁËÒ»¸öJettyHttpComponent£¨¾ÍÊÇÔÚ´úÂëÖÐʹÓÃDSL¶¨ÒåµÄ¡±jetty:http://0.0.0.0:8282/directCamel¡°Í·²¿Ëù±íʾµÄComponent£©£¬µ«ÊÇÎÒÃÇÏëÒªÔÚCamelÓ¦ÓóÌÐòÔËÐн׶ÎʹÓÃÕâ¸öComponent£¬¾ÍÐèÒªÀûÓÃstart·½·¨½«Õâ¸öComponentÆô¶¯ÆðÀ´¡£

ʵ¼ÊÉÏͨ¹ýÔĶÁorg.apache.camel.component.jetty.JettyHttpComponentµÄÔ´´úÂ룬¶ÁÕß¿ÉÒÔ·¢ÏÖJettyHttpComponentµÄÆô¶¯¹ý³ÌÆðʼ´ó¶àÊýÇé¿öÏÂʲô¶¼²»»á×ö£¬Ö»ÊÇÔÚorg.apache.camel.support.ServiceSupportÖиü¸ÄÁËJettyHttpComponent¶ÔÏóµÄһЩ״̬ÊôÐÔ¡£µ¹ÊÇHttpConsumerÕâ¸öService£¬ÔÚÆô¶¯µÄ¹ý³ÌÖÐÆô¶¯ÁËJettyHttpComponent¶ÔÏóµÄÁ¬½Ó¼àÌý£¬²¢½¨Á¢ÁËÈô¸É¸öÃûΪ¡¾qtp-*¡¿µÄ´¦ÀíÏ̡߳£ÏÂͼΪ¶ÁÕßչʾÁËorg.apache.camel.Service½Ó¿ÚµÄÖ÷Òª¼Ì³Ð/ʵÏÖÌåϵ£º

ServiceÓÐÇÒÖ»ÓÐÁ½¸ö½Ó¿Ú·½·¨¶¨Ò壺start()ºÍstop()£¬ÕâÁ½¸ö·½·¨µÄº¬ÒåÏÔ¶øÒ×¼û£¬Æô¶¯·þÎñºÍÖÕÖ¹·þÎñ¡£ÁíÍâ¼Ì³Ð×ÔServiceµÄÁíÍâÁ½¸ö×Ó¼¶½Ó¿ÚSuspendableService¡¢ShutdownableService·Ö±ð»¹¶¨ÒåÁËÁíÍ⼸¸ö·½·¨£ºsuspend()¡¢resume()ºÍshutdown()·½·¨£¬·Ö±ðÓÃÀ´ÔÝÍ£·þÎñ¡¢»Ö¸´·þÎñºÍ³¹µ×Í£Ö¹·þÎñ£¨³¹µ×Í£Ö¹·þÎñÒâζ×ÅÔÚCamelÓ¦ÓóÌÐòÔËÐеÄÓÐÉúÖ®Äê²»ÄÜÔÙ´ÎÆô¶¯ÁË£©¡£

CamelÓ¦ÓóÌÐòÖеÄÿһ¸öService¶¼ÊǶÀÁ¢ÔËÐе쬏÷¸öServiceµÄ¹ØÁªÏνÓͨ¹ýCamelContextÉÏÏÂÎĶÔÏóÍê³É¡£Ã¿Ò»¸öServiceͨ¹ýµ÷ÓÃstart()·½·¨±»¼¤»î²¢²ÎÓëµ½CamelÓ¦ÓóÌÐòµÄ¹¤×÷ÖУ¬Ö±µ½ËüµÄstop()·½·¨±»µ÷Óá£Ò²¾ÍÊÇ˵£¬Ã¿¸öService¶¼ÓжÀÁ¢µÄÉúÃüÖÜÆÚ¡££¨http://camel.apache.org/lifecycle.html£©

ÄÇôÎÊÌâÀ´ÁË£¬¼ÈȻÿ¸öService¶¼ÓжÀÁ¢µÄÉúÃüÖÜÆÚ£¬ÎÒÃÇÆô¶¯CamelÓ¦ÓóÌÐòʱ¾ÍÒªÆô¶¯°üÀ¨Route¡¢Endpoint¡¢Component¡¢Producer¡¢Consumer¡¢LifecycleStrategyµÈ¸ÅÄîÔªËØÔÚÄÚµÄÎÞÊý¶à¸öServiceʵÏÖ£¬ÄÇô×÷Ϊ¿ª·¢ÈËÔ±²»¿ÉÄܱàд´úÂëÒ»¸öÒ»¸öµÄServiceÀ´½øÐÐÆô¶¯£¨´ó¶àÊý¿ª·¢ÈËÔ±²»Á˽âCamelµÄÄÚ²¿½á¹¹£¬Ò²¸ù±¾²»ÖªµÀÒªÆô¶¯ÄÄЩService£©¡£ÄÇô×÷ΪCamelÓ¦ÓóÌÐò¿Ï¶¨ÐèÒªÌṩһ¸ö°ì·¨£¬ÔÚÓ¦ÓóÌÐòÆô¶¯Ê±·ÖÎöÓ¦ÓóÌÐòËùÉæ¼°µ½µÄËùÓеÄService£¬²¢Í³Ò»¹ÜÀíÕâЩServiceÆô¶¯ºÍÍ£Ö¹µÄ¶¯×÷¡£Õâ¾ÍÊÇCamelContextËùÉè¼ÆµÄÁíÒ»¸ö¹¦ÄÜ¡£

4¡¢CamelContextÉÏÏÂÎÄ

CamelContext´ÓÓ¢ÎÄ×ÖÃæÉÏÀí½â£¬ÊÇCamel·þÎñÉÏÏÂÎĵÄÒâ˼¡£CamelContextÔÚApache CamelÖеÄÖØÒªÐÔ£¬¾ÍÏñApplicationContextÖ®ÓÚSpring¡¢ServletContextÖ®ÓÚServlet¡­¡­ µ«ÊǰüÀ¨Camel¹Ù·½ÎĵµÔÚÄڵģ¬ËùÓжÁÕßÄܹ»ÔÚ»¥ÁªÍøÉÏÕÒµ½µÄ×ÊÁ϶ÔÓÚCamelContextµÄ½éÉܶ¼Ö»ÓÐÁÄÁÄÊý±Ê¡£

The context component allows you to create new Camel Components from a CamelContext with a number of routes which is then treated as a black box, allowing you to refer to the local endpoints within the component from other CamelContexts.

First you need to create a CamelContext, add some routes in it, start it and then register the CamelContext into the Registry (JNDI, Spring, Guice or OSGi etc).

¡­¡­¡­

ÒÔÉÏÊÇCamel¹Ù·½Îĵµ¶ÔÓÚCamelContext×÷ÓõÄһЩ˵Ã÷£¬´óÖµÄÒâ˼ÊÇ˵CamelContextºá¿çÁËCamel·þÎñµÄÕû¸öÉúÃüÖÜÆÚ£¬²¢ÇÒΪCamel·þÎñµÄ¹¤×÷»·¾³Ìṩ֧³Å¡£

4-1¡¢CamelContextʵÏֽṹ

ÄÇôCamelContextÖе½µ×´æ´¢ÁËÄÄÐ©ÖØÒªµÄÔªËØ£¬ÓÖÊÇÈçºÎ¹¤×÷µÄÄØ£¿¿´Ñù×Ó¹Ù·½µÄʹÓÃÊÖ²áÖв¢Ã»ÓÐ˵Ã÷£¬ÎÒÃÇ»¹ÊÇͨ¹ý·ÖÎöCamelContextµÄÔ´´úÂëÀ´¿´¿´ËüµÄһЩʲôÄÚÈݰɡ£ÏÂÃæÎÒÃÇÓ¦ÓÃÒѾ­½²½â¹ýµÄApache CamelÏà¹ØÖªÊ¶£¬¶Ôorg.apache.camel.CamelContext½Ó¿ÚÒÔ¼°ËüµÄÖ÷ҪʵÏÖÀà½øÐзÖÎö£¬ÒԱ㾡¿ÉÄܵÄÈ¥Àí½âΪʲôCamelContext·Ç³£ÖØÒª£º

ÉÏͼÊÇApache CamelÖÐʵÏÖÁËorg.apache.camel.CamelContext½Ó¿ÚµÄÖ÷ÒªÀà¡£ÆäÖÐÓÐÁ½¸öʵÏÖÀàÐèÒªÌØ±ð˵Ã÷һϣºSpringCamelContextºÍDefaultCamelContext¡£Camel¿ÉÒÔºÍSpring¿ò¼Ü½øÐÐÎ޷켯³É£¬ÀýÈç¿ÉÒÔ½«ÄúµÄij¸öProcessor´¦ÀíÆ÷ÒÔSpring BeanµÄÐÎʽעÈëµ½Spring IocÈÝÆ÷ÖУ¬È»ºóCamel·þÎñ¾Í¿ÉÒÔͨ¹ýÔÚSpring IocÈÝÆ÷Öж¨ÒåµÄbean id£¨XML·½Ê½»òÕß×¢½â·½Ê½¶¼ÐУ©È¡µÃÕâ¸öProcessor´¦ÀíÆ÷µÄʵÀý¡£

ΪÁËʵÏÖÒÔÉÏÃèÊöµÄ¹¦ÄÜ£¬ÐèÒªCamel·þÎñÄܹ»´ÓSpringµÄApplicationContextÈ¡µÃBean£¬¶øSpringCamelContext¿ÉÒÔ°ïÖúCamel·þÎñÍê³ÉÕâ¸ö¹Ø¼ü¶¯×÷£ºÍ¨¹ýSpringCamelContextÖÐÖØÐ´µÄcreateRegistry·½·¨´´½¨Ò»¸öApplicationContextRegistryʵÀý£¬²¢Í¨¹ýºóÕß´ÓApplicationContextµÄ¡°getBean¡±·½·¨ÖлñÈ¡Spring IocÈÝÆ÷ÖзûºÏÖ¸¶¨µÄBean idµÄʵÀý¡£Õâ¾ÍÊÇCamel·þÎñºÍSpring½øÐÐÎ޷켯³ÉµÄÒ»¸ö¹Ø¼üµã£¬ÈçÒÔÏ´úÂëÆ¬¶ÎËùʾ£º

public class SpringCamelContext extends DefaultCamelContext implements InitializingBean, DisposableBean, ApplicationContextAware {
......
@Override
protected Registry createRegistry() {
return new ApplicationContextRegistry(getApplicationContext());
}
......
}

public class ApplicationContextRegistry implements Registry {
......

@Override
public Object lookupByName(String name) {
try {
return applicationContext.getBean(name);
} catch (NoSuchBeanDefinitionException e) {
return null;
}
}
......
}

ÁíÍâÒ»¸öÐèҪ˵Ã÷µÄÊÇDefaultCamelContextÀ࣬Õâ¸öÀàÊÇÎÒÃÇÔÚǰÎÄÉæ¼°µ½CamelʾÀý´úÂëʱʹÓÃ×î¶àµÄCamelContextʵÏÖ¡£¶øÎÒÃǽ«Òª·ÖÎöµÄCamelContext¹¤×÷Ô­ÀíÒ²»ù±¾ÉÏÊÇÔÚÕâ¸öÀàÖнøÐÐÁËÍêÕûµÄʵÏÖ¡ª¡ªÆä×ÓÀàÖ»ÊǸù¾Ý²»Í¬µÄCamelÔËÐл·¾³ÖØÐ´ÁËÆäÖÐijЩ·½·¨£¨ÀýÈç֮ǰÌáµ½µÄcreateRegistry·½·¨£©¡£

4-2¡¢DefaultCamelContext½á¹¹ºÍÆô¶¯¹ý³Ì

Èç¹ûÎÒÃÇ·­ÔÄDefaultCamelContextµÄÔ´´úÂ룬Ê×ÏȾͻᷢÏÖÔÚÆäÖж¨ÒåÁËÐí¶àÈ«¾Ö±äÁ¿£¬ÊýÁ¿ÔÚ70¸ö×óÓÒ£¨Êµ¼ÊÉϸù¾Ý¡¶´úÂë´óÈ«¡·µÄÃèÊö£¬Ò»¸öÀàÖв»Ó¦¸ÃÓÐÕâô¶àÈ«¾Ö±äÁ¿¡£¾¿¾¹Õâ¸öÀàµÄ×÷Õßµ±Ê±ÊÇÔõÑùµÄÏë·¨£¬¾Í²»Çå³þÁË£©¡£ÆäÖÐһЩ±äÁ¿¸ºÔð¼Ç¼CamelContextµÄ״̬ÊôÐÔ¡¢Ò»Ð©¸ºÔðÒýÓø¨Öú¹¤¾ß»¹ÓÐһЩ¼Ç¼¹ØÁªµÄ¶¥²ã¹¤×÷¶ÔÏó£¨ÀýÈçEndpoint¡¢Servcie¡¢Routes¡¢£©ComponentsµÈµÈ£©¡£ºÜÃ÷ÏÔÎÒÃÇÎÞ·¨¶ÔÕâЩ±äÁ¿ÖðÒ»½øÐÐÉîÈë·ÖÎö½²½â£¬µ«ÊǾ­¹ýǰÁ½ÆªÎÄÕµĽéÉÜÖÁÉÙÒÔϱäÁ¿ÐÅÏ¢ÎÒÃÇÊÇÐèÒªÀí½âÆä×÷Óõģº

public class DefaultCamelContext extends ServiceSupport implements ModelCamelContext, SuspendableService {
......

// javaµÄ»ù´¡¸ÅÄÀà¼ÓÔØÆ÷£¬Ò»°ã½øÐÐÏ̲߳Ù×÷ʱ»áÓõ½Ëü
private ClassLoader applicationContextClassLoader;
// ÒѶ¨ÒåµÄendpoint URI£¨ÍêÕûµÄ£©ºÍEndpoint¶ÔÏóµÄÓ³Éä¹ØÏµ
private Map<EndpointKey, Endpoint> endpoints;
// ÒÑʹÓõÄ×é¼þÃû³Æ£¨¼´Endpoint URIÍ·Ëù´ú±íµÄ×é¼þÃû³Æ£©ºÍ×é¼þ¶ÔÏóµÄ¶ÔÓ¦¹ØÏµ
private final Map<String, Component> components = new HashMap<String, Component>();
// Õë¶Ôԭʼ·ÓɱàÅÅËù·ÖÎö³öµÄ·ÓɶÔÏó£¬Â·ÓɶÔÏóÊÇ×÷ΪCamelContext´Ó·ÓÉÖеÄÒ»¸öÔªËØ´«µÝµ½ÏÂÒ»¸öÔªËØµÄÒÀ¾Ý
// ·ÓɶÔÏóÖл¹°üº¬ÁË£¬½«Â·Óɶ¨ÒåÖи÷ÔªËØÁ¬½ÓÆðÀ´µÄÆäËüService¡£ÀýÈçDefaultChannel
private final Set<Route> routes = new LinkedHashSet<Route>();
// ÓÉDSL»òÕßXMLÃèÊöµÄԭʼ·ÓɱàÅÅ¡£Ã¿Ò»¸öRouteDefinitionÔªËØÖж¼°üº¬Á˲ÎÓëÕâ¸ö·ÓɵÄËùÓÐService¶¨Òå¡£
private final List<RouteDefinition> routeDefinitions = new ArrayList<RouteDefinition>();
// ÉúÃüÖÜÆÚ²ßÂÔ£¬Êµ¼ÊÉÏÊÇÒ»×é¼àÌý£¬ÎÄÕºóÃæµÄÄÚÈÝ»áÖØµã½²µ½
private List<LifecycleStrategy> lifecycleStrategies = new CopyOnWriteArrayList<LifecycleStrategy>();
// ÕâÊÇÒ»¸ö¼ÆÊýÆ÷£¬¼Ç¼µ±Ç°Ã¿Ò»¸ö²»Í¬µÄRouteidÖÐÕýÔÚÔËÐеĵÄExchangeÊýÁ¿
private InflightRepository inflightRepository = new DefaultInflightRepository();
// ·þÎñÍ£Ö¹²ßÂÔ
private ShutdownStrategy shutdownStrategy = new DefaultShutdownStrategy(this);
......
}

¿´À´CamelContextÊÇÍ¦ÖØÒªµÄ£¬Ëü»ù±¾½«CamelÓ¦ÓóÌÐòÔËÐÐËùÐèÒªµÄËùÓлù±¾ÐÅÏ¢¶¼¼Ç¼ÔÚ°¸¡£ÁíÍ⣬Apache CamelÖл¹ÓÐÒ»¸öÃû½Ðorg.apache.camel.CamelContextAwareµÄ½Ó¿Ú£¬Ö»ÒªÊµÏָýӿڵľͱØÐëʵÏÖÕâ¸ö½Ó¿Ú¶¨ÒåµÄÁ½¸ö·½·¨£ºsetCamelContextºÍgetCamelContext¡£¶øÊµ¼ÊÉÏÔÚCamelÖеĴó¶àÊýÔªËØ¶¼ÊµÏÖÁËÕâ¸ö½Ó¿Ú£¬ËùÒÔÎÒÃÇÔÚÔĶÁ´úÂëʱ¿ÉÒÔ·¢ÏÖDefaultCamelContextÔÚÒ»±ßÆô¶¯¸÷¸öServiceµÄʱºò£¬Ë³±ã½«×Ô¼ºËùΪ²ÎÊý¸³¸øÁËÕýÔÚÆô¶¯µÄService£¬×îÖÕʵÏÖÁ˸÷¸öServiceÖ®¼äµÄ¹²ÏíÉÏÏÂÎÄÐÅÏ¢µÄЧ¹û£º

// ÕâÊÇCamelContextAware½Ó¿ÚµÄ¶¨Òå
public interface CamelContextAware {
/**
* Injects the {@link CamelContext}
*
* @param camelContext the Camel context
*/
void setCamelContext(CamelContext camelContext);

/**
* Get the {@link CamelContext}
*
* @return camelContext the Camel context
*/
CamelContext getCamelContext();
}

............

// ÕâÊÇDefaultCamelContextµÄdoAddService·½·¨ÖÐ
// ¶ÔʵÏÖÁËCamelContextAware½Ó¿ÚµÄService
// ½øÐÐCamelContextÉèÖõĴúÂë
private void doAddService(Object object, boolean closeOnShutdown) throws Exception {
......
if (object instanceof CamelContextAware) {
CamelContextAware aware = (CamelContextAware) object;
aware.setCamelContext(this);
}
......
}

ΪÁ˺ͱ¾ÎÄ3-6С½ÚµÄÄÚÈÝÏòºôÓ¦£¬ÕâÀïÎÒÃÇ×ÅÖØ·ÖÎöÒ»ÏÂDefaultCamelContextµÄÆô¶¯¹ý³Ì£ºDefaultCamelContextÊÇÈçºÎ°ïÖúÕû¸öCamelÓ¦ÓóÌÐòÖÐÈô¸ÉServiceÍê³ÉÆô¶¯¹ý³ÌµÄ£¿Ê×ÏÈ˵Ã÷DefaultCamelContext Ò²ÊÇÒ»¸öService£¬ËùÒÔËü±ØÐëʵÏÖService½Ó¿ÚµÄstart()·½·¨ºÍstop()·½·¨¡£¶øDefaultCamelContext¶ÔÓÚstart()·½·¨µÄʵÏÖ¾ÍÊÇ¡°Æô¶¯ÆäËüÒÑÖªµÄService¡±¡£

¸ü¾ßÌåµÄÀ´Ëµ£¬DefaultCamelContext½«ËùÓÐÐèÒªÆô¶¯µÄService°´ÕÕËüÃǵÄ×÷ÓÃÀàÐͽøÐÐÇø·Ö£¬ÀýÈ縺Ôð²ßÂÔ¹ÜÀíµÄService¡¢¸ºÔðComponents×é¼þÃèÊöµÄService¡¢¸ºÔð×¢²á¹ÜÀíµÄServiceµÈµÈ£¬È»ºóÔÙ°´ÕÕ˳ÐòÆô¶¯ÕâЩService¡£ÒÔÏ´úÂëÆ¬¶ÎÌáÈ¡×ÔDefaultCamelContextµÄdoStartCamel()˽Óз½·¨£¬²¢¼ÓÈëÁ˱ÊÕßµÄÖÐÎÄ×¢ÊÍ£¨Ô­ÓÐ×÷ÕßµÄ×¢ÊÍÒÀÈ»±£Áô£©£¬Õâ¸ö˽Óз½·¨ÓÉDefaultCamelContextÖеÄstart()·½·¨¼ä½Óµ÷Óã¬ÓÃÓÚÍê³ÉÉÏÊö¸÷ServiceÆô¶¯²Ù×÷¡£

// ΪÁ˵÷ÓøÃ˽Óз½·¨£¬Ö®Ç°µÄ·½·¨Ö´ÐÐÕ»·Ö±ðΪ£º
// start()
// super.start()
// doStart()
......
private void doStartCamel() throws Exception {
// »ñÈ¡classloaderÊÇÓбØÒªµÄ£¬ÕâÑù±£Ö¤ÁËCamel·þÎñÖеÄclassloaderºÍ»·¾³ÖÐµÄÆäËû×é¼þ£¨ÀýÈçspring£©Ò»ÖÂ
if (applicationContextClassLoader == null) {
// Using the TCCL as the default value of ApplicationClassLoader
ClassLoader cl = Thread.currentThread().getContextClassLoader();
if (cl == null) {
// use the classloader that loaded this class
cl = this.getClass().getClassLoader();
}
setApplicationContextClassLoader(cl);
}

......

// Ê×ÏÈÆô¶¯µÄÊÇManagementStrategy²ßÂÔ¹ÜÀíÆ÷£¬ËüµÄĬÈÏʵÏÖÊÇDefaultManagementStrategy¡£
// »¹¼ÇµÃÎÒÃÇÔÚ·ÖÎöDUBBOʱÌáµ½µÄJava spi»úÖÆ°É£¬Camel-CoreҲʹÓÃÁËÕâ¸ö»úÖÆ£¬²¢½øÐÐÁ˶þ´Î·â×°¡£Ïê¼ûorg.apache.camel.spi´úÂë°ü¡£
// Æô¶¯ManagementStrategy£¬¿ÉÒÔ°ïÖúCamelʵÏÖµÚÈý·½×é¼þ°ü£¨ÀýÈçCamel-JMS£©µÄ¶¯Ì¬¼ÓÔØ
// start management strategy before lifecycles are started
ManagementStrategy managementStrategy = getManagementStrategy();
// inject CamelContext if aware
if (managementStrategy instanceof CamelContextAware) {
((CamelContextAware) managementStrategy).setCamelContext(this);
}
ServiceHelper.startService(managementStrategy);

......
// È»ºóÆô¶¯µÄÊÇ ÉúÃüÖÜÆÚ¹ÜÀí²ßÂÔ
// Õâ¸ölifecycleStrategies±äÁ¿ÊÇÒ»¸öLifecycleStrategy·ºÐ͵ÄList¼¯ºÏ¡£
// ʵ¼ÊÉÏLifecycleStrategyÊÇÖ¸ÊÇÒ»×é¼àÌý£¬Ïê¼û´úÂëÆ¬¶ÎºóÐøµÄÃèÊö
ServiceHelper.startServices(lifecycleStrategies);

......
// ½Ó×Å×öһϵÁеÄServiceÆô¶¯¶¯×÷
// Ê×ÏÈÊÇEndpoint×¢²á¹ÜÀí·þÎñ£¬Òª½øÐÐÖØµã½éÉܵÄÊÇorg.apache.camel.util.LRUSoftCache
// ËüʹÓÃÁËjava.lang.ref.SoftReference½øÐÐʵÏÖ£¬ÕâÊÇJavaÌṩµÄ
endpoints = new EndpointRegistry(this, endpoints);
addService(endpoints);

......
// Æô¶¯Ï̳߳عÜÀí²ßÂÔºÍһЩÁÐÆäËü·þÎñ
// »ù±¾ÉÏÕâЩServiceÒѾ­ÔÚÉÏÎÄÖÐÌáµ½¹ý
doAddService(executorServiceManager, false);
addService(producerServicePool);
addService(inflightRepository);
addService(shutdownStrategy);
addService(packageScanClassResolver);
addService(restRegistry);

......
// start components
startServices(components.values());
// Æô¶¯Â·Óɶ¨Ò壬·Óɶ¨ÒåRouteDefinition±¾Éí²¢²»ÊÇService£¬µ«ÊÇÆäÖаüº¬Á˲ÎÓë·Óɵĸ÷ÖÖÔªËØ£¬ÀýÈçEndpoint¡£
// start the route definitions before the routes is started
startRouteDefinitions(routeDefinitions);

......
}
......

ÒÔÉÏ´úÂëÆ¬¶ÎÒѾ­×öÁ˱ȽÏÏêϸµÄ×¢ÊÍ¡£

   
10050 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

ÆóÒµ¼Ü¹¹¡¢TOGAFÓëArchiMate¸ÅÀÀ
¼Ü¹¹Ê¦Ö®Â·-ÈçºÎ×öºÃÒµÎñ½¨Ä££¿
´óÐÍÍøÕ¾µçÉÌÍøÕ¾¼Ü¹¹°¸ÀýºÍ¼¼Êõ¼Ü¹¹µÄʾÀý
ÍêÕûµÄArchimateÊÓµãÖ¸ÄÏ£¨°üÀ¨Ê¾Àý£©
Ïà¹ØÎĵµ

Êý¾ÝÖÐ̨¼¼Êõ¼Ü¹¹·½·¨ÂÛÓëʵ¼ù
ÊÊÓÃArchiMate¡¢EA ºÍ iSpace½øÐÐÆóÒµ¼Ü¹¹½¨Ä£
ZachmanÆóÒµ¼Ü¹¹¿ò¼Ü¼ò½é
ÆóÒµ¼Ü¹¹ÈÃSOAÂ䵨
Ïà¹Ø¿Î³Ì

ÔÆÆ½Ì¨Óë΢·þÎñ¼Ü¹¹Éè¼Æ
ÖÐ̨սÂÔ¡¢ÖÐ̨½¨ÉèÓëÊý×ÖÉÌÒµ
ÒÚ¼¶Óû§¸ß²¢·¢¡¢¸ß¿ÉÓÃϵͳ¼Ü¹¹
¸ß¿ÉÓ÷ֲ¼Ê½¼Ü¹¹Éè¼ÆÓëʵ¼ù