±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚ ËµºÃ²»ÄÜ´òÁ³ ²©¿Í£¬±¾ÎĽéÉÜÁËApache Camel£¬ÎªÁ˸÷λ¶ÁÕß¿ìËÙÁ˽âÕâÖÖ¼¼Êõ×é¼þµÄ»ù±¾Ê¹Óû¹ÓÐÏàÓ¦´úÂëʵÀý¡£ |
|
1¡¢±¾×¨ÌâÖ÷Ö¼
1-1¡¢¹ØÓÚ¼¼Êõ×é¼þ
ÔÚÕâ¸öרÌâÖУ¬ÎÒÃǽéÉÜÁËÏ൱ÊýÁ¿¼¼Êõ×é¼þ£ºFlume¡¢Kafka¡¢ActiveMQ¡¢Rabbitmq¡¢Zookeeper¡¢Thrift ¡¢Netty¡¢DUBBOµÈµÈ£¬»¹°üÀ¨±¾ÎÄÒª½øÐнéÉܵÄApache Camel¡£Óеļ¼Êõ×é¼þ½²µÃ±È½ÏÉîÈ룬Óеļ¼Êõ×é¼þÔòÊǵ㵽Ϊֹ¡£ÓÚÊÇһЩ¶ÁÕßÅóÓÑ·¢À´ÐÅÏ¢ÏòÎÒÌáµ½£¬Õâ¸öרÌâµÄÎÄÕ¸оõ¾ÍÏñÒ»¸ö¼¼ÊõÃû´ÊµÄ´óÔӻ⣬²¢²»Çå³þ×÷ÕßµÄÏëҪͨ¹ýÕâ¸öרÌâ±í´ïʲô˼Ïë¡£
Ìá³öÕâ¸öÖÊÒɵÄÅóÓѲ»ÔÚÉÙÊý£¬ËùÒÔÎÒ¾õµÃÓбØÒª½øÐÐÒ»¸öͳһµÄ˵Ã÷¡£Õâ¸öרÌâµÄÃû×Ö½Ð×ö¡°ÏµÍ³¼äͨѶ¡±£¬ÔÚÕâ¸öרÌâÖÐÎҵĽ²½âÖ÷ÒªÊÇÎ§ÈÆ×Ô¼ºÔÚʵ¼Ê¹¤×÷ÖÐËù×ܽáµÄÀíÂ۽ṹ¡£´Óϵͳ¼äͨѶ×î»ù±¾µÄÍøÂçIOÄ£ÐÍ¡¢ÏûÏ¢¸ñʽ¡¢ÐÒé±ê×¼¿ªÊ¼£¬ÔÙµ½´î½¨ÔÚÆäÉϵÄͨѶ×é¼þ£¬È»ºóÔÙ¹Ø×¢¸üÉϲãµÄ½øÐÐͨѶ¹ý³Ìе÷¡¢Í³Ò»Í¨Ñ¶¹ý³ÌµÄÖмä¼þ¡£Õâ¾ÍÊDZ¾×¨ÌâµÄÖ÷Ö¼¡£ÒªËµµ½±¾×¨ÌâÖбÊÕß½éÉܵÄÿһ¸ö¼¼Êõ×é¼þ£¬Èç¹ûÒª×ö¸üÉîÈëµÄÑо¿¶¼¿ÉÒÔÔÙ¿ªÐµÄרÌ⣬ÐÐÒµÄÚ¸÷×Ô¶¼ÓкܶàµÄÖø×÷½øÐÐרÃŽéÉÜ¡£
ÄÇôΪʲô±¾×¨ÌâÖл¹Òª½éÉÜÕâЩ¼¼Êõ×é¼þÄØ£¿ÎÞ·ÇÓÐÈý¸öÔÒò£ºÆäÒ»£¬ÊÇΪÁË˵Çå³þÀíÂ۽ṹ¶ø·þÎñ¡£½éÉÜJAVA¶ÔBIO¡¢NIOºÍAIOÈýÖÖÍøÂçIOÄ£Ð͵ÄÖ§³Ö£¬ÊÇΪÁËÈöÁÕß¶ÔÕâÈýÖÖÍøÂçÄ£Ð͵Ť×÷¹ý³Ì´Ó¸ÐÐÔ¹ý¶Éµ½ÀíÐÔ£»½éÉÜRMI¡¢ThriftÊÇΪÁËʵÀý»¯±ÊÕß½éÉܵģ¬´î½¨ÔÚÍøÂçIOÄ£ÐÍÉϵÄRPCÐÒé¡£Æä¶þ£¬ÊDZÊÕßÈÏΪһЩ¼¼Êõ×é¼þµÄÉè¼ÆË¼Â·£¬¿ÉÒÔΪ¸÷λ¼Ü¹¹Ê¦ÅóÓÑÔÚʵ¼Ê¹¤×÷ÖÐËù½è¼ø£¬ÀýÈç±ÊÕß¶ÔDUBBOÖÐһЩ¹¦ÄÜÄ£¿éµÄÉè¼Æ½øÐн²½â¡¢¶ÔApache ThriftÖÐÐòÁл¯·½Ê½½øÐÐÏêϸ½²½â¾ÍÊdzöÓÚµÚ¶þ¸öÔÒò¡£ÆäÈý£¬ÊÇÒòΪ±¾×¨ÌâÖÐÉè¼ÆµÄʵսÄÚÈÝÐèÒª¶Ô½«ÒªÓõ½µÄ¼¼Êõ×é¼þÔ¤ÏȽøÐн²½â¡£ÔÚ±¾×¨ÌâÖУ¬ÎÒÃÇ»ùÓÚThrift¡¢Zookeeper×Ô¼ºÉè¼ÆÁËÒ»¸ö·þÎñÖÎÀí¿ò¼Ü£»ÎÒÃÇ»¹»ùÓÚActiveMQ¡¢KafkaºÍFlume²ûÊöÁ˲»Í¬³¡¾°µÄÈÕ־ϵͳÉè¼Æ·½°¸¡£ËùÒÔΪÁËÈøü¶àµÄ¶ÁÕßÄܹ»¿´¶®ÕâЩ¼¼Êõ·½°¸£¬×îºÃµÄ·½Ê½¾ÍÊǽ«ËüÃÇ¿ìËٵĽéÉÜһϡ£
¸ÐлÄÇЩÔÚ±¾×¨ÌâÖÐΪÁ˵㡰ÔÞ¡±µÄÅóÓÑ£¬¸ÐлÄÇЩÔÚÁôÑÔÖÐÏòÎÒÌá³öÐÞ¸ÄÒâ¼û¡¢Ö¸³ö´íÎóµÄÅóÓÑ£¬ÌرðÊÇRMIµÄÄÇÆªÎÄÕ·¸µÄ´íÎó£¬Ì«µÍ¼¶ÁË¡£ÓÐÄãÃǵÄÖ§³Ö£¬ÈÃÎÒ¾õµÃ¸¶³öÊÇÓÐÊÕ»ñµÄ£»ÁíÍ⣬ĿǰÕâ¸öϵÁеÄ35ƬÎÄÕÂÒ»¹²ÊÕµ½ÁË7¸ö¡°²È¡±£¬µã¡°²È¡±µÄÅóÓÑÄÜ·ñÔÚÁôÑÔÖÐΪÎÒÖ¸³öÎÄÕµĴíÎóºÍ²»×㣬°ïÖúÎÒÖØÐÂÕûÀí×Ô¼ºµÄ˼·£¬ÐÞÕý֪ʶµãµÄÎÊÌ⡣лл¡£
1-2¡¢¹ØÓÚ´úÂëʾÀý
±¾×¨ÌâÖбÊÕßÌù³öÁËÕ¼ÎÄÕÂÏ൱ƪ·ùµÄ´úÂëÆ¬¶Î£¬Ìù³öÕâЩ´úÂëÆ¬¶ÎÖ÷ÒªÒ²ÓÐÈýÖÖ¿ÉÄܵÄÇé¿ö¡£ÆäÒ»£¬ÊÇΪÁ˸÷λ¶ÁÕß¿ìËÙÁ˽âijһÖÖ¼¼Êõ×é¼þµÄ»ù±¾Ê¹Óã»Æä¶þ£¬ÊÇΪÁËʵÏÖÎÄÕÂÖÐÃèÊöµÄÉè¼ÆË¼Â·£»ÆäÈý£¬ÊÇΪÁ˽øÐм¼ÊõÑéÖ¤£¬ÀýÈç¡¶¼Ü¹¹Éè¼Æ£ºÏµÍ³¼äͨÐÅ£¨29£©¡ª¡ªKafka¼°³¡¾°Ó¦Óã¨ÖÐ2£©¡·ÎÄÕÂÖÐ4-4-5С½ÚÁгöµÄ´úÂ룬ÊÇΪÁËÑéÖ¤2013Äê2ÔÂ2ÈÕ£¬KafkaµÄÖ÷Òª²ÎÓëÕßNeha Narkhede·¢±íµÄһƪ½²½âKafka Replication¹ý³ÌµÄ¼¼ÊõÎĵµ¡£
ÓеĶÁÕßÏòÎÒÌá³ö£¬ÕâЩ´úÂëÆ¬¶Î¹ýÓÚÈß³¤£¬ÉõÖÁÓйÊÒâ¼Ó³¤ÎÄÕÂÆª·ùµÄÄ¿µÄ¡£Õâ¸öÎÊÌâ¿ÉÄÜÊÇÎÒд×÷¾Ñé²»×㣬¸ø´ó¼ÒÔì³ÉÁËÀ§ÈÅ¡£²»¹ý£¬ÔÚÎÄÕÂÖеÄÌù³öµÄ´úÂëΪÁË´ïµ½ÏàÓ¦µÄÄ¿µÄ£¬¶¼ÅäÓбȽÏÏêϸµÄ×¢ÊÍ˵Ã÷£¬Ò²ÎªÁ˱ÜÃâ¸÷λ¶ÁÕßÔÚÔĶÁ´úÂëʱ´òî§Ë¯^_^¡£ÁíÍ⣬ÎÒ½«ÔÚ¶ÔÕâ¸öרÌâÎÄÕµĵڶþ´ÎÕûÀíʱ£¬»áÈ¥µôÀàËÆÓÚget/setÕâÖÖÐÔÖʵĴúÂëÆ¬¶Î¡ª¡ªËüÃÇȷʵÓС°Õ¼Æª·ù¡±Ö®ÏÓ¡£
1-3¡¢¹ØÓڳϮ
×îºó±ÊÕßÈÏΪ³Ï®ÊÇ×î±°ÁÓµÄÐÐΪ£¬ËùÒÔ±¾×¨ÌâÖеÄÄÚÈݾùÊÇÀ´Ô´ÓÚ±ÊÕß¶Ô¼üÅÌ×ö¹¦£¬Éæ¼°µ½µÄͼÀýÒ²ÊDZÊÕßÒ»¸öÒ»¸ö»³öÀ´µÄ£¬ËùÓÐÒýÓõÄͼƬ¡¢ËµÃ÷¾ù×¢Ã÷³ö´¦¡£±ÊÕß»¶Ó×ªÔØ£¬µ«Î´¾ÊÚȨÇëÎðÓÃÓÚÉÌÒµÓÃ;¡£
2¡¢Apache Camel ¿ìËÙÈëÃÅ
ÄÇôÕâÀïÎÒÃÇΪʲôÓÖÒª»¨Á½ÆªÎÄÕÂµÄÆª·ùÀ´½éÉÜApache CamelÄØ£¿ÒòΪºóÐøÎÄÕÂÖУ¬ÔÚÎÒÃǽøÐÐÒ»¿î¼òµ¥µÄESBÖмä¼þÉè¼ÆÊ±£¬ÎÒÃǽ«»áÒÀ¿¿Apache CamelÌṩµÄÐÒéת»»¡¢ÏûϢ·ÓɵȺËÐÄÄÜÁ¦¡£ÄÇô£¬¾ÍÈÃÎÒÃÇ¿ªÊ¼°É£¡
2-1¡¢Apache Camel½éÉÜ
Apache CamelµÄ¹ÙÍøµØÖ·ÊÇ http://camel.apache.org/£¬ÔÚ±¾ÆªÎÄÕ³ÉÎÄʱ×îеİ汾ÊÇV2.17.1£¬Äú¿ÉÒÔͨ¹ý¶àÖÖÊֶνøÐÐÏÂÔØ¡£Apache CamelµÄ¹ÙÍø²¢Ã»ÓаÑCamel¶¨Òå³ÉÒ»¸öESBÖмä¼þ·þÎñ£¬ÒòΪCamel²¢²»ÊÇ·þÎñ£º
Camel empowers you to define routing and mediation rules in a variety of domain-specific languages, including a Java-based Fluent API, Spring or Blueprint XML Configuration files, and a Scala DSL. This means you get smart completion of routing rules in your IDE, whether in a Java, Scala or XML editor.
Apache Camel uses URIs to work directly with any kind of Transport or messaging model such as HTTP, ActiveMQ, JMS, JBI, SCA, MINA or CXF, as well as pluggable Components and Data Format options. Apache Camel is a small library with minimal dependencies for easy embedding in any Java application. Apache Camel lets you work with the same API regardless which kind of Transport is used - so learn the API once and you can interact with all the Components provided out-of-box.
Apache Camel provides support for Bean Binding and seamless integration with popular frameworks such as CDI, Spring, Blueprint and Guice. Camel also has extensive support for unit testing your routes.
ÒÔÉÏÒýÓÃÊÇApache Camel¹Ù·½¶ÔËüµÄ¶¨Òå¡£domain-specific languagesÖ¸´úµÄÊÇDSL£¨ÁìÓòÌØ¶¨ÓïÑÔ£©£¬Ê×ÏÈApache CamelÖ§³ÖDSL£¬Õâ¸öÎÊÌâÒѾÔÚÉÏһƪÎÄÕÂÖÐ˵Ã÷¹ýÁË¡£Apache CamelÖ§³ÖʹÓÃJAVAÓïÑÔºÍScalaÓïÑÔ½øÐÐDSL¹æÔòÃèÊö£¬Ò²Ö§³ÖʹÓÃXMLÎļþ½øÐеĹæÔòÃèÊö¡£ÕâÀïÌáһϣ¬JBOSSÌṩÁËÒ»Ì×¹¤¾ß¡°Tools for Apache Camel¡±¿ÉÒÔͼÐλ¯Apache CamelµÄ¹æÔò±àÅŹý³Ì¡£
Apache CamelÔÚ±àÅÅģʽÖÐÒÀÍÐURIÃèÊö¹æÔò£¬ÊµÏÖÁË´«ÊäÐÒéºÍÏûÏ¢¸ñʽµÄת»»£ºHTTP, ActiveMQ, JMS, JBI, SCA, MINA or CXFµÈµÈ¡£Camel»¹¿ÉÒÔǶÈëµ½ÈκÎjavaÓ¦ÓóÌÐòÖУº¿´µ½Á˰ɣ¬Apache Camel²»ÊÇESBÖмä¼þ·þÎñ£¬ËüÐèÒªÒÀÀµÓÚÏàÓ¦µÄ¶þ´Î¿ª·¢²ÅÄܱ»µ±³ÉESB·þÎñµÄºËÐIJ¿·Ö½øÐÐʹÓá£
2-2¡¢¿ìËÙʹÓÃʾÀý
˵ÁËÄÇô¶à£¬ÄÇôÎÒÃÇÀ´¿´¿´Apache Camel×î¼òµ¥µÄʹÓ÷½Ê½°É£º
package com.yinwenjie.test.cameltest.helloworld;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import org.apache.camel.Exchange;
import org.apache.camel.ExchangePattern;
import org.apache.camel.Message;
import org.apache.camel.Processor;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.http.HttpMessage;
import org.apache.camel.impl.DefaultCamelContext;
import org.apache.camel.model.ModelCamelContext;
/**
* Ö£ÖØÆäʵÄдÏ helloworld for Apache Camel
* @author yinwenjie
*/
public class HelloWorld extends RouteBuilder {
public static void main(String[] args) throws Exception {
// ÕâÊÇcamelÉÏÏÂÎĶÔÏó£¬Õû¸ö·ÓɵÄÇý¶¯È«¿¿ËüÁË¡£
ModelCamelContext camelContext = new DefaultCamelContext();
// Æô¶¯route
camelContext.start();
// ½«ÎÒÃDZàÅŵÄÒ»¸öÍêÕûÏûϢ·Óɹý³Ì£¬¼ÓÈëµ½ÉÏÏÂÎÄÖÐ
camelContext.addRoutes(new HelloWorld());
/*
* ==========================
* ΪʲôÎÒÃÇÏÈÆô¶¯Ò»¸öCamel·þÎñ
* ÔÙʹÓÃaddRoutesÌí¼Ó±àÅźõÄ·ÓÉÄØ£¿
* ÕâÊÇΪÁ˸æË߸÷λ¶ÁÕߣ¬Apache CamelÖ§³Ö¶¯Ì¬¼ÓÔØ/Ð¶ÔØ±àÅŵÄ·ÓÉ
* ÕâºÜÖØÒª£¬ÒòΪºóÐøÉè¼ÆµÄBrokerÐèÒªÒÀÀµÕâÖÖÄÜÁ¦
* ==========================
* */
// ͨÓÃûÓоßÌåÒµÎñÒâÒåµÄ´úÂ룬ֻÊÇΪÁ˱£Ö¤Ö÷Ï̲߳»Í˳ö
synchronized (HelloWorld.class) {
HelloWorld.class.wait();
}
}
@Override
public void configure() throws Exception {
// ÔÚ±¾´úÂë¶ÎÖ®ÏÂËæºóµÄ˵Ã÷ÖУ¬»áÏêϸ˵Ã÷Õâ¸ö¹¹ÔìµÄº¬Òå
from("jetty:http://0.0.0.0:8282/doHelloWorld")
.process(new HttpProcessor())
.to("log:helloworld?showExchangeId=true");
}
/**
* Õâ¸ö´¦ÀíÆ÷ÓÃÀ´Íê³ÉÊäÈëµÄjson¸ñʽµÄת»»
* @author yinwenjie
*/
public class HttpProcessor implements Processor {
/* (non-Javadoc)
* @see org.apache.camel.Processor#process(org.apache.camel.Exchange)
*/
@Override
public void process(Exchange exchange) throws Exception {
// ÒòΪºÜÃ÷È·ÏûÏ¢¸ñʽÊÇhttpµÄ£¬ËùÒÔ²ÅʹÓÃÕâ¸öÀà
// ·ñÔò»¹Êǽ¨ÒéʹÓÃorg.apache.camel.MessageÕâ¸ö³éÏó½Ó¿Ú
HttpMessage message = (HttpMessage)exchange.getIn();
InputStream bodyStream = (InputStream)message.getBody();
String inputContext = this.analysisMessage(bodyStream);
bodyStream.close();
// ´æÈëµ½exchangeµÄoutÇøÓò
if(exchange.getPattern() == ExchangePattern.InOut) {
Message outMessage = exchange.getOut();
outMessage.setBody(inputContext + " || out");
}
}
/**
* ´ÓstreamÖзÖÎö×Ö·û´®ÄÚÈÝ
* @param bodyStream
* @return
*/
private String analysisMessage(InputStream bodyStream) throws IOException {
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
byte[] contextBytes = new byte[4096];
int realLen;
while((realLen = bodyStream.read(contextBytes , 0 ,4096)) != -1) {
outStream.write(contextBytes, 0, realLen);
}
// ·µ»Ø´ÓStreamÖжÁÈ¡µÄ×Ö´®
try {
return new String(outStream.toByteArray() , "UTF-8");
} finally {
outStream.close();
}
}
}
} |
ÒÔÉÏ´úÂë¿ÉÒÔÖ±½ÓÄÃÀ´Ê¹Óã¬ËüչʾÁËÒ»¸ö¼òµ¥µÄ¿ÉÒÔʵ¼ÊÔËÐеÄÏûϢ·ÓɹæÔò£ºÊ×ÏÈfromÓï¾äÖÐÌîдµÄ¡° jetty:http://0.0.0.0:8282/doHelloWorld ¡±±íʾÕâ¸ö±àÅźõÄ·ÓɵÄÏûÏ¢Èë¿Ú£ºÊ¹ÓÃhttp´«ÊäÐÒ飬·ÃÎʱ¾ÎïÀí½ÚµãÉÏÈκÎIP£¨ÀýÈç127.0.0.1»òÕß192.168.1.1£©£¬ÔÚ¶Ë¿Ú8282ÉϵÄÇëÇ󣬶¼¿ÉÒÔ½«HTTPЯ´øµÄÏûÏ¢´«ÈëÕâ¸ö·ÓÉ¡£
½ÓÏÂÀ´ÏûÏ¢»áÔÚHttpProcessorÕâ¸ö×Ô¶¨ÒåµÄ´¦ÀíÆ÷Öб»½øÐÐת»»¡£ÎªÁËÈø÷λ¶ÁÕß¿´Çå³þÔÀí£¬HttpProcessor ÖеÄÏûϢת»»ºÜ¼òµ¥£ºÔÚHTTP´«ÈëµÄjson×Ö·û´®µÄĩ⣬¼ÓÉÏÒ»¸ö¡± || out¡±²¢½øÐÐ×Ö·û´®Êä³ö¡£Apache CamelÖÐ×Ô´øÁ˺ܶദÀíÆ÷£¬²¢ÇÒ¿ÉÒÔ×ÔÐÐʵÏÖProcessor½Ó¿ÚÀ´ÊµÏÖ×Ô¼ºµÄ´¦ÀíÂß¼¡£
×îºó£¬ÏûÏ¢±»´«Êäµ½×îºóÒ»¸öendPoint¿ØÖƶ˵㣬Õâ¸öendPoint¿ØÖƶ˵ãµÄURIÃèÊö£¨log:helloworld?showExchangeId=true£©±íÃ÷ËüÊÇÒ»¸öLog4jµÄʵÏÖ£¬ËùÒÔÏûÏ¢×îÖÕ»áÒÔLogÈÕÖ¾µÄ·½Ê½Êä³öµ½¿ØÖÆÌ¨ÉÏ¡£µ½´Ë£¬Õû¸ö±àÅŵÄ·ÓɾÍÖ´ÐÐÍê³ÉÁË¡£
2-3¡¢EIP
Camel supports most of the Enterprise Integration Patterns from the excellent book by Gregor Hohpe and Bobby Woolf.
EIPµÄ¸ÅÄîÔÚ֮ǰµÄÎÄÕÂÖÐÒѾ½øÐÐÁ˽éÉÜ£¬ËüÀ´Ô´ÓÚGregor Hohpe ºÍBobby WoolfºÏÖøµÄÒ»±¾Êé¡¶Enterprise Integration Patterns¡·¡£ÔÚÊéÖÐGregor Hohpe ºÍBobby Woolf²ûÊöÁËÈçºÎ¶ÔÆóÒµÄڵĸ÷¸öÒµÎñϵͳ¼¯³É½øÐÐÉè¼Æ£¬°üÀ¨£ºÈçºÎ½øÐзÓÉÉè¼Æ¡¢ÈçºÎ½øÐÐÏûÏ¢´«µÝµÈµÈ¡£Apache CamelµÄÉè¼Æ·½°¸¾ÍÔ´ÓÚÕâ±¾ÊéÖÐÌá³öµÄ½â¾ö˼·£¬ÏÂÃæÎÒÃǾͶÔCamelÖеÄÖØµãÒªËØ½øÐн²½â¡£
3¡¢CamelÒªËØ
3-1¡¢Endpoint ¿ØÖƶ˵ã
Apache CamelÖйØÓÚEndpoint×îÖ±°×µÄ½âÊ;ÍÊÇ£¬Camel×÷Ϊϵͳ¼¯³ÉµÄ»ù´¡·þÎñ×é¼þ£¬ÔÚÒѾ±àÅźõÄ·ÓɹæÔòÖУ¬ºÍÆäËüϵͳ½øÐÐͨÐŵÄÉ趨µã¡£Õâ¸ö¡°ÆäËüϵͳ¡±£¬¿ÉÒÔÊÇ´æÔÚÓÚ±¾µØ»òÕßÔ¶³ÌµÄÎļþϵͳ£¬¿ÉÒÔÊǽøÐÐÒµÎñ´¦ÀíµÄ¶©µ¥ÏµÍ³£¬¿ÉÒÔÊÇÏûÏ¢¶ÓÁзþÎñ£¬¿ÉÒÔÊÇÌṩÁË·ÃÎʵØÖ·¡¢·ÃÎÊip¡¢·ÃÎÊ·¾¶µÄÈκηþÎñ¡£Apache CamelÀûÓÃ×ÔÉíÌṩµÄ¹ã·ºµÄͨÐÅÐÒéÖ§³Ö£¬Ê¹ÕâÀïµÄ¡°Í¨ÐÅ¡±¶¯×÷¿ÉÒÔ²ÉÓôó¶àÊýÒÑÖªµÄÐÒ飬ÀýÈç¸÷ÖÖRPCÐÒé¡¢JMSÐÒé¡¢FTPÐÒé¡¢HTTPÐÒé¡£¡£¡£
CamelÖеÄEndpoint¿ØÖƶ˵ãʹÓÃURIµÄ·½Ê½ÃèÊö¶ÔÄ¿±êϵͳµÄͨÐÅ¡£ÀýÈçÒÔÏÂURIÃèÊöÁ˶ÔÍⲿMQ·þÎñµÄͨÐÅ£¬ÏûÏ¢¸ñʽÊÇStomp£º
// ÒÔÏ´úÂë±íʾ´ÓÃûΪtestµÄMQ¶ÓÁÐÖнÓÊÕÏûÏ¢£¬ÏûÏ¢¸ñʽΪstomp
// Óû§ÃûΪusername£¬¼àÌý±¾µØ¶Ë¿Ú61613
from("stomp:queue:test?tcp://localhost:61613&login=username")
// ÒÔÏ´úÂë±íʾ½«ÏûÏ¢·¢Ë͵½ÃûΪtestµÄMQ¶ÓÁÐÖУ¬ÏûÏ¢¸ñʽΪstomp
to("stomp:queue:test?tcp://localhost:61613&login=username"); |
¸ü¶àµÄstomp¿ØÖƶ˵ãµÄ˵Ã÷¿É²Î¼ûCamelÖеÄ˵Ã÷£ºhttp://camel.apache.org/stomp.html ¡£ÔÙÀýÈ磬ÎÒÃÇ¿ÉÒÔʹÓÃHttpÐÒéºÍijһ¸öÍⲿϵͳ½øÐÐͨÐÅ£¬¸ü¶à¹ØÓÚHttp¿ØÖƶ˵ãµÄ˵Ã÷Ò²¿É²Î¼ûCamelÖеÄ˵Ã÷£º http://camel.apache.org/http.html £º
// Ö÷¶¯Ïòhttp URIÃèÊöµÄ·¾¶·¢³öÇëÇó£¨httpµÄURI±ÊÕß²»ÐèÒªÔÙ½éÉÜÁ˰ɣ©
from("http://localhost:8080/dbk.manager.web/queryOrgDetailById")
// ½«ÉÏÒ»¸ö·ÓÉÔªËØÉÏMessage OutÖÐÏûÏ¢×÷ΪÇëÇóÄÚÈÝ£¬
// Ïòhttp URIÃèÊöµÄ·¾¶·¢³öÇëÇó
// ×¢Ò⣬Message OutÖеÄBodyÄÚÈݽ«×÷ΪÊý¾ÝÁ÷Ó³Éäµ½Http Request BodyÖÐ
to("http://localhost:8080/dbk.manager.web/queryOrgDetailById") |
ÒÔÉϵÄʾÀýÖУ¬Çë×¢Òâ¡°from¡±²¿·ÖµÄ˵Ã÷¡£Ëü²¢²»Êǵȴýij¸öHttpÇëÇóÆ¥ÅäÃèÊöµÄURI·¢Ë͵½Â·ÓÉ·¾¶ÉÏ£¬¶øÊÇÖ÷¶¯Ïòhttp URIÃèÊöµÄ·¾¶·¢ËÍÇëÇó¡£Èç¹ûÏëÒª´ïµ½Ç°ÕßµÄЧ¹û£¬ÇëʹÓÃJetty/Servlet¿ªÍ·µÄÏà¹ØÍ¨ÐÅ·½Ê½£ºhttp://camel.apache.org/servlet.html ºÍ http://camel.apache.org/jetty.html¡£¶øÍ¨¹ýApache Camel¹ÙÍøÖÐ http://camel.apache.org/uris.html ·¾¶¿ÉÒԲ鿴´ó²¿·ÖCamelͨ¹ýURI¸ñʽËùÖ§³ÖµÄEndpoint¡£
Camel makes extensive use of URIs to allow you to refer to endpoints which are lazily created by a Component if you refer to them within Routes. |
ÒÔÉÏÒýÓÃÊÇApache Camel¹Ù·½ÎĵµÖУ¬¹ØÓÚendpointºÍURIÖ®¼ä¹ØÏµµÄÃèÊö¡£´ÓÕâ¶Î¹Ù·½ÃèÊö¿ÉÒÔ¿´³ö£¬²»Í¬µÄendpoint¶¼ÊÇͨ¹ýURI¸ñʽ½øÐÐÃèÊöµÄ£¬²¢ÇÒͨ¹ýCamelÖеÄorg.apache.camel.Component£¨endpoint¹¹½¨Æ÷£©½Ó¿ÚµÄÏìӦʵÏÖ½øÐÐendpointʵÀýµÄ´´½¨¡£ÐèҪעÒâµÄÊÇ£¬Camelͨ¹ýplug·½Ê½Ìṩ¶ÔijÖÖÐÒéµÄendpointÖ§³Ö£¬ËùÒÔÈç¹û¶ÁÕßÐèҪʹÓÃijÖÖCamelµÄendpoint£¬¾Í±ØÐëÈ·¶¨×Ô¼ºÒѾÔÚ¹¤³ÌÖÐÒýÈëÁËÏàÓ¦µÄplug¡£ÀýÈ磬Èç¹ûҪʹÓÃCamel¶ÔNetty4-EndpointµÄÖ§³Ö£¬¾ÍÐèÒªÔÚ¹¤³ÌÖÐÒýÈëCamel¶ÔNetty4µÄÖ§³Ö£¬ÈçÏ£º
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-netty4</artifactId>
<version>x.x.x</version>
</dependency> |
ÔÚÕâ¸öcamel-plugÒýÓÃÖУ¬¾Í°üº¬ÁËNetty4¶ÔEndpointµÄʵÏÖºÍNetty4¶ÔComponentµÄʵÏÖ£ºorg.apache.camel.component.netty4.NettyEndpoint¡¢org.apache.camel.component.netty4.NettyComponent¡£
3-2¡¢ExchangeºÍMessageÏûÏ¢¸ñʽ
ÏûÏ¢ÔÚÎÒÃÇÒѾ±àÅźõÄÒµÎñ·¾¶ÉϽøÐд«µÝ£¬Í¨¹ýÎÒÃÇ×Ô¶¨ÒåµÄÏûϢת»»·½Ê½»òÕßApache CamelÌṩµÄÏûϢת»»·½Ê½½øÐÐÏûÏ¢¸ñʽת»»¡£ÄÇôΪÁËÍê³ÉÕâЩÏûÏ¢´«µÝ¡¢ÏûϢת»»¹ý³ÌCamelÖеÄÏûÏ¢±ØÐëʹÓÃͳһµÄÏûÏ¢ÃèÊö¸ñʽ£¬²¢ÇÒ±£Ö¤Â·¾¶ÉϵĿØÖƶ˵㶼ÄÜ´æÈ¡ÏûÏ¢¡£
CamelÌṩµÄExchangeÒªËØ°ïÖú¿ª·¢ÈËÔ±ÔÚ¿ØÖƶ˵㵽´¦ÀíÆ÷¡¢´¦ÀíÆ÷µ½´¦ÀíÆ÷µÄ·Óɹý³ÌÖÐÍê³ÉÏûÏ¢µÄͳһÃèÊö¡£Ò»¸öExchangeÔªËØµÄ½á¹¹ÈçÏÂͼËùʾ£º

