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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
EIP-Apache camel2.18ʹÓÃÆª
 
  3625  次浏览      27
 2019-3-7
 
±à¼­ÍƼö:
±¾ÎÄÀ´×ÔÓÚcsdn£¬±¾ÎĽéÉÜÁËApache CamelÊÇʲôÒÔ¼°Camel ÒªËØ¡¢¶ÔһЩ´íÎó´¦ÀíµÄÏà¹ØÄÚÈÝ¡£

1¡¢¼ò½é

Apache Camel ÊÇÒ»¸ö·Ç³£Ç¿´óµÄ»ùÓÚ¹æÔòµÄ·ÓÉÒÔ¼°Ã½½éÒýÇæ£¬¸ÃÒýÇæÌṩÁËÒ»¸ö»ùÓÚPOJOµÄ ÆóÒµÓ¦ÓÃģʽ(Enterprise Integration Patterns)µÄʵÏÖ£¬Äã¿ÉÒÔ²ÉÓÃÆäÒ쳣ǿ´óÇÒÊ®·ÖÒ×ÓõÄAPI (¿ÉÒÔ˵ÊÇÒ»ÖÖJavaµÄÁìÓò¶¨ÒåÓïÑÔ Domain Specific Language)À´ÅäÖÃÆä·ÓÉ»òÕßÖнéµÄ¹æÔò¡£ ͨ¹ýÕâÖÖÁìÓò¶¨ÒåÓïÑÔ£¬Äã¿ÉÒÔÔÚÄãµÄIDEÖÐÓüòµ¥µÄJava Code¾Í¿ÉÒÔд³öÒ»¸öÀàÐͰ²È«²¢¾ßÓÐÒ»¶¨ÖÇÄܵĹæÔòÃèÊöÎļþ¡£ÕâÓëÄÇÖÖ¸´ÔÓµÄXMLÅäÖÃÏà±È¼«´ó¼ò»¯Á˹æÔò¶¨Ò忪·¢¡£ µ±È»Apache CamelÒ²ÌṩÁËÒ»¸ö¶ÔSpring ÅäÖÃÎļþµÄÖ§³Ö¡£

Apache Camel ²ÉÓÃURIÀ´ÃèÊö¸÷ÖÖ×é¼þ£¬ÕâÑùÄã¿ÉÒԺܷ½±ãµØÓë¸÷ÖÖ´«Êä»òÕßÏûϢģ¿é½øÐн»»¥£¬ÆäÖаüº¬µÄÄ£¿éÓÐ HTTP, ActiveMQ, JMS, JBI, SCA, MINA or CXF Bus API¡£ ÕâЩģ¿éÊDzÉÓÿɲå°ÎµÄ·½Ê½½øÐй¤×÷µÄ¡£Apache CamelµÄºËÐÄÊ®·ÖСÇÉÄã¿ÉÒÔºÜÈÝÒ׵ؽ«Æä¼¯³ÉÔÚ¸÷ÖÖJavaÓ¦ÓÃÖС£

2¡¢Camel ÒªËØ

2-1¡¢Endpoint ¶Ëµã

