SOA¼Ü¹¹ÖеÄʼþÇý¶¯·þÎñ
ʹÓÃMule¿ò¼ÜÉè¼ÆÊ¼þÇý¶¯ºÍÃæÏò·þÎñµÄƽ̨
×÷ÕߣºJeff Hanson
ÒëÕß:steven_guo
°æÈ¨ÉùÃ÷£ºÈκλñµÃMatrixÊÚȨµÄÍøÕ¾£¬×ªÔØÊ±ÇëÎñ±ØÒÔ³¬Á´½ÓÐÎʽ±êÃ÷ÎÄÕÂÔʼ³ö´¦ºÍ×÷ÕßÐÅÏ¢¼°±¾ÉùÃ÷
×÷Õß:Jeff Hanson;steven_guo
ÔÎĵØÖ·:http://www.javaworld.com/javaworld/jw-01-2005/jw-0131-soa.html
ÖÐÎĵØÖ·:http://www.matrix.org.cn/resource/article/43/43929_SOA_Event_driven.html
¹Ø¼ü´Ê£º SOA,Event-driven
ÕªÒª
¼°Ê±ÏìӦʵʱµÄ±ä»¯ºÍʼþ³ÉΪÁËÆóÒµ¼¶¼Ü¹¹µÄ×îÖØÒªÐèÇó¡£ÕâÆªÎÄÕÂÌÖÂÛÃæÏò·þÎñ¿ò¼ÜµÄ¼¼ÊõºÍ»úÖÆ£¬ÕâЩ¼¼ÊõʹµÃ¸Ã¿ò¼Ü¸ßЧ·¢ËÍ¡¢½ÓÊÜÄÇЩ¿çÔ½²ã¼¶½á¹¹µÄͬ²½ºÍÒ첽ʼþ£¬¶ø²»ÐèÒªÖªµÀ²úÉúÕâЩʼþµÄϵͳ·½ÃæµÄϸ½Ú
InternetÊÂÎñ£¬B2Bϵͳ£¬P2P³ÌÐò£¬ºÍʵʱ¹¤×÷Á÷£¬ÕâЩϵͳÓÐ×ŷdz£¸ßµÄ¶¯Ì¬ÐÔ£¬¸´ÔÓµÄϵͳ´¦Àí£¬Óô«Í³µÄÃæÏò¹ý³ÌµÄ´¦Àí·½·¨²»ÄÜÓÐЧµØÊµÏÖ¡£
Ò»¸öÃæÏò·þÎñµÄ¿ò¼Ü´ú±íÁËÒ»¸ö¶¯Ì¬µÄÔËÐÐʱ»·¾³£¬ÔÚÄÇÀï·þÎñÌṩÕߺͷþÎñÏû·ÑÕßËÉÉ¢ñîºÏ¡¢¸üÁé»îµÄ×é¼þ½»»¥¡£½¨Á¢Ò»¸ö¾ß±¸ËùÓÐÕâЩÓÅÊÆµÄ½»»¥Ä£ÐÍ£¬³ÉΪÈí¼þ¿ª·¢ÖÐ×îÓÅÏÈ¿¼Âǵġ£Ò»¸öʼþÇý¶¯µÄ½»»¥Ä£ÐÍ£¬±Èͨ³£µÄÇëÇó/ÏìÓ¦»úÖÆ¶Ôʵʱ±ä»¯ºÍ¼¤ÀøÓÐןüºÃµÄÓ¦´ðЧÂÊ¡£
ÃæÏò·þÎñµÄ¼Ü¹¹ºÍʼþÇý¶¯µÄ¼Ü¹¹ÌìÉú¾ÍÓÐ×ŶԷֲ¼Ê½ÏµÍ³µÄÊÊÓ¦ÐÔ£¬ÕâЩ¼Ü¹¹¶¼ÓÐ×ÅÄ£¿éÐÔ¡¢ËÉÉ¢ñîºÏ£¬ºÍÊÊÓ¦ÐÔµÈÌØÐÔ¡£
ÔÚÕâÆªÎÄÕÂÀÌÖÂÛʹÓÃMuleʵÏÖÒ»¸ö¸ßЧµÄʼþÇý¶¯ºÍÃæÏò·þÎñµÄƽ̨£¬Ò»¸öÇáÁ¿¼¶µÄʼþ-ÏûÏ¢¼Ü¹¹£¬ÆóÒµÐÅÏ¢×ÜÏߣ¨ESB£©Ä£Ê½¡£×é¼þºÍ³ÌÐò¿ÉÒÔʹÓÃMuleͨ¹ý¹«¹²µÄJMS»òÆäËûµÄÏûÏ¢´¦Àí¼¼ÊõȥʵÏÖͨÐÅ¡£
ÃæÏò·þÎñ¼Ü¹¹¸ÅÊö
“ÃæÏò·þÎñ”Õâ¸öÊõÓïÒѾÑݱä³ÉÒ»¸ö¼Ü¹¹£¬ÔÚÄÇÀï·þÎñ×÷Ϊһ¸öÈí¼þ×é¼þǶÈëÔÚÆóÒµÒµÎñÂß¼ºÍÌØÐµĺËÐÄÖУ¬ÌØÐÔÈçÏ£º
· ËÉÉ¢ñîºÏ£º·þÎñ²¿ÓëÆäËü×é¼þÓÐןùÉîµÙ¹ÌµÄ¹ØÏµ
· ÐÒé¶ÀÁ¢£º¶àÖÖÐÒé͸Ã÷·ÃÎÊ
· λÖò»¿ÉÖª£ºÒ»¸ö·þÎñÖ´ÐÐÒ»×éÒµÎñÂß¼£¬Õë¶ÔÕâ´Îµ÷Ó÷µ»ØÒ»¸ö½á¹û
· ´ÖÁ£¶È£º²»ÂÛÔÚʲôλÖþù¿É·ÃÎʸ÷þÎñ¡£
· ά»¤ÎÞÓû§×´Ì¬
·þÎñÊǵäÐ͵Ø×¨×¢ÓÚ½â¾öÒµÎñÁìÓòµÄÎÊÌâ¡£
ͨ³££¬·þÎñʹÓö˸ù¾ÝÅäÖÃÊý¾Ý£¬×¢²áÏîºÍÈí¼þ¹¤³§È¥¾ö¶¨¸ø·þÎñµÄλÖã¬ÐÒéºÍ¹«¹²½Ó¿Ú¡£
Ó¦ÓóÌÐòͨ³£±»±íÊö³ÉËûÃÇÓÐʲô¹¦ÄÜ£¬¶ø²»Ç¿µ÷Õâ¸öÓ¦ÓóÌÐòÊÇʲô¶«Î÷£¬°üº¬Ê²Ã´¡£»ùÓÚÕâ¸öÔºÓ¦£¬¸ü¶àÖ±½ÓÃèÊöÒ»¸öÓ¦ÓóÌÐòͨ¹ýʹÓö¯´Ê£¨·þÎñ£©¶ø²»ÊÇÓÃÃû´Ê£¨Ó¦ÓÃÖ÷Ì壩¡£ÒòΪ£¬Ò»¸öÃû´Ê£¨Ó¦ÓÃÖ÷Ì壩ÊǶ¨ÒåÁËÁËÒ»¸öÊÂÎñ£¬¶ø²»ÊǶ¯×÷£¬µ±Ç¿ÖưÑÒ»¸ö×é¼þÓÐʲô¹¦ÄÜ×÷Ϊһ¸ö×é¼þÊÇʲôÀ´¶¨Ò壬ÄǾͻá³öÏÖÎó½â¡£ÔÚSOAÁìÓò£¬Ò»¸öÓ¦ÓóÌÐòÄܺÜ×ÔÈ»µÄ±»ÃèÊö£¬ÒòΪÿ¸öÓ¦ÓóÌÐòµÄÒµÎñÂß¼²Ù×÷Äܱ»ÃèÊö³ÉΪһ¸ö·þÎñµÄÖ´ÐÐÑ¡Ôñ¡£Òò´Ë£¬SOA½â¾öÁËÕâÖÖÎó½â£¬ËüÔÊÐíÓ¦ÓóÌÐòºÍ×é¼þÈ¥·ÃÎÊÒ»¸ö·þÎñËùÄÜʵÏֵŦÄÜ£¬ÀýÈ磬ËûÃÇÖ´ÐÐʲô¶¯×÷¡£ÒÀ´Î£¬Ó¦ÓóÌÐò¿ª·¢ÕßÄܸüÈÝÒׯ¥ÅäËûÃǵÄÐèÒªÓëÊʵ±µÄ·þÎñ£¬ÒòΪ·þÎñ½Ó¿ÚµÄÃèÊö¸üÍêÕûµØËµÇåÁËËûÃÇÒª½â¾öµÄÎÊÌâ¡£
ʼþÇý¶¯¼Ü¹¹¸ÅÊö
Ò»¸öʼþÇý¶¯¿ò¼Ü£¨EDA£©¶¨ÒåÁËÒ»¸öÉè¼ÆºÍʵÏÖÒ»¸öÓ¦ÓÃϵͳµÃ·½·¨Ñ§£¬ÔÚÕâ¸öϵͳÀïʼþ¿É´«ÊäÓÚËÉÉ¢ñîºÏµÄÈí¼þ×é¼þºÍ·þÎñÖ®¼ä¡£Ò»¸öʼþÇý¶¯ÏµÍ³µäÐ͵ØÓÉʼþÏû·ÑÕߺÍʼþ²úÉúÕß×é³É¡£Ê¼þÏû·ÑÕßÏòʼþ¹ÜÀíÆ÷¶©ÔÄʼþ£¬Ê¼þ²úÉúÕßÏòʼþ¹ÜÀíÆ÷·¢²¼Ê¼þ¡£µ±Ê¼þ¹ÜÀíÆ÷´Óʼþ²úÉúÕßÄǽÓÊÕµ½Ò»¸öʼþʱ£¬Ê¼þ¹ÜÀí°ÑÕâ¸öʼþתË͸øÏàÓ¦µÄʼþÏû·ÑÕß¡£Èç¹ûÕâ¸öʼþÏû·ÑÕßÊDz»¿ÉÓõģ¬Ê¼þ¹ÜÀíÕ⽫±£ÁôÕâ¸öʼþ£¬Ò»¶Î¼ä¸ôÖ®ºóÔÙ´ÎתË͸ÃʼþÏû·ÑÕß¡£ÕâÖÖʼþ´«ËÍ·½·¨ÔÚ»ùÓÚÏûÏ¢µÄϵͳÀï¾ÍÊÇ£º´¢´æ£¨store£©ºÍתËÍ£¨forward£©¡£
¹¹½¨Ò»¸ö°üº¬Ê¼þÇý¶¯¹¹¼ÜµÄÓ¦ÓóÌÐòºÍϵͳ£¬ÕâÑù¾ÍʹµÃÕâЩӦÓóÌÐòºÍϵͳÏìÓ¦¸üÁéÃô£¬ÒòΪʼþÇý¶¯µÄϵͳ¸üÊʺÏÓ¦ÓÃÔÚ²»¿ÉÔ¤ÖªµÄºÍÒì²½µÄ»·¾³Àï¡£
ʼþÇý¶¯Éè¼ÆºÍ¿ª·¢µÄÓÅÊÆ£º
ʼþÇý¶¯Éè¼ÆºÍ¿ª·¢ËùÌṩµÄÓÅÊÆÈçÏ£º
· ¿ÉÒÔ¸üÈÝÒ׿ª·¢ºÍά»¤´ó¹æÄ£·Ö²¼Ê½Ó¦ÓóÌÐòºÍ²»¿ÉÔ¤ÖªµÄ·þÎñ»òÒì²½·þÎñ
· ¿ÉÒÔºÜÈÝÒ×£¬µÍ³É±¾µØ¼¯³É¡¢ÔÙ¼¯³É¡¢ÔÙÅäÖÃеĺÍÒÑ´æÔÚµÄÓ¢Ó³ÌÐòºÍ·þÎñ
· ´Ù½øÔ¶³Ì×é¼þºÍ·þÎñµÄÔÙʹÓã¬ÓµÓÐÒ»¸ö¸üÁéÃô¡¢Ã»ÓÐBugµÄ¿ª·¢»·¾³
· ¶ÌÆÚÀûÒæ£º¸üÈÝÒ×¶¨ÖÆ¡£ÒòΪÉè¼Æ¶Ô¶¯Ì¬´¦ÀíÓÖ¸üºÃµÄÏìÓ¦¡£
· ³¤ÆÚÀûÒæ£ºÏµÍ³ºÍ×éÖ¯µÄ״̬±äµÃ¸ü¾«×¼£¬¶Ôʵʱ±ä»¯µÄÏìÓ¦½Ó½üÓÚͬ²½¡£
EDA ºÍ SOA ÕûºÏ
²»ÏóÇëÇó/ÏìӦϵͳ£¬ÒªÇóÇëÇóÕß±ØÐëÃ÷È··¢ËÍÇëÇóÐÅÏ¢£¬¶øÒ»¸öʼþÇý¶¯ ¼Ü¹¹Ìṩһ¸ö»úÖÆÈ¥¶¯Ì¬ÏìӦʼþ¡£ÔÚÒ»¸öEDAϵͳÀʼþ²úÉúÕß·¢²¼Ê¼þ£¬Ê¼þÏû·ÑÕß½ÓÊÜʼþ¡£
ÒµÎñϵͳ¿ÉÒÔ´ÓSOAºÍEDAÖÐÊÜÒæ·Ëdz£¬ÒòΪµ±Ê¼þ·¢ÉúʱEDAÄÜ´¥·¢Ê¼þÏû·ÑÕߣ¬SOA·þÎñ¿ÉÒÔ¿ìËٵشÓÏàͬµÄÏû·ÑÕßÖзÃÎÊ¡¢²éѯ¡£
ϵͳҪÓÐ×î¸ßµÄÏìÓ¦ÐÔ£¬µ±Ê¼þ´¥·¢Ê±Õâ¸öϵͳ±ØÐëÄÜ¿ìËÙ¾ö¶¨±ØÐëµÄ¶¯×÷¡£µ½Ê¼þ½áÊø£¬Ê¼þÓ¦¸Ã±»·¢²¼ºÍÏû·Ñ£¬¶øÇÒʼþÒª´©Ô½SOAËùÓеı߽磬°üÀ¨Õû¸öÌåϵ½á¹¹ºÍÎïÀí²ã¡£
ͼ1ÑÝʾÁËʼþ±»¼¤·¢ºÍ´©Ô½Ìåϵ½á¹¹µÄËùÓвã