3-2-1¡¢ExchangeÖеĻù±¾ÊôÐÔ
Ò»¸öExchange¹á´©×ÅÕû¸ö±àÅŵÄ·ÓɹæÔò£¬ExchangeID¾ÍÊÇËüµÄΨһ±àºÅÐÅÏ¢£¬Í¬Ò»¸ö·ÓɹæÔòµÄ²»Í¬ÊµÀý£¨¶Ô·ÓɹæÔò·Ö±ð¶ÀÁ¢µÄÁ½´ÎÖ´ÐУ©£¬ExchangeID²»Ïàͬ¡£
±íʾexchangeʵÀý³õʼÀ´Ô´µÄEndpoint¿ØÖƶ˵㣨ÀàµÄʵÀý£©£¬Ò»°ãÀ´Ëµ¾ÍÊÇ¿ª·¢ÈËÔ±ÉèÖ÷ÓÉʱÓÉ¡°from¡±¹Ø¼ü×ÖËù±í´ïµÄEndpoint¡£ÀýÈç±¾ÎÄ2-2С½ÚÖеĴúÂëʾÀý£¬from¹Ø¼ü×ÖÌîдµÄURIÐÅÏ¢¾ÍÊÇ¡° jetty: http://0.0.0.0:8282/doHelloWorld ¡±£¬¶øÊµÏÖJettyÐÒéÍ·Ö§³ÖµÄorg.apache.camel.Endpoint½Ó¿ÚʵÏÖÀà¾ÍÊÇorg.apache.camel.component.jetty.JettyHttpEndpoint¡£ËùÒÔÔÚ2-2С½ÚÖУ¬Exchange¶ÔÏóÖеÄfromEndpointÊôÐÔ¾ÍÊÇJettyHttpEndpointÀàµÄÒ»¸öʵÀý»¯¶ÔÏó¡£
Exchange¶ÔÏó¹á´©Õû¸ö·ÓÉÖ´Ðйý³ÌÖеĿØÖƶ˵㡢´¦ÀíÆ÷ÉõÖÁ»¹Óбí´ïʽ¡¢Â·ÓÉÌõ¼þÅжϡ£ÎªÁËÈÃÕâÐ©ÔªËØÄܹ»¹²ÏíһЩ¿ª·¢ÈËÔ±×Ô¶¨ÒåµÄ²ÎÊýÅäÖÃÐÅÏ¢£¬ExchangeÒÔK-V½á¹¹ÌṩÁËÕâÑùµÄ²ÎÊýÅäÖÃÐÅÏ¢´æ´¢·½Ê½¡£ÔÚorg.apache.camel.impl.DefaultExchangeÀàÖУ¬¶ÔÓ¦propertiesµÄʵÏÖ´úÂëÈçÏÂËùʾ£º
......
public Map<String, Object> getProperties() {
if (properties == null) {
properties = new ConcurrentHashMap<String, Object>();
}
return properties;
}
...... |
ExchangeÖеÄpatternÊôÐԷdz£ÖØÒª£¬ËüµÄÈ«³ÆÊÇ£ºExchangePattern£¨½»»»Æ÷¹¤×÷ģʽ£©¡£ÆäʵÏÖÊÇÒ»¸öö¾ÙÀàÐÍ£ºorg.apache.camel.ExchangePattern¡£¿ÉÒÔʹÓõÄÖµ°üÀ¨£ºInOnly, RobustInOnly, InOut, InOptionalOut, OutOnly, RobustOutOnly, OutIn, OutOptionalIn¡£´ÓCamel¹Ù·½Òѹ«²¼µÄÎĵµÀ´¿´£¬Õâ¸öÊôÐÔÃèÊöÁËExchangeÖÐÏûÏ¢µÄ´«²¥·½Ê½¡£
ÀýÈçEvent MessageÀàÐ͵ÄÏûÏ¢£¬ÆäExchangePatternĬÈÏÉèÖÃΪInOnly¡£Request/Reply MessageÀàÐ͵ÄÏûÏ¢£¬ÆäExchangePatternÉèÖÃΪInOut¡£µ«ÊDZÊÕßͨ¹ý´úÂëÅŲ飬·¢ÏÖ²¢²»ÊÇExchangePattern¶¼±»Camel-CoreºËÐÄʵÏÖ²¿·ÖËùʹÓ㨲¢²»ÄÜ˵Ã÷ûÓб»ÖîÈç Camel-CXFÕâЩpluinËùʹÓã©£¬¶øÇÒCamelµÄ¹Ù·½Îĵµ¶ÔÓÚËüÃǵĽéÉÜÒ²Ö»ÓÐÁÈÁÈÊý±Ê£¨http://camel.apache.org/exchange-pattern.html£©¡£ÀýÈçRobustOutOnly¡¢OutOptionalIn¡¢OutOnlyÕâЩö¾ÙÖµ¾ÍûÓÐÔÚCamel-CoreʵÏÖ²¿·Ö·¢ÏÖÒýÓá£
Èç¹ûÔÚ´¦ÀíÆ÷ProcessorµÄ´¦Àí¹ý³ÌÖУ¬¿ª·¢ÈËÔ±ÐèÒªÅ׳öÒì³£²¢ÖÕÖ¹Õû¸öÏûϢ·ÓɵÄÖ´Ðйý³Ì£¬¿ÉÒÔͨ¹ýÉèÖÃExchangeÖеÄexceptionÊôÐÔÀ´ÊµÏÖ¡£
3-2-2¡¢ExchangeÖеÄMessage
ExchangeÖл¹ÓÐÁ½¸öÖØÒªÊôÐÔinMessageºÍoutMessage¡£ÕâÁ½¸öÊôÐÔ·Ö±ð´ú±íExchangeÔÚij¸ö´¦ÀíÔªËØ£¨´¦ÀíÆ÷¡¢±í´ïʽµÈ£©ÉϵÄÊäÈëÏûÏ¢ºÍÊä³öÏûÏ¢¡£
µ±¿ØÖƶ˵ãºÍ´¦ÀíÆ÷¡¢´¦ÀíÆ÷ºÍ´¦ÀíÆ÷¼äµÄMessageÔÚExchangeÖд«µÝʱ£¨ËäÈ»ExchangePatternö¾ÙÖдæÔÚisInCapable()¡¢isInCapable()ÕâÑùµÄÅжϷ½·¨£¬µ«ÊÇͨ¹ý´úÂëÅŲ飬±ÊÕß²¢Ã»Óз¢ÏÖÔÚcamel-coreÖÐÓйØÓÚÕâЩ·½·¨µÄÈκÎʹÓã©£¬Exchange»á×Ô¶¯½«ÉÏÒ»¸öÔªËØµÄÊä³öÖµ×÷Ϊ×÷ΪÕâ¸öÔªËØµÄÊäÈëÖµ½øÐÐʹÓᣵ«ÊÇÈç¹ûÔÚÉÏÒ»¸ö´¦ÀíÆ÷ÖУ¬¿ª·¢ÈËԱûÓÐÔÚExchangeÖÐÉèÖÃÈκÎout messageÄÚÈÝ£¨¼´ExcahngeÖÐoutÊôÐÔΪnull£©£¬ÄÇôÉÏÒ»¸ö´¦ÀíÆ÷ÖеÄin messageÄÚÈݽ«×÷ΪÕâ¸ö´¦ÀíÆ÷µÄin messageÄÚÈÝ¡£
ÕâÀïÐèҪעÒâÒ»¸öÎÊÌ⣬ÔÚDefaultExchangeÀàÖйØÓÚgetOut()·½·¨µÄʵÏÖ£¬ÓÐÕâÑùµÄ´úÂëÆ¬¶Î£º
......
public Message getOut() {
// lazy create
if (out == null) {
out = (in != null && in instanceof MessageSupport)
? ((MessageSupport)in).newInstance() : new DefaultMessage();
configureMessage(out);
}
return out;
}
...... |
ËùÒÔ£¬ÔÚ´¦ÀíÆ÷ÖжÔout messageÊôÐԵĸ³Öµ£¬²¢²»ÐèÒª¿ª·¢ÈËÔ±Ã÷È·µÄ¡°new¡±Ò»¸öMessage¶ÔÏó¡£Ö»ÐèÒªµ÷ÓÃgetOut()·½·¨£¬¾Í¿ÉÒÔÍê³Éout messageÊôÐÔ¸³Öµ¡£ÒÔÏ·ÓÉ´úÂëÆ¬¶ÎÔÚfromEndpointºó£¬Á¬Ðø½øÈëÁ½¸öProcessor´¦ÀíÆ÷£¬ÇÒExchangeµÄExchangePatternΪInOut¡£ÎÒÃÇÀ´¹Û²ì´ÓµÚÒ»¸ö´¦Àí´¦ÀíÍêºó£¬µ½µÚ¶þ¸ö´¦ÀíÊÕµ½ÏûϢʱExchange¶ÔÏóÖеĸ÷¸öÊôÐÔ²úÉúµÄ±ä»¯£º
......
from("jetty:http://0.0.0.0:8282/doHelloWorld")
.process(new HttpProcessor())
.process(new OtherProcessor())
...... |
- µÚÒ»¸öHttpProcessorÖ´ÐÐĩβʱ£¬ExchangeÖеÄÊôÐÔ

