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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
Apache Camel¿ìËÙÈëÃÅ£¨ÉÏ£©
 
  13531  次浏览      29
 2018-1-22
 
±à¼­ÍƼö:
±¾ÎÄÀ´×ÔÓÚ ËµºÃ²»ÄÜ´òÁ³ ²©¿Í£¬±¾ÎĽéÉÜÁË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ÖеĻù±¾ÊôÐÔ

  • ExchangeID

Ò»¸öExchange¹á´©×ÅÕû¸ö±àÅŵÄ·ÓɹæÔò£¬ExchangeID¾ÍÊÇËüµÄΨһ±àºÅÐÅÏ¢£¬Í¬Ò»¸ö·ÓɹæÔòµÄ²»Í¬ÊµÀý£¨¶Ô·ÓɹæÔò·Ö±ð¶ÀÁ¢µÄÁ½´ÎÖ´ÐУ©£¬ExchangeID²»Ïàͬ¡£

  • fromEndpoint

±íʾ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ÀàµÄÒ»¸öʵÀý»¯¶ÔÏó¡£

  • properties

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;
}
......
  • Pattern

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ʵÏÖ²¿·Ö·¢ÏÖÒýÓá£

  • Exception

Èç¹ûÔÚ´¦ÀíÆ÷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¡£

  • MessageID

ÔÚϵͳ¿ª·¢½×¶Î£¬Ìṩ¸ø¿ª·¢ÈËԱʹÓõıêʾÏûÏ¢¶ÔÏóΨһÐÔµÄÊôÐÔ£¬Õâ¸öÊôÐÔ¿ÉÒÔûÓÐÖµ¡£

  • Header

ÏûÏ¢½á¹¹Öеġ°Í·²¿¡±ÐÅÏ¢£¬ÔÚÕâ¸öÊôÐÔÖеÄÐÅÏ¢²ÉÓÃ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Ϊ׼¡£

  • Body

MessageµÄÒµÎñÏûÏ¢ÄÚÈÝ´æ·ÅÔÚÕâÀï

  • Attachment

MessageÖÐʹÓÃattachmentÊôÐÔ´æ´¢¸÷ÖÖÎļþÄÚÈÝÐÅÏ¢£¬ÒÔ±ãÕâЩÎļþÄÚÈÝÔÚCamel·Óɵĸ÷¸öÔªËØ¼ä½øÐÐÁ÷ת¡£attachmentͬÑùʹÓÃK-V¼üÖµ¶ÔÐÎʽ½øÐÐÎļþÄÚÈݵĴ洢¡£µ«²»Í¬µÄÊÇ£¬ÕâÀïµÄVÊÇÒ»¸öjavax.activation.DataHandlerÀàÐ͵ĶÔÏó¡£

=====================================

£¨½ÓÏÂÎÄ£©

   
13531 ´Îä¯ÀÀ       29
Ïà¹ØÎÄÕÂ

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

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

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