±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚ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);
......
}
...... |
ÒÔÉÏ´úÂëÆ¬¶ÎÒѾ×öÁ˱ȽÏÏêϸµÄ×¢ÊÍ¡£ |