ͼ1£ºÊ¼þ´©Ô½Ìåϵ½á¹¹µÄ²ã¼¶
ÔÚͼ1µÄ»·¾³ÖУ¬Ò»¸öʼþÄܱ»¶¨ÒåΪÈκÎϵͳµÄ£¬Æ½Ì¨µÄ£¬×é¼þµÄ£¬ÒµÎñµÄ»òÓ¢Ó½ø³ÌµÄ±ä»¯¡£Ê¼þ¿ÉÄÜÊǸ߲ãµÄÒµÎñʼþ»òµ×²ãµÄϵͳʼþ¡£ÒòΪʼþÄܱ»´«ËͺͽÓÊÕ£¬¶©ÔÄʼþµÄÓ¢Ó³ÌÐòºÍ·þÎñÄܶÔÕâЩ±ä»¯×ö³öÏìÓ¦¡£
ʼþ·ÖÀàºÍÒò¹û¹ØÏµ
Àí½âÒ»¸öʼþµÄÃØ¾÷ÊÇÖªµÀÕâ¸öʼþ·¢ÉúµÄÔÒò£¬Õâ¸ö¾ÍÊÇͨ³£ËµµÄÒò¹û¹ØÏµ¡£Ê¼þµÄÒò¹û¹ØÏµµäÐ͵طÖΪÁ½Àࣺ
· ƽÐйØÏµ£ºÊ±¼äÔ´ºÍ´¥·¢ÔÚÌåϵ½á¹¹µÄͬһ²ã¡£
· ´¹Ö±¹ØÏµ£ºÊ±¼äÔ´ºÍ´¥·¢ÔÚÌåϵ½á¹¹µÄ²»Í¬²ã¡£
´¹Ö±¹ØÏµÒâζ×ÅÒ»¸öʼþµÄ·ÖÀà·½·¨£¬ÕâЩʼþ±£ÁôÁËһЩ²»±äµÄ¶«Î÷¶ø´©Ô½Ò»¸öϵͳ²»Í¬µÄ²ã£¬Ê¼þ·ÖÀàÈçÏ£º
· ÉúÃüÖÜÆÚʼþ£ºÒ»¸öʵÌåÉúÃüÖÜÆÚµÄ±ä»¯£¬ÀýÈçÒ»¸ö½ø³ÌµÄÍ£Ö¹»òÆô¶¯
· Ö´ÐÐʼþ£ºÔËÐÐʱʼþ£¬ÀýÈç·þÎñ»ò×é¼þµÄµ÷ÓÃ
· ¹ÜÀíʼþ£ºµ±Ò»¸ö״̬³¬¹ýÁËÔ¤Ïȵ͍Òå»òÒ»¶¨·¶Î§Ê±
ƽÐйØÏµÒâζ×ÅÒ»¸öʼþµÄ·ÖÀà·½·¨£¬ÕâЩʼþ±£ÁôÁËһЩ²»±äµÄ¶«Î÷¶ø´©Ô½Ò»¸öϵͳ²»Í¬µÄ²ã£¬Ê¼þ·ÖÀàÈçÏ£º
· ϵͳ²ãʼþ£ºÏµÍ³¼¶¶¯×÷£¬ÀýÈç´´½¨Ò»¸öÎļþ»ò¹Ø±ÕÒ»¸ö¶Ë¿Ú
· ƽ̨²ãʼþ£ºÆ½Ì¨¼¶¶¯×÷,ÀýÈçÐÞ¸ÄÒ»¸öÊý¾ÝÔ´»òÔö¼ÓÒ»¸öеķþÎñ
· ×é¼þ²ãʼþ£º×é¼þ¼¶¶¯×÷£¬ÀýÈçÊÓͼ¶ÔÏóµÄת»»»ò״̬»ú±ä»¯
· ÒµÎñ²ãʼþ£ºÒµÎñ¼¶¶¯×÷£¬ÀýÈç´´½¨Óû§»òɾ³ýÕʺÅ
· Ó¦Óòãʼþ£ºÓ¦Óü¶¶¯×÷£¬ÀýÈçÔö¼Ó±£ÏÕ½ð»ò±¨¼ÛÌá½»
Ðí¶àESB¿ò¼ÜºÍƽ̨Òâʶµ½ÔÚSOAÖаüº¬»ùÓÚʼþÇý¶¯µÄͨÐÅÓкܶàÓÅÊÆ¡£ÔÚJava¿ª·¢ÁìÓò£¬Mule¾ÍÊÇÕâЩ×îÓÐǰ¾°µÄƽ̨֮һ¡£
½éÉÜMule
MuleÊÇÒ»¸ö¿ªÔ´ÏûÏ¢ESB¿ò¼Ü£¬Ò»¸öÏûÏ¢´úÀí£¬Ò»¸ö·Ö¼¶Ê¼þÇý¶¯µÄ¿ò¼Ü£¨SEDA£©¡£SEDA¶¨ÒåÁËÒ»¸öÒÀÕÕ·Ö¼¶¶ÓÁС¢¸ß¶È²¢ÐÐµÄÆóÒµ¼¶Æ½Ì¨¡£MuleʹÓÃSEDµÄ¸ÅÄîÔö¼Óʼþ´¦ÀíµÄÐÔÄÜ¡£
MuleÖ§³Öͬ²½¡¢Òì²½ºÍÇëÇóÏìӦʼþ£¬Ê¼þ´¦ÀíºÍ´«ÊäʵÓò»Í¬µÄ¼¼ÊõÀýÈçJMS£¬HTTP£¬µç×ÓÓʼþºÍ»ùÓÚXMLµÄRPC¡£MuleÄܺÜÈÝÒ×µØÇ¶Èëµ½ÈκÎÓ¦Óÿò¼ÜÖУ¬Ã÷È·Ö§³ÖSpring¿ò¼Ü¡£MuleÒ²Ö§³Ö¶¯Ì¬µÄ£¬Ô¤¶¨ÒåµÄ£¬»ùÓÚÄÚÈݵĺͻùÓÚ¹æÔòµÄÏûϢ·ÓÉ¡£MuleʹµÃÔ¤¶¨ÒåµÄºÍ¼Æ»®ÐÔµÄÊÂÎñ¸üÈÝÒ×£¬°üÀ¨XAÊÂÎñÖ§³Ö¡£MuleÌṩһ¸öÓдú±íÐÔµÄ״̬µ÷Óã¨REST£©APIÌṩ¸øÓëWebµÄʼþ·ÃÎÊ¡£
Mule ESBģʽÇý¶¯ÏµÍ³ÖÐËùÓзþÎñ£¬Õâ¸öϵͳÓÐ×ÅÒ»¸ö·ÖÀëµÄÏûϢͨѶÖÐÊà¡£·þÎñ×¢²áÔÚ×ÜÏßÉÏ£¬µ«²»ÖªµÀÆäËûÈκα»×¢²áµÄÏûÏ¢£»Òò´Ë£¬Ã¿¸ö·þÎñÖ»¹ØÐÄ´¦ÀíËüÊÕµ½µÄʼþ¡£MuleÒ²°ÑÈÝÆ÷£¬´«Ê䣬ת»»Ï¸½Ú´Ó·þÎñÖзÖÀë³öÀ´£¬ÔÊÐíÈκζÔÏó×÷Ϊ·þÎñ×¢²áµ½×ÜÏߵġ£
ÎÒʹÓÃMule¿ò¼ÜÈ¥ÑÝʾÕâÆªÎÄÕÂËùÌÖÂ۵ĸÅÄîºÍ˼Ïë
Mule¿ò¼Ü
Mule¿ò¼ÜÖ÷Òª°üº¬ÏÂÁÐÄÚÈÝ£º
ͨÓÃÏûÏ¢¶ÔÏó£¨UMO£©API
UMO APIµÚÒ»ÁËËùÓб»Mule ¹ÜÀíµÄ·þÎñºÍ¶ÔÏó½»»¥
UMO×é¼þ
ÔÚMuleϵͳÖУ¬UMO×é¼þ¿ÉÒÔʹÈκÎÔÚϵͳÖнÓÊÕ¡¢´¦ÀíºÍ·¢ËÍʼþÏûÏ¢µÄ×é¼þ
Mule·þÎñÆ÷
Mule·þÎñÆ÷×é¼þÊÇÒ»¸öÔÚMuleÓ¦Óû·¾³ÖÐ×Ô¶¯¼ÓÔØµÄ·þÎñÆ÷Ó¦ÓóÌÐò
ÃèÊöÆ÷
ÃèÊöÆ÷×é¼þÃèÊöÒ»¸öMule UMOÊôÐÔ¡£ÐµÄMule MUO¶ÔÏóÄܱ»ËüÃÇËù¹ØÁªµÄÃèÊöÆ÷³õʼ»¯¡£Ò»¸öÃèÊöÆ÷°üº¬£º
· UMO×é¼þÃû
· UMO×é¼þ°æ±¾
· UMO×é¼þʵÏÖÀà
· Òì³£²ßÂÔ
· ÈëÕ¾ºÍ³öÕ¾ÌṩÕß
· ÈëÕ¾ºÍ³öվ·ÓÉÆ÷
· À¹½ØÆ÷
· ½ÓÊպͷ¢ËÍÇÐÈëµã
· ÈëÕ¾ºÍ³öվת»»Æ÷
· ¸÷ÖÖ¸÷ÑùµÄÌØÐÔ
Á¬½ÓÆ÷
Á¬½ÓÆ÷ÊÇһЩ×é¼þ£¬ËüÃÇ¿ÉÒÔÁ¬½Óµ½Íⲿϵͳ»òÆäËûÐÒé¡¢¹ÜÀíÄÇЩϵͳ»òÐÒéµÄ״̬¡£Ò»¸öÁ¬½ÓÆ÷¸ºÔð·¢ËÍÏûÏ¢µ½ÍⲿÏûÏ¢½ÓÊÕÆ÷¡¢¹ÜÀíÏûÏ¢½ÓÊÕÆ÷µÄ×¢²áºÍ×¢Ïú¡£
ÌṩÕß
ÌṩÕßÊÇһЩ×é¼þ£¬¹ÜÀí°ÑʼþÊý¾Ý·¢Ë͵½Íⲿϵͳ¡¢´ÓÍⲿϵͳ½ÓÊÜʼþÊý¾ÝºÍת»»Ê¼þÊý¾ÝµÈÊÂÏî¡£ÔÚMule¿ò¼ÜÀËûÃÇÄÜÁ¬½Óµ½Íⲿϵͳ»òÆäËû×é¼þ¡£Ò»¸öÌṩÕß¾ÍÏñÒ»¸ö´ÓÍⲿϵͳ½øÈëMule»ò´ÓMuleÄÚ²¿·ÃÎÊÍⲿϵͳµÄÇŽӯ÷¡£Êµ¼ÊÉÏ£¬ÌṩÕßÓÐÒ»×é¶ÔÏó×é³É£¬¿ÉÒÔÓëϲãϵͳÁ¬½Ó²¢Óë֮ͨÐÅ¡£ÌṩÕßµÄ×é³É²¿¼þÊÇ£º
· Á¬½ÓÆ÷£º¸ºÔðÁ¬½Óµ½Ï²ãϵͳ
· ÏûÏ¢½ÓÊÕÆ÷£º´Óϵͳ½ÓÊÕʼþ
· Á¬½Óµ÷¶ÈÕߣº´«ËÍϵͳµ½ÏµÍ³
· ת»»Æ÷£º×ª»»´Óϵͳ½ÓÊÕµ½µÄ»òÒª·¢Ë͵½ÏµÍ³µÄÊý¾Ý
· ÖÕ¶Ë£ºËù½¨Á¢Á¬½ÓµÄͨµÀµØÖ·
· ÊÂÎñÅäÖÆ£º¶¨ÒåÁ¬½ÓµÄÊÂÎñÊôÐÔ
Öն˵÷½âÕß
µ±UMO×é¼þ½ÓÊÕµ½Ò»¸öʼþʱ£¬Öն˵÷½âÕß¾ö¶¨È¥µ÷ÓÃËüµÄʲô·½·¨
ת»»Æ÷
ת»»Æ÷×é¼þ¸ºÔðË«Ïòת»»ÏûÏ¢»òʼþµÄÓÐÐ§ÔØºÉ¡£µ±Ò»¸öʼþµ½´ï½ÓÊյĶÔÏó֮ǰ£¬×ª»»Æ÷¿ÉÒÔÁ´½Óµ½Ò»ÆðÈ¥Ö´ÐÐһϵÁеÄ×°»»²Ù×÷¡£
ÏûÏ¢ÊÊÅäÆ÷
ÏûÏ¢ÊÊÅäÆ÷ÌṩһÖй«¹²µÄ·½Ê½È¥¶ÁÍⲿϵͳµÄÒì¹¹Êý¾Ý¡£
ÏûÏ¢½ÓÊÕÆ÷
ÏûÏ¢½ÓÊÕÆ÷ÊÇһЩÁÐÖն˼àÌýỊ̈߳¬¸ºÔð´ÓÍⲿϵͳ½ÓÊÕÊý¾Ý¡£
ÏûÏ¢µ÷¶ÈÕß
ÏûÏ¢µ÷¶ÈÕß·¢ËÍ£¨Í¬²½£©»òÅÉDz£¨Òì²½£©Ê±¼äµ½Ï²ãϵͳ¡£
ÏûϢ·ÓÉÆ÷
ÏûϢ·ÓÉÆ÷ÊÇһϵÁÐ×é¼þ£¬¿ÉÒÔʹ±»ÅäÖÆµÄUMO×é¼þÒÀ¾ÝÏûÏ¢»òÆäËûÅäÖÆÍ¼Â·ÓÐÒ»¸öÏûÏ¢µ½²»Í¬µÄÌṩÕß¡£
´úÀí
´úÀíÊÇһЩ°ï¶¨µ½Íⲿ·þÎñµÄ×齨£¬ÀýÈçJME·þÎñÆ÷¡£
MuleÄ£ÐÍ
Ò»¸öMuleÄ£ÐÍ·â×°ºÍ¹ÜÀíÒ»¸öMule·þÎñÆ÷ʵÀýµÄÔËÐÐʱÐÐΪ¡£Ò»¸öÄ£ÐͰüº¬£º
· ÃèÊöÆ÷
· UMO×é¼þ
· Ò»¸öÖն˵÷½âÕß
· Ò»¸öÉúÃüÖÜÆÚÊÊÅäÆ÷¹¤³§
· Ò»¸ö×é¼þµ÷½âÕß
· Ò»¸ö³Ø»¯¹¤³§
· Ò»¸öÒì³£²ßÂÔ
Mule¹ÜÀíÆ÷
Mule¹ÜÀíÆ÷ά»¤ºÍÌṩÒÔÏ·þÎñ £º
· ´úÀí
· ÌṩÕß
· Á¬½ÓÆ÷
· ÖÕ¶Ë
· ת»»Æ÷
· À¹½ØÆ÷¶ÑÕ»
· Ò»¸öMuleÄ£ÐÍ
· Ò»¸öMule·þÎñÆ÷
· ÊÂÎñ¹ÜÀíÆ÷
· Ó¦ÓóÌÐòÊôÐÔ
· MuleÅäÖÆ
ͼ2ÑÝʾÁËMule¿ò¼ÜÉϲãÏûÏ¢Á÷ÊÓͼ