ÉÏͼÏÔʾÁ˵±Ç°ÄÚ´æÇøÓòÖУ¬Exchange¶ÔÏóµÄidΪ452£¬fromEndpointÊôÐÔÊÇÒ»¸öJettyHttpEndpointµÄʵÀý£¬¶ÔÏóidΪ479¡£×¢ÒâÁ½¸öÖØÒªµÄinMessageºÍoutMessage£¬ËüÃÇ·Ö±ðÊÇHttpMessageµÄʵÀý£¨¶ÔÏóid467£©ºÍDefaultMessageµÄʵÀý£¨¶ÔÏóid476£©£¬ÕâÀï˵Ã÷Ò»ÏÂÎÞÂÛÊÇHttpMessage»¹ÊÇDefaultMessage£¬ËüÃǶ¼ÊÇorg.apache.camel.Message½Ó¿ÚµÄʵÏÖ¡£
outMessageÖеÄbody²¿·Ö´æ´¢ÁËÒ»¸ö×Ö·û´®ÐÅÏ¢£¬ÎÒÃÇËæºóÑéÖ¤Ò»ÏÂÐÅÏ¢ÔÚÏÂÒ»¸öOtherProcessor´¦ÀíÆ÷ÖеļǼ·½Ê½¡£
- µÚ¶þ¸öOtherProcessor¿ªÊ¼Ö´ÐÐʱ£¬ExchangeÖеÄÊôÐÔ

