±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚ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¡¢´íÎóÐÅÏ¢±íʾΪ²»¿É»Ö¸´µÄ´íÎó¡£ |