ͼ2£ºMuleÉϲã¼Ü¹¹
Muleʼþ¶ÔÏó
Muleʼþ¶ÔÏó¶ÔÏó°üº¬Ê¼þÊý¾ÝºÍ±»×é¼þËù¸ÐÖªºÍ²Ù¿ØµÄÊôÐÔ¡£ÊôÐÔÊÇÈÎÒâµÄ£¬ÔÚʼþ´´½¨Ö®ºóÈκÎʱ¼ä¿É±»ÉèÖá£
org.mule.umo.UMOEventÀà´ú±íÁËÒ»¸öÔÚMule»·¾³ÖгöÏÖµÄʱ¼ä¡£ËùÓÐÔÚ×é¼þÖ®¼ä·¢ËÍ»ò½ÓÊÕµÄÊý¾Ý¶¼ÊÇorg.mule.umo.UMOEventµÄÒ»¸öʵÌå¡£¿ÉÒÔ·ÃÎÊÒ»¸öÔʼµÄ»ò±»×ª»»µÄMuleʼþ¶ÔÏóÖеÄÊý¾ÝÄÜ¡£Ò»¸öMuleʼþ¶ÔÏóʹÓÃÒ»¸öÓëÌṩÕß¹ÜÀíµÄÌṩÕßת»»Êý¾Ý£¬ÌṩÕßÊÕµ½Êý¾Ýºó°ÑʼþÖеÄÓÐÐ§ÔØºÉת»»³Éµ±Ç°×é¼þËùʶ±ðµÄ¸ñʽ¡£
Ò»¸öMuleʼþ¶ÔÏóµÄÓÐЧÓÐÐ§ÔØºÉÄÜͨ¹ýorg.mule.umo.UMOMessage½Ó¿Ú·ÃÎÊ£¬Ò»¸öorg.mule.umo.UMOMessageʵÀýÓÉÓÐÐ§ÔØºÉºÍËüµÄÊôÐÔ×é³É¡£Õâ¸ö½Ó¿ÚÊDz»Í¬¼¼ÊõʵÏÖµÄÏûÏ¢¶ÔÏóµÄÒ»¸ö³éÏó¡£
org.mule.extras.client.MuleClientÀඨÒåÁËÒ»¸ö¼òµ¥µÄ½è¿Ú£¬ÔÊÐíMule¿Í»§¶Ë´ÓMule·þÎñÆ÷½ÓÊպͷ¢ËÍʼþÊý¾Ý¡£ÔÚ´ó¶àÊýMuleÓ¦ÓóÌÐòÀʱ¼äÊDZ»Ò»Ð©ÍⲿµÄ²¢·¢ÐÐΪËù´¥·¢£¬ÀýÈçÒ»¸öÖ÷ÌâÉϽÓÊÕµ½ÏûÏ¢»òÔÚĿ¼ÀïÒ»¸öÎļþ±»É¾³ý¡£
ÏÂÃæÑÝʾÁËÈçºÎÈ¥·¢ËÍÒ»¸öͬ²½Ê¼þµ½ÁíÍâµÄMule×é¼þ£º
String componentName = "MyReceiver"; // The name of the receiving component.
String transformers = null; // A comma-separated list of transformers
// to apply to the result message.
String payload = "A test event"; // The payload of the event.
java.util.Map messageProperties = null; // Any properties to be associated
// with the payload.
MuleClient client = new MuleClient();
UMOMessage message = client.sendDirect(componentName,
transformers,
payload,
messageProperties);
System.out.println("Event result: " + message.getPayloadAsString());
MuleClientÀàÐèÒªÒ»¸ö·þÎñÆ÷URLÇø¶¨ÒåËüËùÁ¬½ÓµÄÔ¶³ÌMule·þÎñÆ÷µÄÖÕ¶Ë¡£URL¶¨ÒåÁË´«ÊäÐÒé¡¢½ÓÊÕÏûÏ¢µÄµØÖ·£¬ÌṩÕßÔÚÅÉDzһ¸öʼþʱ¿ÉÒÔËæÊ±Ê¹ÓÃÕâЩÐÅÏ¢¡£ÖÕ¶ËÀýʾÈçÏ£º
· vm://com.jeffhanson.receivers.Default: ʹÓÃÐéÄâ»úµÄÌṩÕßÅÉDzµ½Ò»¸öcom.jeffhanson.receivers.Default
· jms://jmsProvider/accounts.topic:ʹÓÃÈ«¾Ö×¢²áµÄjmsProviderÅÉDzһ¸öJMSÏûÏ¢µ½ccounts.topic.
· jms://accounts.topic: ʹÓõÚÒ»¸ö£¨Ä¬ÈÏ£©µÄJMSÌṩÕßÅÉDzJMSÏûÏ¢
Muleʼþ´¦Àí
Mule¿ÉÒÔÔÚÈýÖÖ²»Í¬µÄ·½Ê½·¢ËͺͽںóËÒʼþ£º
1£®Òì²½·½Ê½£ºÒ»¸ö×é¼þ¿Éͨ¹ý²»Í¬µÄÏß³Ìͬʱ´¦Àí¶à¸öʼþµÄ·¢ËͺͽÓÊÕ
2£®Í¬²½·½Ê½£ºÔÚÒ»¸ö×é¼þÖØÐ¹¤×÷֮ǰ£¬Ò»¸öµ¥Ò»µÄʼþ±ØÐë±»´¦ÀíÍê¡£»»ÑÔÖ®£¬Ò»¸ö´´½¨ÁËʼþµÄ×齨·¢ËÍʼþʱ½«±»×è¶Ï£¬Ö±µ½·¢ËÍÈÎÎñÍê³É£¬Òò´Ë£¬Ò»´ÎÖ»ÔÊÐí´¦ÀíÒ»¸öʼþ
3£®ÇëÇó-Ó¦´ð·½Ê½£ºÒ»¸ö×齨רÃÅÇëÇóÒ»¸öʼþ£¬È»ºóµÈ´ýÒ»¸öÌØ¶¨µÄʱ¼äÈ¥½ÓÊÕ»ØÓ¦¡£
org.mule.impl.MuleComponentʵÏÖÀàÌṩÁËÒ»¸ö¾ßÌåµÄ×齨À࣬Ëü°üÀ¨ÓÖÓд´½¨£¬·¢ËͺͽÓÊÕʼþµÄ¹¦ÄÜ¡£
Ö´ÐÐͬ²½¶¯×÷µÄ¶ÔÏóÓ¦¸ÃʵÏÖorg.mule.umo.lifecycle.Callable½Ó¿Ú£¬Õâ¸ö¶¨ÒåÁËÒ»¸ö¼òµ¥µÄ·½·¨Object onCall(UMOEventContext eventContext)¡£Callable½Ó¿ÚÌṩ֧³Öʼþµ÷ÓõÄUMO¶ÔÏó¡£ËäÈ»²»ÊÇÇ¿ÖÆµÄ£¬µ«Õâ¸ö½Ó¿ÚÌṩÁËÒ»¸öÉúÃüÖÜÆÚ¿ØÖƵķ½·¨£¬µ±ÊµÏÖÕâ¸ö½Ó¿ÚµÄ×齨½ÓÊÕµ½Ò»¸öÏûϢʱִÐÐÕâ¸ö·½·¨¡£ÏÂÃæÕ¹Ê¾ÁËÕâ¸ö½Ó¿ÚµÄ¼òµ¥ÊµÏÖ¡£
import org.mule.umo.lifecycle.Callable;
public class EchoComponent
implements Callable
{
public Object onCall(UMOEventContext context) throws Exception
{
String msg = context.getMessageAsString();
// Print message to System.out
System.out.println("Received synchronous message: " + msg);
// Echo transformed message back to sender
return context.getTransformedMessage();
}
}
´ÓonCall£¨£©·½·¨¿É·µ»ØÈκζÔÏó¡£µ±×é¼þµÄUMOLifecycleAdapter½ÓÊÕÕâ¸ö¶ÔÏóʱ£¬ËüÊ×ÏÈ¿´¿´Õâ¸ö¶ÔÏóÊÇ·ñÊÇÒ»¸öUMOMessage£»Èç¹ûÕâ¸ö¶ÔÏó¼È²»ÊÇUMOMessageÒ²²»ÊÇNull£¬ÄÇôÒÔÕâ¸ö¶ÔÏó×÷ΪÓÐÐ§ÔØºÉÈ¥´´½¨Ò»¸öеÄÏûÏ¢¡£Õâ¸öÐÂʼþ¾ÓÉËùÅäÖÆµÄ³öվ·ÓÐÆ÷·¢²¼£¬Èç¹ûUMO¶ÔÏóÒѾÅäÖÆÁËÒ»¸ö³öվ·ÓÉÆ÷£¬ÄÇôÔÚUMOEventContextʵÀýÖв»Äܵ÷ÓÃsetStopFurtherProcessing(true)·½·¨¡£
MuleʹÓõÄÒ»¸ö¼òµ¥µÄʼþ¿ò¼Ü
ÈÃÎÒÃǰÑÕ⼸¶ÎMuleµÄ´úÂë·Åµ½Ò»ÆðÈ¥¹¹½¨Ò»¸ö¼òµ¥µÄʼþ¿ò¼Ü¡£Õâ¸ö¿ò¼Ü°üº¬Ò»¸ö¸ºÔð×¢²áºÍ×¢ÏúʼþµÄ¹ÜÀíÆ÷£¬¿ÉÒÔ½ÓÊÕʼþ£¬ºÍ¸ºÔð·ÓÐͬ²½ºÍÒì²½ÏûÏ¢µ½ËûÃÇÏàÓ¦µÄ·þÎñ¡£
MuleµÄÐéÄâ»úÐÒéÒªÇóÓÐÒ»¸ö·ÅÖÃʼþ¹ÜÀíÆ÷¹¤×÷Ŀ¼META-INF/services/org/mule/providers/vm·¾¶ÏµĿÉÅäÖÆÎļþ£¬ÅäÖÆÎļþΪÐÒ鶨ÒåÁË´óÁ¿µÄ×é¼þ£¬ÀýÈçÁ¬½ÓÆ÷ºÍµ÷¶È¹¤³§¡£ÅäÖÆÎļþµÄÄÚÈÝÈçÏ£º
connector=org.mule.providers.vm.VMConnector
dispatcher.factory=org.mule.providers.vm.VMMessageDispatcherFactory
message.receiver=org.mule.providers.vm.VMMessageReceiver
message.adapter=org.mule.providers.vm.VMMessageAdapter
endpoint.builder=org.mule.impl.endpoint.ResourceNameEndpointBuilder
Ò»¸ö¼òµ¥µÄ½è¿Ú¶¨ÒåÁËʼþ¹ÜÀíÆ÷µÄ¹«Óнṹ£º
package com.jeffhanson.mule;
import org.mule.umo.FutureMessageResult;
public interface EventManager
{
/**
* Sends an event message synchronously to a given service.
*
* @param serviceName The name of the service to which the event
* message is to be sent.
* @param payload The content of the event message.
* @return Object The result, if any.
* @throws EventException on error
*/
public Object sendSynchronousEvent(String serviceName,
Object payload)
throws EventException;
/**
* Sends an event message asynchronously to a given service.
*
* @param serviceName The name of the service to which the event
* message is to be sent.
* @param payload The content of the event message.
* @return FutureMessageResult The result, if any.
* @throws EventException on error
*/
public FutureMessageResult sendAsynchronousEvent(String serviceName,
Object payload)
throws EventException;
/**
* Starts this event manager.
*/
public void start();
/**
* Stops this event manager.
*/
public void stop();
/**
* Retrieves the protocol this event manager uses.
* @return
*/
public String getProtocol();
/**
* Registers a service to receive event messages.
*
* @param serviceName The name to associate with the service.
* @param implementation Either a container reference to the service
* or a fully-qualified class name.
*/
public void registerService(String serviceName,
String implementation)
throws EventException;
/**
* Unregisters a service from receiving event messages.
*
* @param serviceName The name associated with the service to unregister.
*/
public void unregisterService(String serviceName)
throws EventException;
}
ʼþ¹ÜÀíÆ÷ÀàÊDZ»·â×°ÔÚÒ»¸ö¹¤³§ÀàÀÒò´Ë£¬¿ÉÒÔÒÀ¾ÝÐèҪȥ¸Ä±äËüµÄʵÏÖ¶ø²»»áÓ°Ïìµ½ËüµÄ¿Í»§¶Ë¡£Ê¼þ¹ÜÀíÆ÷ʵÏÖÈçÏ£º
package com.jeffhanson.mule;
import org.mule.umo.*;
import org.mule.extras.client.MuleClient;
import org.mule.impl.endpoint.MuleEndpoint;
import org.mule.config.QuickConfigurationBuilder;
import java.util.HashMap;
import java.util.Map;
public class EventManagerFactory
{
private static HashMap instances = new HashMap();
/**
* Retrieves the event manager instance for a given protocol.
*
* @param protocol The protocol to use.
* @return EventManager The event manager instance.
*/
public static EventManager getInstance(String protocol)
{
EventManager instance = (EventManager)instances.get(protocol);
if (instance == null)
{
instance = new EventManagerImpl(protocol);
instances.put(protocol, instance);
}
return instance;
}
/**
* A concrete implementation for a simple event manager.
*/
private static class EventManagerImpl
implements EventManager
{
private UMOManager manager = null;
private QuickConfigurationBuilder builder = null;
private MuleClient eventClient = null;
private String protocol = null;
private MuleEndpoint receiveEndpoint = null;
private MuleEndpoint sendEndpoint = null;
private EventManagerImpl(String protocol)
{
this.protocol = protocol;
}
/**
* Starts this event manager.
*/
public void start()
{
try
{
builder = new QuickConfigurationBuilder();
manager = builder.createStartedManager(true,
protocol + "tmp/events");
eventClient = new MuleClient();
receiveEndpoint = new MuleEndpoint(protocol
+ "tmp/events/receive");
sendEndpoint = new MuleEndpoint(protocol + "tmp/events/send");
}
catch (UMOException e)
{
System.err.println(e);
}
}
/**
* Stops this event manager.
*/
public void stop()
{
try
{
manager.stop();
}
catch (UMOException e)
{
System.err.println(e);
}
}
/**
* Retrieves the protocol this event manager uses.
* @return
*/
public String getProtocol()
{
return protocol;
}
/**
* Registers a service to receive event messages.
*
* @param serviceName The name to associate with the service.
* @param implementation Either a container reference to the service
* or a fully-qualified class name
* to use as the component implementation.
*/
public void registerService(String serviceName,
String implementation)
throws EventException
{
if (!manager.getModel().isComponentRegistered(serviceName))
{
try
{
builder.registerComponent(implementation,
serviceName,
receiveEndpoint,
sendEndpoint);
}
catch (UMOException e)
{
throw new EventException(e.toString());
}
}
}
/**
* Unregisters a service from receiving event messages.
*
* @param serviceName The name associated with the service to unregister.
*/
public void unregisterService(String serviceName)
throws EventException
{
try
{
builder.unregisterComponent(serviceName);
}
catch (UMOException e)
{
throw new EventException(e.toString());
}
}
/**
* Sends an event message synchronously to a given service.
*
* @param serviceName The name of the service to which the event
* message is to be sent.
* @param payload The content of the event message
* @return Object The result, if any.
* @throws EventException on error
*/
public Object sendSynchronousEvent(String serviceName,
Object payload)
throws EventException
{
try
{
if (!manager.getModel().isComponentRegistered(serviceName))
{
throw new EventException("Service: " + serviceName
+ " is not registered.");
}
String transformers = null;
Map messageProperties = null;
UMOMessage result = eventClient.sendDirect(serviceName,
transformers,
payload,
messageProperties);
if (result == null)
{
return null;
}
return result.getPayload();
}
catch (UMOException e)
{
throw new EventException(e.toString());
}
catch (Exception e)
{
throw new EventException(e.toString());
}
}
/**
* Sends an event message asynchronously.
*
* @param serviceName The name of the service to which the event
* message is to be sent.
* @param payload The content of the event message.
* @return FutureMessageResult The result, if any
* @throws EventException on error
*/
public FutureMessageResult sendAsynchronousEvent(String serviceName,
Object payload)
throws EventException
{
FutureMessageResult result = null;
try
{
if (!manager.getModel().isComponentRegistered(serviceName))
{
throw new EventException("Service: " + serviceName
+ " is not registered.");
}
String transformers = null;
Map messageProperties = null;
result = eventClient.sendDirectAsync(serviceName,
transformers,
payload,
messageProperties);
}
catch (UMOException e)
{
throw new EventException(e.toString());
}
return result;
}
}
}
Mule¿ò¼ÜÒÀ¾ÝÏûÏ¢ÓÐÐ§ÔØºÉµÄÀàÐÍÀ´ÅÉDzÏûÏ¢¡£Ê¼þ¿ò¼ÜʹÓûùÓÚÓÐÐ§ÔØºÉµÄÅÉDz»úÖÆ£¬ÕâÖÖÅÉDz»úÖÆ°Ñ×¢²áµ½Ê¼þ¹ÜÀíÆ÷ÖÐÒ»°ã¶¨ÒåµÄʼþ·½·¨×÷Ϊʼþ½ÓÊÕÆ÷¡£ÏÂÃæµÄÀඨÒåÁËÒ»¸ö°üº¬Èý¸öÖØÔØµÄreceiveEvent£¨£©·½·¨µÄ·þÎñ£º
package com.jeffhanson.mule;
import java.util.Date;
public class TestService
{
public void receiveEvent(String eventMessage)
{
System.out.println("\n\nTestService.receiveEvent(String) received "
+ "event message: " + eventMessage + "\n\n");
}
public void receiveEvent(Integer eventMessage)
{
System.out.println("\n\nTestService.receiveEvent(Integer) received "
+"event message: " + eventMessage + "\n\n");
}
public void receiveEvent(Date eventMessage)
{
System.out.println("\n\nTestService.receiveEvent(Date) received "
+ "event message: " + eventMessage + "\n\n");
}
}
ʼþ¹ÜÀíÆ÷¿Í»§¶ËÓ¦ÓóÌÐò·¢ËÍÈý¸öʼþµ½²âÊÔ·þÎñÖУ¬È¥²âÊÔÿһ¸öreceiveEvent£¨£©·½·¨¡£¿Í»§¶ËÓ¦ÓóÌÐòÈçÏ£º
package com.jeffhanson.mule;
import org.apache.log4j.Logger;
import org.apache.log4j.Level;
import org.apache.log4j.BasicConfigurator;
import java.util.Date;
public class EventClient
{
static Logger logger = Logger.getLogger(EventClient.class);
public static void main(String[] args)
{
// Set up a simple configuration that logs on the console.
BasicConfigurator.configure();
logger.setLevel(Level.ALL);
try
{
EventManager eventManager =
EventManagerFactory.getInstance("vm://");
eventManager.start();
String serviceName = TestService.class.getName();
String implementation = serviceName;
eventManager.registerService(serviceName, implementation);
Object result =
eventManager.sendSynchronousEvent(serviceName, "A test message");
if (result != null)
{
System.out.println("Event result: " + result.toString());
}
result =
eventManager.sendSynchronousEvent(serviceName, new Integer(23456));
if (result != null)
{
System.out.println("Event result: " + result.toString());
}
result =
eventManager.sendSynchronousEvent(serviceName, new Date());
if (result != null)
{
System.out.println("Event result: " + result.toString());
}
eventManager.stop();
}
catch (EventException e)
{
System.err.println(e.toString());
}
}
}
Muleƽ̨¼ò»¯ºÍ³éÏóÁËÇ°ÃæËùÐðÊö¿ò¼ÜµÄʼþ·½ÃæµÄ´¦Àí£¬Ê¹µÃÄã·¢ËͺͽÓÊÕ´©Ô½Ò»¸ö²ã¼¶½á¹¹µÄͬ²½ºÍÒì²½ÏûϢʱ£¬²»ÐèÒªÖªµÀϲãϵͳµÄϸ½Ú¡£¹¤³§Ä£Ê½ºÍSOA×¼ÔòµÄÓ¦Óã¬ÔòʹµÃÕâ¸ö¿ò¼ÜÓÐÁËÒ»¸öËÉÉ¢ñîºÏºÍ¿ÉÀ©Õ¹µÄÉè¼Æ¡£
×ܽá
µ±·þÎñºÍ½ø³ÌÐèÒª´©Ô½¶à²ã½á¹¹£¬Ê¹ÓöàÖÖÐÒéÈ¥½»»¥Ê±£¬Éè¼ÆÒ»¸öÓÐЧµØÊ¼þÇý¶¯µÄÈí¼þϵͳ¿ÉÄܱäµÃ¸´ÔÓÁË¡£¿ÉÊÇ£¬Ò»¸öʹÓñê׼ģʽ°üº¬Êʵ±Ê¼þ¹ÜÀí²ãµÄÃæÏò·þÎñ¼Ü¹¹ÄܼõÉÙ£¬ÉõÖÁÏû³ýÕâЩÎÊÌâ¡£
Mule ƽ̨ÌṩAPI£¬×é¼þºÍ³éÏó¶ÔÏó£¬ÕâЩ¶¼¿ÉÒÔÓÃÓÚÈ¥½¨Á¢Ò»¸öÇ¿´ó£¬½¡×³£¬Ê¼þÇý¶¯µÄÓÐ×ÅÁ¼ºÃµÄÉìËõÐԺͿÉά»¤ÐÔµÄϵͳ¡£
¹ØÓÚ×÷Õß
Jeff Hanson ÓÐ×Å18ÄêµÄÈí¼þÐÐÒµ´ÓÒµ¾Ñé£¬Ôø¾×÷Ϊ¸ß¼¶Èí¼þ¹¤³Ìʦ¹¤×÷ÓÚWindows OpenDocÏîÄ¿£¬×÷ΪÖ÷¹Ü¼Ü¹¹Ê¦ÔÚNovellµÄRoute66¿ò¼Ü¹¤×÷¡£ÏÖÔÚ£¬×÷ΪeReinsure.comµÄÊ×ϯ¼Ü¹¹Ê¦£¬ÕýÔÚ¹¹½¨Web·þÎñ¿ò¼ÜºÍ»ùÓÚJ2EEÔÙ±£ÏÕÆ½Ì¨¡£HansonÒѾд×÷ÁË´óÁ¿µÄÎÄÕºÍÊé¼®£¬°üÀ¨£º¡¶Pro JMX: Java Management Extensions¡·(Apress³ö°æÉç,2003Äê11ÔÂ; ISBN: 1590591011)ºÍ¡¶Web Services Business Strategies and Architectures¡·(Wrox ³ö°æÉç,2002Äê8ÔÂ; ISBN: 1904284132)
×ÊÔ´
·javaworld.com:javaworld.com
·Matrix-Java¿ª·¢ÕßÉçÇø:http://www.matrix.org.cn/
·MuleÖ÷Ò³: http://wiki.muleumo.org/display/MULEPROJ/Home
·Mule FAQ: http://wiki.muleumo.org/display/MULE/Mule+FAQ