CamelÖеÄEndpointÀàËÆwebserviceÖеÄendpoint£¬¼´Ä³¸ö×ÊÔ´µÄλÖá£CamelʹÓÃURIÀ´¶¨Î»Ò»¸öendpoint. ±ÈÈçfrom(¡°file://xxxx¡±), ¿ÉÒÔÊÇfile:///edi/po/?include=.*\.txt, ´ú±í/EDI/PO/ϵÄËùÓÐtxtÎļþ£¬¼´ÎªÒ»¸öendpoint¡£

²»Í¬µÄ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>
</dependency>

¸ü¶àµÄ¶Ëµã¿ÉÒԲο¼:http://camel.apache.org/http.html

2-2¡¢ÏûϢģÐÍ

ÔÚCamelÖУ¬ÓÉÁ½²¿·Ö³éÏóÀ๹³ÉÏûÏ¢

org.apache.camel.Message¡ª¡ªÔÚ CamelÖУ¬¸Ã»ù´¡ÊµÌå°üº¬×ÅÊý¾Ý½øÐд«ÊäºÍ·ÓÉ

org.apache.camel.Exchange¡ª¡ªÔÚCamelµÄrouteÖÐ,ÏûÏ¢ÔÚRouteµÄ¸÷¸ö½ÚµãÖÐÊÇÒÔExchangeµÄÐÎʽ´«µÝµÄ

2-1¡¢Message

ÿһ¸öMessage£¨ÎÞÂÛÊÇinMessage»¹ÊÇoutMessage£©¶ÔÏóÖ÷Òª°üÀ¨ËĸöÊôÐÔ£ºMessageID¡¢Header¡¢BodyºÍAttachment¡£

¸÷¸ö×ÓÔªËØÃèÊöÈçÏÂ

- MessageID

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

- Header

ÏûÏ¢½á¹¹Öеġ°Í·²¿¡±ÐÅÏ¢£¬ÔÚÕâ¸öÊôÐÔÖеÄÐÅÏ¢²ÉÓÃK-VµÄ·½Ê½½øÐд洢£¬²¢¿ÉÒÔËæ×ÅMessage¶ÔÏóµÄ´«µÝ½«ÐÅÏ¢´øµ½ÏÂÒ»¸ö²ÎÓë·ÓɵÄÔªËØÖС£

- Body

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

- Attachment

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

ÈçÏÂËùʾΪMessageµÄÒ»¸ö×ÓÀàʵÏÖ

public class DefaultMessage extends MessageSupport {
private boolean fault;
private Map<String, Object> headers;
private Map<String, DataHandler> attachments;
private Map<String, Attachment> attachmentObjects;
...
}

2-2¡¢Exchange

ÔÚCamelµÄrouteÖÐ,ÏûÏ¢ÔÚRouteµÄ¸÷¸ö½ÚµãÖÐÊÇÒÔExchangeµÄÐÎʽ´«µÝµÄ£¬ËùÒÔ¶ÔExchange½á¹¹µÄÀí½â¶ÔʹÓÃCamelÀ´ËµÊǺÜÖØÒªµÄ¡£

- ExchangeID

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

- MEP

message exchange pattern£¬ExchangeÖеÄpatternÊôÐԷdz£ÖØÒª£¬ËüµÄÈ«³ÆÊÇ£ºExchangePattern£¨½»»»Æ÷¹¤×÷ģʽ£©¡£ÆäʵÏÖÊÇÒ»¸öö¾ÙÀàÐÍ£ºorg.apache.camel.ExchangePattern¡£¿ÉÒÔʹÓõÄÖµ°üÀ¨£ºInOnly, RobustInOnly, InOut, InOptionalOut, OutOnly, RobustOutOnly, OutIn, OutOptionalIn¡£´ÓCamel¹Ù·½Òѹ«²¼µÄÎĵµÀ´¿´£¬Õâ¸öÊôÐÔÃèÊöÁËExchangeÖÐÏûÏ¢µÄ´«²¥·½Ê½¡£

- In message ÊäÈëÏûÏ¢

- Out message Êä³öÏûÏ¢

ExchangeµÄ½á¹¹ÈçÏÂͼËùʾ

2-4¡¢CamelContextÉÏÏÂÎÄ

CamelContext´ÓÓ¢ÎÄ×ÖÃæÉÏÀí½â£¬ÊÇCamel·þÎñÉÏÏÂÎĵÄÒâ˼¡£CamelContextÔÚApache CamelÖеÄÖØÒªÐÔ£¬¾ÍÏñApplicationContextÖ®ÓÚspring¡¢ServletContextÖ®ÓÚServlet¡£

CamelContextºá¿çÁËCamel·þÎñµÄÕû¸öÉúÃüÖÜÆÚ£¬²¢ÇÒΪCamel·þÎñµÄ¹¤×÷»·¾³Ìṩ֧³Å¡£

2-4-1 ¡¢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 {
private static final Logger LOG = LoggerFactory.getLogger(SpringCamelContext.class);
private static final ThreadLocal<Boolean> NO_START = new ThreadLocal<Boolean>();
private ApplicationContext applicationContext;
private EventComponent eventComponent;
private boolean shutdownEager = true;
public SpringCamelContext() {
}
public SpringCamelContext(ApplicationContext applicationContext) {
setApplicationContext(applicationContext);
}
}
...

2-5 Êý¾Ýת»¯ÔÚCamelÖеÄÓ¦ÓÃ

2-5-1¡¢¸ÅÄî

Êý¾Ýת»»°üÀ¨Á½·½ÃæµÄÄÚÈÝ£º

- 1¡¢Êý¾Ý¸ñʽ±ä»»¡ªÏûÏ¢ÌåµÄ¸ñʽ´ÓÒ»ÖÖÐÎʽת»»ÎªÁíÒ»ÖÖÐÎʽ£ºXML¡ª->json¡£

- 2¡¢Êý¾ÝÀàÐ͵Äת»»¡ªÏûÏ¢ÌåµÄ¸ñʽ´ÓÒ»ÖÖÀàÐÍת»»ÎªÁíÒ»ÖÖÀàÐÍ:java.lang.String¡ª->javax.jms.TextMessage.

ÈçÏÂͼËùʾ

ͼ˵Ã÷ÁËÏûÏ¢Ìåת»»´ÓÒ»ÖÖÐÎʽµ½ÁíÖÐÐÎʽµÄÔ­Ôò¡£ÕâÖÖת»»Ô­ÔòÊÊÓÃÓÚÈκθñʽת»»ºÍÀàÐÍת»»¡£ÔÚCamelÓ¦ÓÃÖÐÄãÃæÁÙµÄÊý¾Ýת»»´ó¶àÊýÇé¿ö϶¼ÊǸñʽת»»£¬´ËʱÄãÐèÒªÔÚÁ½¸öЭÒéÖ®¼ä×ö¸ñʽת»»¡£CamelÄÚÖÃÁËÀàÐÍת»»»úÖÆ£¬¿ÉÒÔ×Ô¶¯ÔÚÁ½ÖÖÀàÐÍÖ®¼äת»»£¬ÕâÑù¾Í´ó´ó¼õÇáÁËÖÕ¶ËÓû§´¦ÀíÀàÐÍת»»µÄ¸ºµ£¡£

2-5-2¡¢Ê¹ÓÃEIP(ÆóÒµ¼¯³Éģʽ)ºÍjava´úÂë½øÐÐÊý¾Ýת»¯

Êý¾ÝÓ³ÉäÊÇÖ¸Á½¸ö²»Í¬µÄÊý¾ÝÄ£ÐÍÖ®¼äµÄÓ³ÉäµÄ¹ý³Ì£¬Êý¾ÝÓ³ÉäÊÇÊý¾Ý¼¯³ÉµÄÒ»¸ö¹Ø¼üÒòËØ¡£Ä¿Ç°¹ØÓÚÊý¾ÝÄ£Ð͵ıê×¼Óкܶ࣬ÕâЩ±ê×¼Óɲ»Í¬µÄ»ú¹¹»òÕßίԱ»áÖÆ¶¨¡£Òò´Ë£¬Äã»á¾­³£·¢ÏÖ×Ô¼ºÐèÒª´Ó¹«Ë¾µÄ×Ô¶¨ÒåÊý¾ÝÄ£ÐÍÓ³Éäµ½Ò»¸ö±ê×¼µÄÊý¾ÝÄ£ÐÍ¡£

CamelÖеÄÊý¾ÝÓ³É䏸Óû§ÌṩÁ˺ܴóµÄ×ÔÓÉ£¬ÒòΪËüÔÊÐíÄãʹÓÃjava´úÂ룬²¢²»¾ÖÏÞÓÚʹÓÃÌØ¶¨Êý¾ÝÓ³É乤¾ß,ʹÓù¤¾ß£¬Æð³õ¿ÉÄÜ¿´ÆðÀ´ÓÅÑÅ£¬µ«½á¹û¿ÉÄܳöÏÖ²»¿ÉÄܽâ¾öµÄÎÊÌâ¡£

ÔÚ±¾½ÚÖУ¬ÎÒÃǽ«»á¿´µ½ÈçºÎʹÓÃProcessor½øÐÐÊý¾ÝÓ³É䣬ProcessorÊÇÒ»¸öCamel API¡£CamelÒ²¿ÉÒÔʹÓÃbean½øÐÐÊý¾ÝÓ³Éä,ÕâÊÇÒ»¸öºÃµÄ×ö·¨,ÒòΪËüÔÊÐíÄãµÄÓ³ÉäÂß¼­¶ÀÁ¢ÓÚCamel API

CamelÌṩÁËÈýÖÖ·½Ê½À´Ê¹ÓôËģʽ£º

1¡¢Ê¹ÓÃProcessor

2¡¢Ê¹ÓÃBean

3¡¢ ʹÓÃtransform

2-5-2-1¡¢Processor ´¦ÀíÆ÷

ProcessorÊÇCamelÖеÄÒ»¸ö½Ó¿ÚʹÓÃProcessor£¬´Ë½Ó¿ÚÖ»ÓÐÒ»¸ö·½·¨£º

public void process(Exchange exchange) throws Exception;

´ÓÉÏÊö·½·¨¿ÉÒÔ¿´³ö£¬ProcessorÊÇÒ»¸ö¿ÉÒÔÖ±½Ó²Ù×÷CamelµÄExchange¶ÔÏóµÄAPI¡£ËüÈÃÄã¿ÉÒÔ·ÃÎÊËùÓÐÔÚCamelµÄCamelContextÖд«ÊäµÄ²¿·Ö¡£CamelContext¶ÔÏó¿ÉÒÔͨ¹ýExchangeµÄgetCamelContext·½·¨µÃµ½¡£

ÈÃÎÒÃÇ¿´Ò»¸öÀý×Ó¡£ÔÚÆïÊ¿Æû³µÁ㲿¼þϵͳÖУ¬Ã¿Ìì¶¼»á°ÑÊÕµ½µÄ¶©µ¥Êä³öΪCSV¸ñʽµÄÎļþ¡£¹«Ë¾Ê¹ÓÃÁËÒ»¸ö×Ô¶¨Òå¸ñʽµÄ¶©µ¥ÊµÌ壬µ«ÊÇΪÁËʹÊÂÇé±äµÃ¼òµ¥£¬ËûÃÇʹÓÃÁËÒ»¸öfileЭÒ飬´ËЭÒé»á¸ù¾ÝÊäÈëµÄÈÕÆÚ²ÎÊý·µ»ØÒ»¸ö¶©µ¥ÁÐ±í¡£ÄãÃæ¶ÔµÄÌôÕ½¾ÍÔÚÓÚ£º°ÑfileЭÒé·µ»ØµÄÊý¾ÝÓ³ÉäΪCSV¸ñʽ£¬²¢Ð´µ½ÎļþÖС£

ÒòΪÄãÏë´ÓÒ»¸ö¿ìËÙÔ­ÐÍ¿ªÊ¼,Äú¾ö¶¨Ê¹ÓÃCamelµÄProcessor¡£

´úÂëÖÐʹÓÃProcessor½«Ò»¸ö×Ô¶¨Òå¸ñʽת»»ÎªCSV¸ñʽ

public class OrderToCsvProcessor implements Processor {
public void process(Exchange exchange) throws Exception {
String custom = exchange.getIn().getBody(String.class);
String id = custom.substring(0, 10);
String customerId = custom.substring(10, 20);
String date = custom.substring(20, 30);
String items = custom.substring(30);
String[] itemIds = items.split("@");
StringBuilder csv = new StringBuilder();
csv.append(id.trim());
csv.append(",").append(date.trim());
csv.append(",").append(customerId.trim());
for (String item : itemIds) {
csv.append(",").append(item.trim());
}
exchange.getIn().setBody(csv.toString());
}
}

Ê×ÏÈ´ÓexchangeÖлñÈ¡×Ô¶¨Òå¸ñʽµÄÄÚÈÝ¡£ËüÊÇStringÀàÐ͵ģ¬ËùÒÔÄã´«ÈëÁËString²ÎÊý£¬Exchange·µ»ØÁËStringÀàÐ͵Ľá¹û¡£½Ó×ÅÄã´Ó×Ô¶¨Òå¸ñʽÖÐÌáÈ¡Êý¾Ýµ½±¾µØ±äÁ¿¡£×Ô¶¨Òå¸ñʽµÄÄÚÈÝ¿ÉÒÔÊÇÈÎÒâµÄ£¬µ«ÔÚÕâ¸öÀý×ÓÖУ¬ËüÊÇÒ»¸ö¶¨³¤µÄ×Ô¶¨Òå¸ñʽ¡£½Ó×ÅÄãͨ¹ý¹¹½¨Ò»¸öÒÔ¶ººÅ·Ö¸ôµÄ×Ö·û´®½«×Ô¶¨Òå¸ñʽӳÉäΪCSV¸ñʽ¡£×îºó£¬Ê¹ÓÃCSV¸ñʽµÄpayloadÌæ»»ÁË×Ô¶¨Òå¸ñʽµÄpayload¡£

Äã¿ÉÒÔÔÚÏÂÁзÓÉÖÐʹÓÃÉÏÃæµÄOrderToCsvProcessor

public class OrderToCsvProcessorTest extends
CamelTestSupport {
@Test
public void testOrderToCsvProcessor()
throws Exception {
// this is the inhouse format we want to transform to CSV
String inhouse = "0000004444000001212320091208 1217@1478@2132";
template.sendBodyAndHeader("direct:start",
inhouse, "Date", "20091208");
File file = new File("target/orders/received
/report-20091208.csv");
assertTrue("File should exist", file.exists());
// compare the expected file content
String body = context.getTypeConverter().convertTo(String.class,
file);
assertEquals("0000004444,20091208,0000012123,1217
,1478,2132", body);
}
@Override
protected RouteBuilder createRouteBuilder() throws
Exception {
return new RouteBuilder() {
@Override
public void configure() throws Exception {
from("direct:start")
// format inhouse to csv using a processor
.process(new OrderToCsvProcessor())
// and save it to a file
.to("file://target/orders/received?fileName=report-${header.Date}.csv");
}
};
}

2-5-2-2¡¢Ê¹ÓÃbean½øÐÐÊý¾Ýת»»

ʹÓÃbean½øÐÐÊý¾Ýת»»ÊÇÒ»¸öºÜºÃµÄʵ¼ù£¬ÒòΪÕâÖÖ·½Ê½ÔÊÐíÄãʹÓÃÈκÎÄãÐèÒªµÄjava´úÂë»òÕßjavaÀà¿â¡£Camel¶ÔÕâµãûÓÐÇ¿¼ÓÈκÎÏÞÖÆ¡£Camel¿ÉÒÔµ÷ÓÃÄ㿪·¢µÄÈÎÒâbean£¬ÉõÖÁÄã¿ÉÒÔʹÓÃÒѾ­´æÔÚµÄbean£¬¶ø²»ÐèÒªÖØÐ´»òÕßÖØÐ±àÒëËûÃÇ¡£

ÈÃÎÒÃÇʹÓà bean´úÌæÇ°ÃæµÄÄǸöProcessor¡£

/**
* A bean which translates an order in custom inhouse format
* to a CSV format.
*/
public class OrderToCsvBean {
public String map(String custom) {
String id = custom.substring(0, 10);
String customerId = custom.substring(10, 20);
String date = custom.substring(20, 30);
String items = custom.substring(30);
String[] itemIds = items.split("@");
StringBuilder csv = new StringBuilder();
csv.append(id.trim());
csv.append(",").append(date.trim());
csv.append(",").append(customerId.trim());
for (String item : itemIds) {
csv.append(",").append(item.trim());
}
return csv.toString();
}
}

2-5-2-3¡¢Ê¹ÓÃtransform·½·¨½øÐÐÊý¾Ýת»»

transformÊÇ¿ÉÒÔÓÃÔÚ·ÓÉÖеÄÒ»¸ö·½·¨£¬¿ÉÒÔÓÃÀ´½øÐÐÏûϢת»»¡£ÀûÓñí´ïʽ£¬transform()¾ßÓм«´óµÄÁé»îÐÔ£¬ÓÐʱ»¹¿ÉÒÔ½Úʡʱ¼ä¡£ÀýÈ磬¼ÙÉèÄãÐèҪʹÓÃ<br/>±ê¼ÇÈ¡´úËùÓÐHTML¸ñʽÊý¾ÝÖеĵĻ»Ðзû¡£´Ëʱ¿ÉÒÔʹÓÃCamelÄÚÖõıí´ïʽºÍÕýÔò±í´ïʽµÄËÑË÷ºÍÌæ»»:

from("direct:start")
.transform(body().regexReplaceAll("\n", "<br/>"))
.to("mock:result");

ÉÏÊö·ÓÉʹÓÃtransform()·½·¨¸æËßCamel£ºÏûϢҪʹÓñí´ïʽ½øÐÐת»»¡£CamelÀûÓý¨ÔìÕßģʽ´Ó·ÓÉÖеıí´ïʽ´´½¨ÁËÕû¸ö±í´ïʽ¡£ÕâÊÇͨ¹ý·½·¨µ÷ÓÃÁ´½ÓÔÚÒ»Æð,ÕâÊǽ¨ÔìÕßģʽµÄ±¾ÖÊ¡£

ÔÚÕâ¸öÀý×ÓÖУ¬ÄãÁªºÏʹÓÃÁËbody()ºÍregexReplaceAll()±í´ïʽ£¬±í´ïʽӦ¸ÃÕâÑù¶Á£º»ñÈ¡body£¬²¢Ö´ÐÐÒ»¸öÕýÔò±í´ïʽ£¬Ê¹ÓÃ<br/>Ìæ»»ËùÓеÄ\n£¬Á½¸ö±í´ïʽ×é³ÉÁËÒ»¸öÁªºÏCamel±í´ïʽ¡£

2-5-3¡¢ Camel ÀàÐÍת»»Æ÷(Converter)

CamelÌṩÁËÒ»¸öÄÚÖõÄÀàÐÍת»»ÏµÍ³,¶Ô³£ÓÃÀàÐÍÖ®¼ä½øÐÐ×Ô¶¯×ª»»¡£Õâ¸öÀàÐÍת»»ÏµÍ³Ê¹CamelµÄ¸÷¸ö×é¼þÖ±½Ó¿ÉÒÔºÜÈÝÒ×µÄЭµ÷¹¤×÷£¬²»»á³öÏÖÀàÐÍת»»´íÎó¡£´ÓCamelÓû§µÄ½Ç¶ÈÀ´¿´£¬ÔÚºÜ¶àµØ·½ÀàÐÍת»»ÊÇÄÚÖÃÔÚAPIÖеģ¬Ã»ÓÐÇÖÈëÐÔ¡£ÀýÈ磬ÓÐÈçÏ´úÂ룺

String custom = exchange.getIn().getBody(String.class);

getBody·½·¨½ÓÊÕÁËÄãËùÆÚÍû·µ»ØµÄÀàÐÍΪ²ÎÊý¡£Ôڵײ㣬ÀàÐÍת»»ÏµÍ³½«·µ»ØµÄ½á¹ûת»»³ÉÁËSringÀàÐÍ(Èç¹ûÐèÒªµÄ»°)¡£

ÔÚ±¾½ÚÖÐ,ÎÒÃǽ«¿´¿´ÀàÐÍת»»³ÌÐòµÄÄÚ²¿»úÖÆ¡£ÎÒÃǽ«½âÊÍCamelÔÚÆô¶¯Ê±ÈçºÎɨÃèÀà·¾¶£¬½øÐж¯Ì¬×¢²áÀàÐÍת»»Æ÷¡£ÎÒÃÇ»¹½«ÏòÄúչʾÔÚCamel·ÓÉÖÐÈçºÎʹÓÃËü,ÒÔ¼°ÈçºÎ½¨Á¢Äã×Ô¼ºµÄÀàÐÍת»»Æ÷¡£

2-5-3-1¡¢ CamelÀàÐÍת»»Æ÷µÄÔËÐлúÖÆ

Àí½âÀàÐÍת»»Æ÷µÄÔËÐлúÖÆ£¬Ê×ÏÈÐèÒªÀí½âÔÚCamelÖÐÀàÐÍת»»Æ÷ÊÇʲô¡£Í¼Õ¹Ê¾TypeConverterRegistryºÍTypeConvertersÖ®¼äµÄ¹ØÏµ

ÔÚCamelÆô¶¯Ê±£¬ËùÓеÄÀàÐÍת»»Æ÷¶¼»á×¢²áµ½TypeConverterRegistryÖС£ÔÚÔËÐÐʱ£¬CamelʹÓÃTypeConverterRegistryµÄlookup·½·¨²éÕÒÒ»¸öºÏÊʵÄTypeConverterÀ´Ê¹Óãº

TypeConverter lookup(Class<?> toType, Class<?> fromType);

ʹÓÃTypeConverterµÄconvertTo·½·¨£¬Camel¿ÉÒÔ½«Ò»ÖÖÀàÐÍת»»ÎªÁíÒ»ÖÖÀàÐÍ£º

<T> T convertTo(Class<T> type, Object value);

2-5-3-2¡¢Ê¹ÓÃCamelÀàÐÍת»»Æ÷

ÈçǰËùÊö£¬CamelÀàÐÍת»»Æ÷±»¹ã·ºÊ¹Ó㬶øÇÒ³£³£×Ô¶¯Æð×÷Óá£Äã¿ÉÄÜÒªÔÚÒ»¸ö·ÓÉÖÐʹÓÃËüÃÇת»»Ò»¸öÌØ¶¨µÄÀàÐÍ£¬¼ÙÉèÄãÐèÒª½«Ò»Ð©Îļþ·Óɵ½JMS¶ÓÁУ¬²¢ÇÒʹÓÃjavax.jmx.TextMessageÀàÐ͵ÄÏûÏ¢¡£Äã¿ÉÒÔ½«Ã¿Ò»¸öÎļþת»»ÎªStringÀàÐÍ£¬ÆÈʹJMS×é¼þʹÓÃTextMessage£¬CamelÊǺÜÈÝÒ××öµ½µÄ¡ªÊ¹ÓÃconvertBodyTo·½·¨£¬ÈçÏÂ

from("file://riders/inbox")
.convertBodyTo(String.class)
.to("activemq:queue:inbox");

Èç¹ûʹÓÃSpring XML£¬ÈçÏ£º

<route>
<from uri="file://riders/inbox"/>
<convertBodyTo type="java.lang.String"/>
<to uri="activemq:queue:inbox"/>
</route>

Äã¿ÉÒÔÊ¡ÂÔjava.lang.ǰ׺ <convertBodyTo type="String"/>.

2-5-3-3¡¢×Ô¶¨ÒåÀàÐÍת»»Æ÷

ÔÚCamelÖбàд×Ô¼ºµÄÀàÐÍת»»Æ÷ÊǺÜÈÝÒ׵ġ£ÄãÒѾ­¿´µ½ÀàÐÍת»»Æ÷ÊÇʲôÑù×Ó¡£¼ÙÉèÄãÏëдһ¸öconverterÓÃÓÚ½«Ò»¸öbyte[]ת»»ÎªPurchaseOrder¶ÔÏó¡£ÄÇô£¬ÄãÐèÒª´´½¨Ò»¸ö@Converter×¢½âµÄÀ࣬ÀàÖаüº¬×ª»»·½·¨£¬´úÂëÈçÏÂ

@Converter
public final class PurchaseOrderConverter {
@Converter
public static PurchaseOrder toPurchaseOrder(byte[] data, Exchange exchange) {
TypeConverter converter = exchange.getContext().getTypeConverter();
String s = converter.convertTo(String.class, data);
if (s == null || s.length() < 30) {
throw new IllegalArgumentException("data is invalid");
}
s = s.replaceAll("##START##", "");
s = s.replaceAll("##END##", "");
String name = s.substring(0, 10).trim();
String s2 = s.substring(10, 20).trim();
String s3 = s.substring(20).trim();
BigDecimal price = new BigDecimal(s2);
price.setScale(2);
Integer amount = converter.convertTo(Integer.class, s3);
PurchaseOrder order = new PurchaseOrder(name, price, amount);
return order;
}
}

´úÂëÖУ¬Í¨¹ýExchange»ñÈ¡CamelContext£¬½ø¶ø»ñÈ¡Éϼ¶TypeConverter£¬ÓÃÆä½øÐÐStringºÍbyteת»»¡£

ÏÖÔÚÄãËùÐèÒª×öµÄÊÇÌí¼Ó·þÎñ·¢ÏÖÎļþ,ÎļþÃûΪ£ºTypeConverter£¬Î»ÓÚMETA-INFĿ¼ÖС£ÕýÈçÇ°ÃæËù½âÊ͵ÄÄÇÑù,Õâ¸öÎļþ°üº¬Ò»ÐÐÄÚÈÝ£¬ÓÃÓÚCamelɨÃèÕâ¸ö°ü½ø¶ø·¢ÏÖ@Converter×¢½âÀà¡£ÈçͼËùʾ

3¡¢ ·ÓÉ

3-1¡¢ÈçºÎʹÓÃRouteBuilder

ͨ¹ý¼Ì³Ð³éÏñÀàorg.apache.camel.builder.RouteBuilderÊÇ×î³£¼ûµÄÒ»ÖÖ·½Ê½¡£È»ºóÖØÔØconfigure·½·¨ÈçÏ´úÂëËùʾ

public class MyRouteBuilder extends RouteBuilder {
/**
* Let's configure the Camel routing rules using Java code...
*/
public void configure() {
// here is a sample which processes the input files
// (leaving them in place - see the 'noop' flag)
// then performs content based routing on the message using XPath
from("file:src/data?noop=true&recusive=true")
.choice()
.when(xpath("/person/city = 'London'"))
.to("log:uk?showall=true")
.to("file:target/messages/uk")
.otherwise()
.to("file:target/messages/others");
}
}

ÏÖÔÚÖ»ÐèÒª½«¸Ã¶ÔÏóͨ¹ýCamelContextÀàµÄaddRoutes·½·¨Ìí¼Ó

public class MyRouteBuilder extends RouteBuilder {
/**
* Let's configure the Camel routing rules using Java code...
*/
public void configure() {
// here is a sample which processes the input files
// (leaving them in place - see the 'noop' flag)
// then performs content based routing on the message using XPath
from("file:src/data?noop=true&recusive=true")
.choice()
.when(xpath("/person/city = 'London'"))
.to("log:uk?showall=true")
.to("file:target/messages/uk")
.otherwise()
.to("file:target/messages/others");
}
}

3-2 ´´½¨Â·ÓÉ-Java DSL

DSLÁìÓò¶¨ÒåÓïÑÔ£¬ÓÃÀ´ÃèÊöÌØ¶¨ÁìÓòµÄÌØ¶¨±í´ï¡£±ÈÈ续ͼ´ÓÆðµãµ½Öյ㣻·ÓÉÖеĴÓAµ½B¡£

ʾÀý´úÂëÈçÏÂ

public class OrderRouterWithFilterTest extends CamelTestSupport {
@Override
protected CamelContext createCamelContext()
throws Exception {
// create CamelContext
CamelContext camelContext = super.createCamelContext();
// connect to embedded ActiveMQ JMS broker
ConnectionFactory connectionFactory =
new ActiveMQConnectionFactory("vm://localhost");
camelContext.addComponent("jms",
JmsComponent.jmsComponentAutoAcknowledge
(connectionFactory));
return camelContext;
}
@Test
public void testPlacingOrders() throws Exception {
getMockEndpoint("mock:xml").expectedMessageCount(1);
assertMockEndpointsSatisfied();
}
@Override
protected RouteBuilder createRouteBuilder()
throws Exception {
return new RouteBuilder() {
@Override
public void configure() throws Exception {
// load file orders from src/data into the JMS queue
from("file:src/data?noop=true").to
("jms:incomingOrders");
// content-based router
from("jms:incomingOrders")
.choice()
.when(header("CamelFileName").endsWith(".xml"))
.to("jms:xmlOrders")
.when(header("CamelFileName").regex
("^.*(csv|csl)$"))
.to("jms:csvOrders")
.otherwise()
.to("jms:badOrders");
...
}
};
}
}

3-3¡¢´´½¨Â·ÓÉ-Spring·½Ê½

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:broker="http://activemq.apache.org/schema/core"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd
http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
<!-- set up ActiveMQ broker -->
<broker:broker useJmx="false" persistent="false" brokerName="localhost">
<broker:transportConnectors>
<broker:transportConnector name="tcp" uri="tcp://localhost:61616"/>
</broker:transportConnectors>
</broker:broker>
<bean id="jms" class="org.apache.camel.component.jms.JmsComponent">
<property name="connectionFactory">
<bean class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="tcp://localhost:61616"/>
</bean>
</property>
</bean>
<bean id="downloadLogger" class="camelinaction.DownloadLogger"/>
<camelContext xmlns="http://camel.apache.org/schema/spring">
<route>
<from uri="file:src/data?noop=true"/>
<process ref="downloadLogger"/>
<to uri="jms:incomingOrders"/>
</route>
</camelContext>
</beans>

3-4¡¢EIP·ÓÉģʽ

3-4-1 Content-based router

3-4-2 ÏûÏ¢filters

3-4-4¡¢RecipientList ¶à¸ö½ÓÊÕÕß

ÏûÏ¢¶¯Ì¬µÄ·Óɵ½Ò»¸ö¶à¸ö½áµã£¬recipientList »á½«ÏûÏ¢¸´Öƶà·Ý·¢Ë͵½ºóÃæµÄ½Úµã,ºóÃæÃ¿¸ö½Úµã´¦ÀíµÄÏûÏ¢²»ÊÇͬһ·Ý£¬recipientListÖ§³ÖÔÚÏ̳߳ØÀïÃæÔËÐС£recipientList Ч¹ûÈçͬ multicast

ʾÀý´úÂëÈçÏÂ

<route autoStartup="true">
<from uri="direct:recipientList" />
<recipientList delimiter="," ignoreInvalidEndpoints="true">
<header>endlist</header>
</recipientList>
</route>

ProducerTemplate pt = context.getBean("camelTemplate", ProducerTemplate.class);
pt.send("direct:routingSlip", new Processor()
{
String endList = "bean:bean1,bean:changeInfo,bean:bean2";
public void process(Exchange exch) throws Exception
{
exch.getIn().setHeader("endlist", endList);
}
});

 

×îºó£¬½á¹û¶¼»á·Óɵ½bean:bean1,bean:changeInfo,bean:bean2Õâ3¸ö½ÚµãÉÏÃæ

3-4-5¡¢wireTapÇÔÌýÆ÷

4¡¢´íÎó´¦Àí

±àдӦÓóÌÐò¼¯³ÉÒ칹ϵͳ£¬ÈçºÎ´¦ÀíÒâÏë²»µ½µÄʼþÊÇÒ»¸öºÜ´óµÄÌôÕ½¡£ÔÚµ¥Ò»ÏµÍ³ÖУ¬ÓÉÓÚÄãÓÐÍêÈ«µÄ¿ØÖÆÈ¨£¬Äã¿ÉÒÔ´¦ÀíÕâЩʼþ²¢»Ö¸´Ëü¡£µ±Ê±Í¨¹ýÍøÂ缯³ÉÆðÀ´µÄϵͳÓжîÍâµÄ·çÏÕ£ºÍøÂçÁ¬½Ó¿ÉÄܶϵô¡¢Ô¶³Ìϵͳ¿ÉÄܲ»»á¼°Ê±ÏìÓ¦£¬»òÕßËü¿ÉÄÜÎÞÔµÎÞ¹Êå´»ú¡£¼´Ê¹ÔÚÄãµÄ±¾µØ·þÎñÆ÷,Ò²¿ÉÄÜ·¢ÉúÒâÍâʼþ,Èç·þÎñÆ÷µÄ´ÅÅÌÂúÁË»ò·þÎñÆ÷ÄÚ´æºÄ¾¡¡£²»¹ÜÄÄÖÖ´íÎó³öÏÖ,ÄúµÄÓ¦ÓóÌÐòÓ¦¸Ã×¼±¸´¦ÀíËüÃÇ¡£

ÔÚÕâЩÇé¿öÏÂ,ÈÕÖ¾Îļþͨ³£ÊǼǼÒâÍâʼþµÄΨһ֤¾Ý£¬ËùÒÔÈÕÖ¾·Ç³£ÖØÒª¡£Camel¶ÔÈÕÖ¾¼Ç¼ºÍ´íÎó´¦ÀíÓй㷺֧³Ö£¬È·±£ÄúµÄÓ¦ÓóÌÐò¿ÉÒÔ³ÖÐøÔËÐС£

ÔÚ±¾Õ£¬Äã»á·¢ÏÖCamelµÄ´íÎó´¦ÀíÊǶàôÁé»î,ÉîÈëºÍÈ«Ãæ£¬Ñ§»áÈçºÎ¶ÔËü½øÐж¨ÖÆ,ÒÔÓ¦¶Ô´ó¶àÊýÇé¿öϵÄÒì³£¡£ÎÒÃǽ«ÌÖÂÛCamelÌṩ¿ªÏä¼´ÓõÄËùÓдíÎó´¦Àí³ÌÐò,ÒÔ¼°ËûÃǵÄ×î¼ÑʹÓó¡¾°,ËùÒÔÄã¿ÉÒÔÑ¡Ôñ×îÊʺÏÄúµÄÓ¦ÓóÌÐòµÄ´¦Àí·½Ê½¡£Äú»¹½«Á˽âÈçºÎÅäÖúÍÕÆÎÕÏûÏ¢·µ»Ø´¦Àí£¬Camel¿ÉÒÔʹÓ÷µ»Ø¼¼Êõ³¢ÊÔ´ÓÌØ¶¨µÄ´íÎóÖлָ´¹ýÀ´¡£ÎÒÃÇ»¹¿ÉÒÔ¿´µ½Òì³£´¦Àí²ßÂÔ£¬ÕâЩ²ßÂÔÔÊÐíÄã¶Ô´íÎó½øÐÐÇø·Ö£¬Ö»´¦ÀíÌØ¶¨µÄ´íÎó£¬ÒÔ¼°¶¨ÒåͨÓôíÎó´¦Àí¹æÔò£¬ÊµÏÖ·Óɼ¶±ðµÄ´íÎó´¦Àí¡£×îºóÎÒÃÇ¿´Ï´íÎó´¦ÀíµÄϸÁ£¶È¿ØÖÆ

4-1¡¢Àí½â´íÎó´¦Àí

ÔÚ×ß½øCamel´íÎó´¦ÀíµÄÊÀ½ç֮ǰ£¬ÎÒÃÇÐèÒªÍËÒ»²½,¿´¿´¸üÆÕ±éµÄ´íÎó¡£Ê×ÏÈ£¬´íÎóÒ»°ã·ÖΪÁ½´óÀࣺ¿É»Ö¸´µÄ´íÎóºÍ²»¿É»Ö¸´µÄ´íÎ󡣯ä´ÎÎÒÃÇÐèÒª¿´¿´ºÎʱºÎµØ¿ªÊ¼´íÎó´¦Àí£¬ÒòΪ´íÎóµÄ·¢ÉúÊÇÓÐÏȾöÌõ¼þµÄ

4-1-1-1¡¢¿É»Ö¸´µÄ´íÎóºÍ²»¿É»Ö¸´µÄ´íÎó

µ±Éæ¼°µ½µÄ´íÎó£¬ÎÒÃÇ¿ÉÒÔ½«ËûÃÇ·ÖΪ¿É»Ö¸´µÄ´íÎóºÍ²»¿É»Ö¸´µÄ´íÎó£¬ÈçÏÂͼËùʾ

²»¿É»Ö¸´µÄ´íÎóÊÇÖ¸Ò»¸ö´íÎó,ÎÞÂÛÄã³¢ÊÔ¶àÉÙ´ÎÏàͬµÄ²Ù×÷£¬ËüÈÔÊÇÒ»¸ö´íÎó¡£ÔÚ¼¯³ÉµÄÏîÄ¿ÖÐ,Õâ¿ÉÄÜÒâζ×ÅÊÔͼ·ÃÎʵÄÊý¾Ý¿â±í²»´æÔÚ,Õ⽫µ¼ÖÂJDBCÇý¶¯³ÌÐòÅ׳öSQLExceptionÒì³£¡£

¿É»Ö¸´µÄ´íÎó,ÊÇÒ»¸öÁÙʱ´íÎó,ÔÚ½ÓÏÂÀ´µÄ³¢ÊÔ²Ù×÷ºó£¬¿ÉÄܲ¢²»»áÔٴγöÏÖÕâ¸ö´íÎó¡£±ÈÈçÍøÂçÁ¬½Ó´íÎóµ¼ÖµÄjava.io.IOException¡£ÔÚ½ÓÏÂÀ´µÄ³¢ÊÔ²Ù×÷ºó,ÍøÂçÎÊÌâ¿ÉÄÜÒѾ­½â¾öÁË,ÄúµÄÓ¦ÓóÌÐò¿ÉÒÔ¼ÌÐøÔËÐС£

×÷Ϊһ¸öJava¿ª·¢ÈËÔ±ÔÚÈÕ³£Éú»îÖÐ,Äã¿ÉÄÜ»áÓöµ½ÕâÑùµÄ´íÎó·ÖÀࣺ ¿É»Ö¸´µÄ´íÎóºÍ²»¿É»Ö¸´µÄ´íÎó¡£Ò»°ãÀ´Ëµ,Òì³£´¦Àí´úÂëʹÓÃÁ½ÖÖ·ÖÀàÖ®Ò»,ÈçÏÂÃæÁ½¸ö´úÂëÆ¬¶ÎËùʾ¡£

µÚÒ»¸ö´úÂëÆ¬¶ÎÑÝʾÁËÒ»¸ö³£¼ûµÄ´íÎó´¦Àí·½Ê½£¬½«ËùÓеÄÒì³£ÈÏΪÊDz»¿É»Ö¸´µÄ£¬·ÅÆú½øÒ»²½µÄ³¢ÊÔ£¬Ö±½ÓÏòµ÷ÓÃÕß·µ»ØÒì³£

public void handleOrder(Order order) throws OrderFailedException {
try {
service.sendOrder(order);
} catch (Exception e) {
throw new OrderFailedException(e);
}
}

ÏÂÒ»¸öƬ¶Îͨ¹ýÌí¼ÓһЩ´¦Àí¸ÄÉÆÁËÕâÖÖÇé¿ö£¬ÔÚÅ׳öÒ쳣֮ǰ½øÐеij¢ÊÔ£¬³¢ÊÔ5´Îºó£¬Èç¹ûÈÔȻʧ°Ü£¬Å׳öÒì³£

public void handleOrder(Order order) throws OrderFailedException {
boolean done = false;
int retries = 5;
while (!done) {
try {
service.sendOrder(order);
done = true;
} catch (Exception e) {
if (--retries == 0) {
throw new OrderFailedException(e);
}
}
}
}

ÉÏÃæµÄÀý×Ó¶¼È±ÉÙ¶Ô´íÎóÀàÐ͵ÄÑéÖ¤£¬¼´·¢ÉúµÄ´íÎóʱ¿É»Ö¸´µÄ»¹ÊDz»¿É»Ö¸´µÄ£¿½ø¶ø²ÉÈ¡ÏàÓ¦µÄ´ëÊ©¡£¿É»Ö¸´µÄÇé¿öÏÂ,Äã¿ÉÒÔÔÙÊÔÒ»´Î,²»Äָܻ´µÄÇé¿öÏÂ,Äã¿ÉÒÔÁ¢¼´·ÅÆú²¢ÖØÐÂÅ׳öÒì³£¡£

ÔÚCamelÖУ¬¿É»Ö¸´µÄ´íÎóÓÉThrowableºÍException´ú±í£¬¿ÉÒÔͨ¹ýorg.apache.camel.ExchangeÀàÖеÄÏÂÃæÁ½¸ö·½·¨½øÐдæÈ¡£º

void setException(Throwable cause);
Exception getException();

²»¿É»Ö¸´µÄ´íÎóÓÉÒ»¸öÏûÏ¢´ú±í£¬´ËÏûÏ¢ÓÐÒ»¸ö´íÎó±êʶ£¬´Ë±êʶ¿ÉÒÔͨ¹ýorg.apache.camel.ExchangeÀ´´æÈ¡¡£ÀýÈ磬ÉèÖá±Unknown customer¡±×÷Ϊһ¸ö´íÎóÏûÏ¢£¬¿ÉÒÔÕâô×ö£º

Message msg = Exchange.getOut();
msg.setFault(true);
msg.setBody(¡°Unknown customer¡±);

´íÎó±êʶ±ØÐëʹÓÃsetFault(true)·½·¨ÉèÖá£

ÄÇô,ÔÚCamelÖУ¬ÎªÊ²Ã´ÕâÁ½ÖÖÀàÐ͵ĴíÎó´ú±í²»Í¬?Ô­ÒòÓÐÁ½¸ö£ºµÚÒ»£¬Camel APIµÄÉè¼Æ·ûºÏJBI(JavaÒµÎñ¼¯³É)¹æ·¶£¬´Ë¹æ·¶ÖÐÓиö´íÎóÏûÏ¢µÄ¸ÅÄî¡£µÚ¶þ£¬CamelºËÐİüÖÐÄÚÖÃÁË´íÎó´¦Àí£¬ËùÒÔ£¬Ö»ÒªCamelÖÐÅ׳öÒì³££¬Camel¶¼¿ÉÒÔ²¶»ñËü£¬²¢°ÑËüÉèÖõ½ExchangeÖÐ×÷Ϊ¿É»Ö¸´´íÎó£¬ÈçÏÂ

try {
processor.process(exchange);
} catch (Throwable e) {
exchange.setException(e);
}

ʹÓÃÕâÖÖģʽÔÊÐíCame²¶»ñºÍ´¦ÀíËùÓÐÒì³£¡£CamelµÄ´íÎó´¦Àí»úÖÆ¾Í¿ÉÒÔ¾ö¶¨ÈçºÎ´¦Àí²¶»ñµÄ´íÎ󡪡¡ÖØÊÔ,´«²¥´íÎ󷵻ظøµ÷ÓÃÕߣ¬»òÕß×ö±ðµÄÊÂÇé¡£CamelµÄÖÕ¶ËÓû§¿ÉÒÔ½«²»¿É»Ö¸´µÄ´íÎóÉèÖÃΪ´íÎóÏûÏ¢£¬CamelÄÜ×ö³öÏàÓ¦µÄ·´Ó¦£¬Í£Ö¹Â·ÓɸÃÏûÏ¢¡£

ÏÖÔÚÄãÒѾ­Á˽âÁ˿ɻָ´ºÍ²»¿É»Ö¸´µÄ´íÎó£¬ÈÃÎÒÃÇ×ܽáÏÂËûÃÇÔÚCamelÖÐÊÇÈçºÎ±íʾµÄ£º

1¡¢Òì³£(Exceptions)±íʾΪ¿É»Ö¸´´íÎó¡£

2¡¢´íÎóÐÅÏ¢±íʾΪ²»¿É»Ö¸´µÄ´íÎó¡£

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

Java΢·þÎñÐÂÉú´úÖ®Nacos
ÉîÈëÀí½âJavaÖеÄÈÝÆ÷
JavaÈÝÆ÷Ïê½â
Java´úÂëÖÊÁ¿¼ì²é¹¤¾ß¼°Ê¹Óð¸Àý
Ïà¹ØÎĵµ

JavaÐÔÄÜÓÅ»¯
Spring¿ò¼Ü
SSM¿ò¼Ü¼òµ¥¼òÉÜ
´ÓÁ㿪ʼѧjava±à³Ì¾­µä
Ïà¹Ø¿Î³Ì

¸ßÐÔÄÜJava±à³ÌÓëϵͳÐÔÄÜÓÅ»¯
JavaEE¼Ü¹¹¡¢ Éè¼ÆÄ£Ê½¼°ÐÔÄܵ÷ÓÅ
Java±à³Ì»ù´¡µ½Ó¦Óÿª·¢
JAVAÐéÄâ»úÔ­ÀíÆÊÎö