¿ÉÒÔ¿´µ½HttpProcessor´¦ÀíÆ÷ÖÐoutMessageµÄMessage¶ÔÏó×÷ΪÁËÕâ¸öOtherProcessor´¦ÀíÆ÷µÄinMessageÊôÐÔ£¬¶ÔÏóµÄid±àºÅ¶¼ÊÇ476£¬ËµÃ÷ËûÃÇʹÓõÄÄÚ´æÇøÓò¶¼ÊÇÏàͬµÄ£¬ÊÇͬһ¸ö¶ÔÏó¡£Excahnge¶ÔÏóµÄÆäËüÐÅÏ¢Ò²´ÓHttpProcessor´¦ÀíÆ÷Ô·â²»¶¯µÄ´«µÝµ½ÁËOtherProcessor´¦ÀíÆ÷¡£
ÿһ¸öMessage£¨ÎÞÂÛÊÇinMessage»¹ÊÇoutMessage£©¶ÔÏóÖ÷Òª°üÀ¨ËĸöÊôÐÔ£ºMessageID¡¢Header¡¢BodyºÍAttachment¡£
ÔÚϵͳ¿ª·¢½×¶Î£¬Ìṩ¸ø¿ª·¢ÈËԱʹÓõıêʾÏûÏ¢¶ÔÏóΨһÐÔµÄÊôÐÔ£¬Õâ¸öÊôÐÔ¿ÉÒÔûÓÐÖµ¡£
ÏûÏ¢½á¹¹Öеġ°Í·²¿¡±ÐÅÏ¢£¬ÔÚÕâ¸öÊôÐÔÖеÄÐÅÏ¢²ÉÓÃK-VµÄ·½Ê½½øÐд洢£¬²¢¿ÉÒÔËæ×ÅMessage¶ÔÏóµÄ´«µÝ½«ÐÅÏ¢´øµ½ÏÂÒ»¸ö²ÎÓë·ÓɵÄÔªËØÖС£
Ö÷ҪעÒâµÄÊÇÔÚorg.apache.camel.impl.DefaultMessageÖжÔheadersÊôÐÔµÄʵÏÖÊÇÒ»¸öÃû½Ðorg.apache.camel.util.CaseInsensitiveMapµÄÀà¡£¿´Õâ¸öÀàµÄÃû×Ö¾ÍÖªµÀ£ºheadersÊôÐÔµÄÌØµãÊǺöÂÔ´óСд¡£Ò²¾ÍÊÇ˵£º
......
outMessage.setHeader("testHeader", "headerValue");
outMessage.setHeader("TESTHEADER", "headerValue");
outMessage.setHeader("testheader", "HEADERVALUE");
...... |
ÒÔÉÏ´úÂëÆ¬¶ÎÉèÖúó£¬MessageÖеÄHeadersÊôÐÔÖÐÖ»ÓÐÒ»¸öK-V¼üÖµ¶ÔÐÅÏ¢£¬ÇÒÒÔ×îºóÒ»´ÎÉèÖõÄtestheaderΪ׼¡£
MessageµÄÒµÎñÏûÏ¢ÄÚÈÝ´æ·ÅÔÚÕâÀï
MessageÖÐʹÓÃattachmentÊôÐÔ´æ´¢¸÷ÖÖÎļþÄÚÈÝÐÅÏ¢£¬ÒÔ±ãÕâЩÎļþÄÚÈÝÔÚCamel·Óɵĸ÷¸öÔªËØ¼ä½øÐÐÁ÷ת¡£attachmentͬÑùʹÓÃK-V¼üÖµ¶ÔÐÎʽ½øÐÐÎļþÄÚÈݵĴ洢¡£µ«²»Í¬µÄÊÇ£¬ÕâÀïµÄVÊÇÒ»¸öjavax.activation.DataHandlerÀàÐ͵ĶÔÏó¡£
=====================================
£¨½ÓÏÂÎÄ£©
|