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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
ʹÓà Apache Geronimo ºÍ JMS ¹¹½¨Ê¼þÇý¶¯µÄ¿ò¼Ü
 
  2158  次浏览      28
 2017-12-19 
 
±à¼­ÍƼö:

±¾ÎÄÀ´×ÔÓÚIBM£¬±¾ÎĽéÉÜÁË Apache Geronimo ¿ò¼ÜÖвÉÓõļ¼ÊõºÍ»úÖÆ£¬ËüÃÇʹӦÓóÌÐòºÍ·þÎñÄܹ»ÓÐЧµØÏìӦʵʱ´Ì¼¤£¬È»ºó¿ç¼Ü¹¹ÐéÄâ²ã·¢ËͺͽÓÊÕʼþ¡£

µ±ÊµÊ±¸ü¸ÄºÍʼþ·¢Éúʱ£¬¶ÔÆä×÷³öÏìÓ¦ÊÇÆóÒµ¿ò¼ÜµÄÖØÒªÐèÇó¡£

¿ª·¢ÈËÔ±ÊÔͼʹÓô«Í³Ë³Ðò´¦Àí·½·¨Éè¼ÆºÍ¹¹½¨¶¯Ì¬¹¤×÷Á÷ºÍ¼¯³Éϵͳʱ»áÓöµ½Âé·³£¬Òò´Ë£¬¼±Ðè¸üÊʺϵġ¢Ê¼þ¸ÐÖªµÄ¼¼ÊõºÍ¹¤¾ß¡£SOA ºÍʼþÇý¶¯µÄ±à³Ì¿ÉÒÔ½â¾öÕâÒ»¸´ÔÓµÄÄÑÌâ¡£

SOA ¸ø³öÒ»¸öËÉÉ¢ñîºÏµÄ¿ª·¢Ä£ÐͺÍÔËÐÐʱ»·¾³¡£Ëüʹ·þÎñÌṩÕߺͷþÎñÏû·ÑÕßÄܹ»Ê¹Óö¯Ì¬×é¼þ½»»¥À´¹¹½¨½»»¥Ä£ÐÍ£¬ÕâЩ½»»¥Ä£ÐÍÄܹ»ÀûÓøÿª·¢Ä£ÐÍÁé»îÐÔºÍÇ¿´ó¹¦ÄÜ¡£Ê¼þÇý¶¯µÄ½»»¥Ä£Ðͱȴ«Í³Í¬²½»úÖÆÄܸü¼°Ê±µØ¶Ô¶¯Ì¬Ê¼þ×÷³öÏìÓ¦£¬²¿·ÖÔ­ÒòÊÇ SOA ÖÐʼþÇý¶¯µÄ±à³ÌÀûÓ÷ֲ¼Ê½ÏµÍ³±¾ÉíÐèÒªµÄÐí¶àÏàÍ¬ÌØÐÔ£¬°üÀ¨×¨ÃÅ»¯¡¢Ä£¿é»¯ºÍÊÊÓ¦ÐÔ¡£

ʼþÇý¶¯µÄ¼Ü¹¹

2003 Ä꣬Gartner Group ÒýÈëʼþÇý¶¯µÄ¼Ü¹¹ (EDA) ×÷ΪһÖÖ¹¹½¨ÏµÍ³¡¢·þÎñºÍÓ¦ÓóÌÐòµÄ·½·¨£¬ÔÚÕâЩËù¹¹½¨µÄ¶«Î÷ÖУ¬Ê¼þÔÚËÉÉ¢ñîºÏµÄʼþ½ÓÊÕÕßÖ®¼ä·ÓÉ¡£Ê¼þÇý¶¯µÄϵͳÓÉʼþÉú²úÕß ºÍʼþ½ÓÊÕÕß ×é³É¡£Ê¼þÉú²úÕß¿ÉÒÔ½«Ê¼þ·¢²¼µ½Ê¼þͨµÀ£¬ºóÕß¿ÉÒÔ½«Ê¼þ·Ö·¢µ½¶©ÔÄʼþµÄ½ÓÊÕÕß¡£ ÓëÉú²úÕß·¢²¼Ê¼þÒ»Ñù£¬Ê¼þͨµÀ½«Ê¼þת·¢¸ø½ÓÊÕÕß¡£Èç¹ûûÓпÉÓõĽÓÊÕÕߣ¬Ê¼þͨµÀ»á½«Ê¼þ´æ´¢ÆðÀ´£¬È»ºó½«Æäת·¢µ½ÉÔºó¿ÉÓõĽÓÊÕÕß¡£´Ë¹ý³Ì³ÆÎª´æ´¢ºÍת·¢¡£

EDA ʹÓô«µÝÏûÏ¢¸ÅÄî×÷ΪÁ½¸ö»ò¶à¸öʵÌåÖ®¼ä½»»¥µÄ·½·¨¡£Í¨¹ý´¥·¢¶ÔÓ¦ÓÚijЩҵÎñÁìÓòʼþµÄÐźźÍÏûÏ¢£¬À´Æô¶¯½»»¥¡£µ±Ã¿¸ö¸ø¶¨Ê¼þ·¢Éúʱ£¬»á֪ͨ¸ÃʼþµÄËùÓж©ÔÄÕß¡£È»ºó¶©ÔÄÕß¿ÉÒÔ¶Ôʼþ²ÉÈ¡Ðж¯¡£

EDA ÊÜÒæÓÚÒÔÏÂÊôÐÔ£º

ÎÞñîºÏµÄ¹ØÁª£ºÊ¼þ·¢²¼ÕߺÍʼþ¶©ÔÄÕßÔ¤ÏÈÎÞÐèÖªµÀ±Ë´ËµÄ´æÔÚ¡£

¶à¶Ô¶àµÄ½»»¥£ºÒ»¸ö»ò¶à¸öʼþ»áÓ°ÏìÒ»¸ö»ò¶à¸ö¶©ÔÄÕß¡£

»ùÓÚʼþµÄ¿ØÖÆÁ÷³Ì£ºµ±Ó¦ÓóÌÐòÏìÓ¦·¢ÉúµÄʼþʱ£¬Ó¦ÓóÌÐòÁ÷³Ì·Ç³£×ÔÈ»¡£

Òì²½ÏûÏ¢´«µÝ£ºÒµÎñÂß¼­¿ÉÒÔËæÊ¼þͬʱ·¢Éú¡£

ͨ¹ýÎ§ÈÆ EDA ¹¹½¨Ó¦ÓóÌÐòºÍϵͳ£¬Äú¿ÉÒÔÓÃʹÆä¸ü¾ßÏìÓ¦ÐԵķ½Ê½¹¹½¨ËüÃÇ£¬ÒòΪͨ¹ýÉè¼Æ£¬Ê¼þÇý¶¯ÏµÍ³¸üÊÊÓÃÓÚ²»¿ÉÔ¤ÖªÇÒ²»¶Ï¸ü¸ÄµÄ»·¾³¡£

ʼþÇý¶¯Éè¼ÆºÍ¿ª·¢µÄÓŵã

ʼþÇý¶¯µÄ±à³ÌÓÐÐí¶àÓŵ㡣ÀýÈ磬´ËÀà±à³Ì¿ÉÒÔ£º

¼õÉÙ¿ª·¢ºÍά»¤·Ö²¼Ê½ÏµÍ³µÄ¸´ÔÓÐÔ¡£

ʹµÃÓ¦ÓóÌÐòºÍ·þÎñµÄ×°ÅäºÍÅäÖøü¼ÓÈÝÒ×Çҳɱ¾¸üµÍ¡£

´Ù½øÔ´´úÂëºÍ×é¼þÖØÓ㬴Ӷø¼õÉÙ bug ²¢´Ù½øÃô½ÝµÄ¿ª·¢ºÍ²¿Êð¡£

¶ÌÆÚÄÚ£¬Ê¼þÇý¶¯µÄÉè¼ÆºÍ¿ª·¢ÔÊÐí¸ü¼Ó¿ìËÙ¡¢ÈÝÒ׵͍֯¡£³¤ÆÚÄÚ£¬ÏµÍ³×´Ì¬¸ü¼Ó¾«È·¡£

EDA ºÍ SOA µÄ½áºÏ

Óë˳Ðòʽ»ò¹ý³ÌʽϵͳÖпͻ§»ú±ØÐëÂÖѯ¸ü¸ÄÇëÇó²»Í¬£¬EDA ÔÊÐíϵͳºÍ×é¼þÔÚʼþ·¢Éúʱʵʱ¶¯Ì¬µØ×÷³öÏìÓ¦¡£EDA ͨ¹ýÒýÈ볤ʱ¼äÔËÐеĴ¦Àí¹¦ÄÜÀ´ÃÖ²¹ SOA µÄ²»×ã¡£ÒòΪʼþÏû·ÑÕßÔÚʼþ·¢Éúʱ½ÓÊÕʼþ£¬²¢ÇÒ»áµ÷ÓÃËÉÉ¢ñîºÏµÄ·þÎñÀ´Ïò¿Í»§Ìṩ¸ü¼°Ê±¸ü¾«È·µÄÊý¾Ý£¬ËùÒÔ¶ÔÒµÎñÓÐÒæ¡£

ÔÚ EDA ÄÚ²¿£¬Äú¿ÉÒÔ¿ç SOA µÄ¸÷¸ö·Ö¶Î£¨°üÀ¨ÎïÀí²ãºÍ¼Ü¹¹µÄÐéÄâ²ã£©´«Êäʼþ£¬ÕâÑùϵͳ¿ÉÒÔÓÐЧµØ×÷³öÏìÓ¦¡£Í¼ 1 ˵Ã÷ÁË¿ç¼Ü¹¹¶ÑÕ»¸÷²ã´«²¥µÄʼþ¡£

ͼ 1. ¿çÐéÄâ²ãµÄ´«²¥

¿çÐéÄâ²ãµÄ´«²¥

ÕýÈçÄú¿´µ½µÄ£¬Ê¼þ¿ÉÒÔÒòÓ¦ÓóÌÐò¡¢ÒµÎñ¡¢×é¼þ¡¢Æ½Ì¨»òϵͳ²ãµÄÈκθü¸Ä¶ø·¢Éú£¬´Ó¼¼Êõ¹ÛµãÉϽ²£¬ÒµÎñʼþµÄ¼¶±ð×ÔȻҪ±Èϵͳʼþ»ò×é¼þʼþ¸ß¡£

ʼþµÄÔ­Òò£¨Ê¼þÒò¹û¹ØÏµ£©ÊÇÀí½â¸ÃʼþµÄÖØÒªÒòËØ¡£Ê¼þÒò¹û¹ØÏµ¿É·ÖΪˮƽÒò¹û¹ØÏµ ºÍ´¹Ö±Òò¹û¹ØÏµ¡£µ±Ê¼þ·¢²¼ÕßÓëʼþ½ÓÊÕÕßλÓڼܹ¹ÐéÄâ²ãÖеÄͬһ²ãʱ£¬·¢ÉúˮƽÒò¹û¹ØÏµ¡£µ±Ê¼þ·¢²¼ÕßÓëʼþ½ÓÊÕÕßλÓÚ²»Í¬²ãʱ£¬·¢Éú´¹Ö±Òò¹û¹ØÏµ¡£

EDA ºÍʼþ¶ÓÁÐ

ʼþÇý¶¯µÄ±à³ÌÊÇÎ§ÈÆÊ¼þÉú²úÕߺÍʼþÏû·ÑÕßÖ®¼äµÄÎÞñîºÏ¹ØÏµµÄ¸ÅÄî¹¹ÔìµÄ¡£Ò²¾ÍÊÇ˵£¬Ê¼þÏû·ÑÕß²»¹ØÐÄʼþ·¢ÉúµÄµØµã»òÔ­Òò£»¶øÊǹØ×¢Ê¼þ·¢ÉúºóËü£¨Ïû·ÑÕߣ©½«±»µ÷Ó᣽«Ê¼þÉú²úÕßÓëʼþÏû·ÑÕ߸ôÀ뿪À´µÄϵͳºÍÓ¦ÓóÌÐòͨ³£ÒÀÀµÓÚʼþ·ÖÅäÆ÷»òͨµÀ¡£´ËͨµÀ°üº¬Ê¼þ¶ÓÁУ¬ÓÃ×÷ʼþÉú²úÕߺÍʼþ´¦Àí³ÌÐòÖ®¼äµÄÖмä²ã¡£

ͼ 2 ˵Ã÷ÁËÉú²úÕß¡¢Ïû·ÑÕß¡¢Ê¼þͨµÀºÍÖ÷Ì⣨»ò¶ÓÁУ©Ö®¼äµÄ¹ØÏµ¡£

ͼ 2. ʼþ¶ÓÁÐ

ʼþ¶ÓÁеĽÇÉ«ÊÇ´æ´¢´ÓÉú²úÕß½ÓÊÕµÄʼþ£¬²¢ÔÚÿ¸öÏû·ÑÕß¿ÉÓÃʱ½«ÕâЩʼþ´«Ê䏸Ïû·ÑÕß ¡ª¡ª ͨ³£ÊÇΪÁËʼþ±»½ÓÊÕ¡£

ʼþ¶ÓÁкÍÖ÷Ìâ

¶àÊýʼþÇý¶¯µÄϵͳÒÀÀµÓÚÔ¤Ïȹ¹½¨µÄʼþ¶ÓÁм¼Êõ£¬ÈçÃæÏòÏûÏ¢µÄÖмä¼þ£¨Message-Oriented Middleware£¬MOM£©¿ò¼Ü¡£MOM ÊÇÒ»ÖÖ»ùÓÚÏûÏ¢¶ÓÁеÄÒì²½ÏûϢģÐÍ¿ò¼Ü¡£

MOM ¿ò¼ÜµÄÖ÷ÒªÓŵãÊÇËüÄܹ»ÎÞÏÞÆÚµØ´æ´¢ÏûÏ¢£¬²¢ÔÚÏû·ÑÕß×¼±¸½ÓÊÕÏûϢʱ£¬½«Æä·Óɵ½Ïû·ÑÕß¡£MOM °´ÕÕÒÔÏÂÏûϢģÐ͹¤×÷£º

µã¶Ôµã£º´ËÄ£ÐÍ»ùÓÚ³ÆÎª¶ÓÁÐ µÄÏûÏ¢¿â£¬ÔÚ¸ÃÄ£ÐÍÖУ¬¿ÉÒÔ½«ÏûÏ¢´ÓÒ»¸ö»ò¶à¸öÉú²úÕß·¢Ë͸øµ¥¸öÏû·ÑÕß¡£

·¢²¼/¶©ÔÄ£º´ËÄ£ÐÍ»ùÓÚ³ÆÎªÖ÷Ìâ µÄÏûÏ¢¿â£¬ÔÚ¸ÃÄ£ÐÍÖУ¬¿ÉÒÔ½«ÏûÏ¢´ÓÒ»¸ö»ò¶à¸öÉú²úÕß·¢²¼¸øÒ»¸ö»ò¶à¸öÒѶ©ÔĵÄÏû·ÑÕß¡£

ͼ 3 ˵Ã÷ÁËÒ»¸ö·¢²¼Õß¡¢Ê¼þͨµÀ¡¢Ö÷ÌâºÍ¶à¸ö¶©ÔÄÁ˸ø¶¨ÏûÏ¢ÀàÐ͵ÄÏû·ÑÕßÖ®¼äµÄ½»»¥¡£

ͼ 3. Ò»¸ö·¢²¼Õß¡¢¶à¸ö¶©ÔÄÕß¡¢Ê¼þͨµÀºÍÖ÷ÌâÖ®¼äµÄ½»»¥

Java ÏûÏ¢·þÎñ (JMS) ¿ò¼ÜÊÇ Java Ó¦ÓóÌÐò±à³Ì½Ó¿Ú (API) ÔÚ MOM Ä£ÐÍÉϵijéÏó¡£

ÔÚ EDA ÖÐʹÓà JMS

Java ¼¼ÊõΪ Java ³ÌÐòÌṩ JMS ×÷ΪһÖÖÆÕͨ·½·¨£¬ÓÃÓÚ´´½¨¡¢·¢ËÍ¡¢½ÓÊպͶÁÈ¡ÏûÏ¢¡£JMS ÊÇ´ó¶àÊýÏûÏ¢´«µÝϵͳÖеij£¼û¸ÅÄîºÍÓïÒåµÄ½Ó¿ÚºÍÀà³éÏóµÄ¿ò¼Ü¡£

ͨ¹ý JMS ½Ó¿Ú£¬ÏûÏ¢Éú²úÕߺÍÏû·ÑÕßÄܹ»ÒÔµã¶Ôµã»ò·¢²¼/¶©ÔÄÄ£ÐÍ·¢ËͺͽÓÊÕÏûÏ¢¡£ÏÂÃæµÄÁбíÏÔʾÁË JMS ÖеÄÖ÷Òª×é¼þ£º

ConnectionFactory£º¸Ã¶ÔÏóÓÃÓÚ´´½¨ JMS Á¬½Ó

Connection£ºÕâÊǵ½ JMS ϵͳµÄÁ¬½Ó

Destination£ºÏûÏ¢Ö÷Ìâ»òÏûÏ¢¶ÓÁеijéÏó

Session£º·¢ËÍ»ò½ÓÊÕÏûÏ¢ËùÔÚµÄÉÏÏÂÎÄ

MessageProducer£º»á»°´´½¨µÄ×é¼þ£¬ÓÃÓÚ½«ÏûÏ¢·¢Ë͵½Ä¿µÄµØ

MessageConsumer£º»á»°´´½¨µÄ×é¼þ£¬ÓÃÓÚ´ÓÄ¿µÄµØ½ÓÊÕÏûÏ¢

ʹÓà Geronimo ºÍ JMS µÄ¼òµ¥Ê¼þ¿ò¼Ü

Apache Geronimo Óë Active MQ ¿ª·ÅÔ´ÂëÏûÏ¢Ìṩ³ÌÐò°ó¶¨ÔÚÒ»Æð¡£Active MQ Ö§³Ö JMS£¬Òò´ËÎªÎ§ÈÆ Geronimo ¿ò¼Ü¹¹½¨µÄÓ¦ÓóÌÐòÌṩһÖÖ·½·¨À´ÒÔ³ä·ÖÀûÓà JMS µÄÏûÏ¢´«µÝ¹¦ÄÜ¡£

ÒÔϸ÷½Ú¶¨ÒåÁËʹÓà Geronimo¡¢Active MQ ºÍ JMS µÄ¸ÅÄîºÍÓïÒå¹¹½¨µÄ¼òµ¥Ê¼þ¿ò¼Ü¡£ÔÚÕâЩС½ÚÖж¨ÒåµÄʼþ¿ò¼Ü°üÀ¨Ê¼þͨµÀ¡¢Ê¼þ·¢²¼ÕߺÍʼþ½ÓÊÕÕß¡£Ê¼þͨµÀ¸ºÔð×¢²áºÍÈ¡Ïû×¢²áʼþ½ÓÊÕÕߣ¬²¢¸ºÔð½«Ê¼þÏûÏ¢´Óʼþ·¢²¼ÕßÒÔÄäÃû·½Ê½Â·Óɵ½Ê¼þ½ÓÊÕÕß¡£´Ë¿ò¼Ü¸ø³öµÄΩһ¸ÅÄîÊÇʼþͨµÀ¹¦ÄÜ£¬¼´¸ù¾Ýʼþ¶ÔÏóʵÏÖµÄ Java Àà»ò½Ó¿ÚµÄÀàÐÍ£¬À´¹ýÂËÏûÏ¢£¬²¢½«ÏûϢ·Óɵ½Êʵ±µÄ½ÓÊÕÕß¡£

ʹÓÃÀà/½Ó¿Ú²ã´Î½á¹¹¹ýÂ˲¢Â·ÓÉʼþ

µäÐ͵ÄÏûÏ¢´«µÝϵͳÔÊÐíÏûÏ¢¶©ÔÄÕ߸ù¾ÝµãºÅ·Ö¸ôµÄ×Ö·û´®£¨Èç travel.flights.seats »ò travel.lodging.rates £©À´¶¨Ò彫½ÓÊÕµÄʼþÀàÐÍ¡£±¾ÎÄÖиø³öµÄʼþ¿ò¼Ü»¹ÔÊÐí¶©ÔÄÕß¶©ÔÄÌØ¶¨ÀàÐ͵Äʼþ£»²»¹ý£¬¸ÃʼþÀàÐÍÓÉ Java ÀàºÍ½Ó¿ÚµÄ²ã´Î½á¹¹¶¨Òå¡£

ʼþ¿ò¼Ü¿ÉÒÔ±íʾΪµãºÅ·Ö¸ôµÄÏûÏ¢ÀàÐͲã´Î½á¹¹£¬Èç ͼ 4 ËùʾµÄÀà²ã´Î½á¹¹¡£

ͼ 4. ʼþÓ¦ÓóÌÐòÀà¹ØÏµ

¸ù¾Ý´Ëͼ±í£¬¶©ÔÄ Event ½Ó¿ÚËù´ú±íµÄʼþµÄʼþ½ÓÊÕÕß½«½ÓÊÕËùÓÐʼþ£¬¶ø¶©ÔÄ FlightEvent ½Ó¿ÚËù´ú±íµÄʼþµÄʼþ½ÓÊÕÕß½«Ö»½ÓÊÕ»ùÓڸýӿڻò FlightDelayed Àà»ò SeatAvailable ÀàµÄʼþ¡£´ËÉè¼ÆÔÊÐíʼþ½ÓÊÕÕßÒ»´Î¶©ÔĶà¸öʼþÀàÐÍ¡£ÀýÈ磬ʼþ½ÓÊÕÕßͨ¹ýʹÓòÎÊý Event.class µ÷ÓÃʼþͨµÀµÄ subscribe() ·½·¨£¬¿ÉÒÔ¶©ÔÄËùÓÐʼþ¡£Èç¹ûÌí¼ÓеÄʼþÀàÐÍ£¬Ôòʼþ½ÓÊÕÕß»áÔÚËüÃÇ·¢²¼Ê±×Ô¶¯½ÓÊÕËüÃÇ¡£

ʼþͨµÀͨ¹ýÈ·¶¨Ê¼þ½ÓÊÕÕß¶©ÔĵÄʼþ½Ó¿ÚµÄ×î¾ßÌåµÄ×ÓÀàÐÍ£¬À´´¦Àíʼþ²ã´Î½á¹¹¡£ÀýÈ磬Çåµ¥ 1 ËùʾµÄ FlightDelayed ÀàʵÏÖÁË FlightEvent ½Ó¿Ú£»Òò´Ë£¬Ê¼þͨµÀ½«Ê×ÏȲéÕÒ FlightDelayed ÀàµÄ¶©ÔÄÕߣ¬È»ºó²éÕÒ FlightEvent ½Ó¿ÚµÈ£¬Ò»Ö±ÑØ×ÅÀà/½Ó¿Ú²ã´Î½á¹¹ÏòÉÏ¡£

Çåµ¥ 1. FlightDelayed Àà

class TravelEvent extends Event {}
class FlightEvent extends TravelEvent {}
class LodgingEvent extends TravelEvent {}

public class FlightDelayed
implements FlightEvent
{
private String message = "";

public FlightDelayed()
{
}

public FlightDelayed(String message)
{
this.message = message;
}

public String getMessage()
{
return message;
}

public void setMessage(String message)
{
this.message = message;
}
}

ʼþͨµÀ

ʼþͨµÀ ÊÇʼþ·¢²¼ÕßÓÃÓÚ·¢²¼Ê¼þ£¬Ê¼þ½ÓÊÕÕßÓÃÓÚ¶©ÔĺͽÓÊÕʼþµÄ×é¼þ¡£¼òµ¥Ê¼þͨµÀµÄ½Ó¿ÚÈç Çåµ¥ 2 Ëùʾ¡£

Çåµ¥ 2. ¼òµ¥Ê¼þͨµÀµÄ½Ó¿Ú

public interface Channel
{
void start();

void stop();

void publish(final Event event);

void subscribe(final Receiver receiver,
final Class eventClass);

void unsubscribe(final Receiver receiver,
final Class eventClass);
}

Java ·´Éä

Java ÔËÐл·¾³ (JRE) ά»¤¹ØÓÚ java.lang.Class ÀàÖÐÿ¸öÀà»ò½Ó¿ÚµÄÐÅÏ¢¡£Class ¶ÔÏóµÄʵÀý¸ø³öÏêϸµÄ·½·¨Ç©Ãû¡¢×Ö¶ÎÀàÐÍ¡¢¹¹ÔìÆ÷Ç©Ãû¡¢ÐÞÊηûºÍ³£Á¿¡£

·´Éä API Javadoc£¨²Î¼û ²Î¿¼×ÊÁÏ£©¶¨ÒåÁË¿ª·¢ÈËÔ±ÈçºÎÒÔ±à³Ì·½Ê½ÔÚÔËÐÐʱ·¢ÏÖÓйØÀà¡¢½Ó¿Ú¡¢Êý×é¼°ÖîÈç´ËÀàµÄÐÅÏ¢¡£

×¢Ò⣬subscribe() ºÍ unsubscribe() ·½·¨ÐèÒªÒ»¸ö Class ÀàÐ͵IJÎÊý£¬Ê¼þͨµÀʹÓøòÎÊýÀ´È·¶¨½ÓÊÕÕß½«¶©ÔÄ»òÈ¡Ïû¶©ÔÄÄÄЩÀàÐ͵Äʼþ¡£

Ϊ±ÜÃâʼþ½ÓÊÕÕßÂÖѯʼþºÎʱ·¢Éú£¬¿ÉÒÔͨ¹ý Receiver ½Ó¿ÚµÄ receive() ·½·¨µ÷ÓÃʼþ½ÓÊÕÕß¡£Ã¿µ±½«Ê¼þ·¢²¼µ½Ê¼þͨµÀʱ£¬¶¼¿ÉÒÔʹÓà Java ·´ÉäÈ·¶¨ÄÄЩ¶©ÔÄÕß½«½ÓÊÕ¸Ãʼþ¡£È»ºóÔÚÕâЩ¶ÔÏóÉϵ÷Óà receive() ·½·¨¡£ Çåµ¥ 3 ÏÔʾÁËÒ»¸ö¼òµ¥Ê¼þ½ÓÊÕÕß¡£

Çåµ¥ 3. Ò»¸ö¼òµ¥Ê¼þ½ÓÊÕÕßµÄʵÏÖ

public class EventReceiver
implements Receiver
{
private static final transient Log log =
LogFactory.getLog(EventReceiver.class);

private String id = "";

public EventReceiver()
{
}

public EventReceiver(String id)
{
this.id = id;
}

public void setId(String id)
{
this.id = id;
}

public String getId()
{
return id;
}

public void receive(final Event event)
{
log.info("EventReceiver [" + id
+ "] received event [" + event.getMessage() + "]");
}
}

Çåµ¥ 4 ÏÔʾÁËʼþͨµÀµÄÒ»¸öժ¼¡£

Çåµ¥ 4. ʼþͨµÀµÄʵÏÖ

public class EventChannel
implements Channel
{
private static final String TOPIC_NAME =
"java:comp/env/EventTopic";

private static final String MQ_URL = "tcp://localhost:61616";

private HashMap subscribers = new HashMap();
private TopicConnectionFactory factory = null;
private Topic eventTopic = null;
private TopicConnection topicConn = null;
private TopicSession topicSess = null;
private TopicSubscriber topicSubscriber = null;
private TopicPublisher topicPublisher = null;
private EventConsumer eventConsumer = null;

private void handleEvent(Event event)
{
final Set received = new HashSet();

for (Class eventClass = event.getClass();
Event.class.isAssignableFrom(eventClass);
eventClass = eventClass.getSuperclass())
{
ArrayList receiverList = new ArrayList();
getReceiversForEvent (getEventLeafInterface(eventClass),
receiverList);
Receiver[] receivers = new Receiver[receiverList.size()];
receiverList.toArray(receivers);
for (int i = 0; i < receivers.length; i++)
{
invokeOnce(received, receivers[i], event);
}
}
}

private void invokeOnce(Set received,
Receiver receiver,
Event event)
{
received.add(receiver);
receiver.receive(event);
}

private Class getEventLeafInterface(Class cls)
{
Class retVal = null;

if (Event.class.isAssignableFrom(cls))
{
retVal = cls;
if (cls.isInterface())
{
return retVal;
}
}

Class[] interfaces = cls.getInterfaces();
if (interfaces != null)
{
for (int i = 0; i < interfaces.length; i++)
{
if (Event.class.isAssignableFrom(interfaces[i]))
{
retVal = interfaces[i];
break;
}
retVal = getEventLeafInterface(interfaces[i]);
}
}

return retVal;
}

public void start()
{
try
{
factory = new ActiveMQConnectionFactory(MQ_URL);
topicConn = factory.createTopicConnection();
topicSess =
topicConn.createTopicSession(false,
Session.AUTO_ACKNOWLEDGE);
eventTopic = topicSess.createTopic (TOPIC_NAME);
topicSubscriber = topicSess.createSubscriber (eventTopic);
topicPublisher = topicSess.createPublishe r(eventTopic);

eventConsumer = new EventConsumer(this);
Thread consumerThread = new Thread(eventConsumer);
consumerThread.setDaemon(false);
consumerThread.start();
}
catch (Exception e)
{
e.printStackTrace();
}
}

public void stop()
{
// close topic connections, sessions, consumers, etc.
}

public void publish(final Event event)
{
try
{
ObjectMessage eventMessage = topicSess.createObjectMessage();
eventMessage.setObject(event);

topicPublisher.publish(eventMessage);
}
catch (Exception e)
{
e.printStackTrace();
}
}

public void subscribe(final Receiver receiver,
final Class eventClass)
{
ArrayList receiverList = null;

Class leafCls = getEventLeafInterface(eventClass);

if (subscribers.get(leafCls) == null)
{
receiverList = new ArrayList();
subscribers.put(leafCls, receiverList);
}
else
{
receiverList = (ArrayList) subscribers.get(leafCls);
}

if (receiverList.indexOf(receiver) < 0)
{
receiverList.add(receiver);
}
}

public void unsubscribe (final Receiver receiver,
final Class eventClass)
{
Class leafCls = getEventLeafInterface(eventClass);
if (subscribers.get(leafCls) != null)
{
ArrayList receiverList = (ArrayList) subscribers.get(leafCls);
receiverList.remove(receiverList);
}
}
}

×¢Ò⣺EventChannel ÀàµÄÍêÕûÔ´´úÂë¿É´Ó±¾ÎÄĩβµÄ ÏÂÔØ ²¿·Öͨ¹ýÏÂÔØ»ñµÃ¡£

Çåµ¥ 5 ÏÔʾʼþÏû·ÑÕßµÄʵÏÖժ¼¡£

Çåµ¥ 5. ʼþÏû·ÑÕßµÄʵÏÖ

class EventConsumer
implements Runnable, ExceptionListener
{
private boolean running = false;
private boolean stopped = true;
private EventChannel eventChannel = null;

private EventConsumer(EventChannel eventChannel)
{
this.eventChannel = eventChannel;
}

public void run()
{
log.info("Event Consumer started");

// Create a Topic Connection, Session, and a MessageConsumer for the Topic
// loop until stopped and distribute events to the event channel
// using the handleEvent method
eventChannel.handleEvent(event);

stopped = true;

log.info("Event Consumer stopped");
}

public void shutdown()
{
running = false;

while (stopped == false)
{
Thread.yield();
}
}
}

×¢Ò⣺EventConsumer ÀàµÄÍêÕûÔ´´úÂë¿ÉÒÔ´Ó±¾ÎÄĩβµÄ ÏÂÔØ ²¿·Öͨ¹ýÏÂÔØ»ñµÃ¡£

ÔÚ Geronimo Öв¿ÊðºÍÔËÐÐʼþ¿ò¼Ü

ʼþ¿ò¼ÜʹÓò¿ÊðÔÚ Geronimo ÖÐµÄ Web Ó¦ÓóÌÐòÀ´²âÊÔÿ¸öʼþÀàÐÍ¡£³ýÁËʼþ¿ò¼ÜÍ⣬Web Ó¦ÓóÌÐò»¹°üÀ¨Ò»¸öÓÃÓÚÊäÈëʼþÏûÏ¢µÄ HTML ±íµ¥ºÍÒ»¸öÓÃÓÚ½ÓÊÕ HTTP ÇëÇó²¢½«ÄÚÈÝ·ÖÅɵ½Ê¼þͨµÀµÄ servlet¡£

HTML ±íµ¥£¨Èç ͼ 5 Ëùʾ£©Ö»ÔÊÐí½«ÈýÖÖÀàÐ͵ÄʼþÏûÏ¢·¢Ë͵½·ÖÅÉ servlet¡£

ͼ 5. Web Ó¦ÓóÌÐòµÄ¿ªÊ¼ÆÁÄ»

ʼþ·ÖÅÉ servlet ʵÀý»¯Ê¼þͨµÀ¶ÔÏóºÍÈý¸öʾÀýʼþ½ÓÊÕÕß¡£Ê¼þ½ÓÊÕÕßÈ»ºó¶©Ôĸø¶¨µÄʼþ£¬servlet ½«Ê¼þ·¢²¼¸øÊ¼þͨµÀ¶ÔÏó¡£Çåµ¥ 6 ÏÔʾÁ˸à servlet¡£

Çåµ¥ 6. ·ÖÅÉ servlet µÄʵÏÖ

public class SenderServlet extends HttpServlet
{
private EventChannel eventChannel = null;
private EventReceiver allTravelEventReceiver = null;
private EventReceiver flightEventReceiver = null;
private EventReceiver lodgingEventReceiver = null;

public void init()
throws ServletException
{
super.init();

eventChannel = new EventChannel();
eventChannel.start();

// create event receivers
allTravelEventReceiver =
new EventReceiver("allTravelEventReceiver");
flightEventReceiver =
new EventReceiver("flightEventReceiver");
lodgingEventReceiver =
new EventReceiver("lodgingEventReceiver");

// subscribe to all Travel events
eventChannel.subscribe (allTravelEventReceiver,
TravelEvent.class);

// subscribe to Flight events
eventChannel.subscribe (flightEventReceiver,
FlightEvent.class);

// subscribe to Lodging events
eventChannel.subscribe(lodgingEventReceiver,
LodgingEvent.class);
}

public void destroy()
{
super.destroy();

// unsubscribe all event receivers and stop the event channel
}

public void doGet (HttpServletRequest req, HttpServletResponse res)
throws IOException, ServletException
{
// respond with input form
}

public void doPost (HttpServletRequest req, HttpServletResponse res)
throws IOException, ServletException
{
String txtMsg = req.getParameter("txtMsg");
if (txtMsg != null && txtMsg.length() > 0)
{
String flightDelayed = req.getParameter ("FlightDelayed");
String rateIncreased = req.getParameter ("RateIncreased");
String seatAvailable = req.getParameter ("SeatAvailable");

if (flightDelayed != null)
{
// send a Flight event
eventChannel.publish(new FlightDelayed(txtMsg));
}
else if (rateIncreased != null)
{
// send a Lodging event
eventChannel.publish(new RateIncreased(txtMsg));
}
else if (seatAvailable != null)
{
// send a Flight event
eventChannel.publish(new SeatAvailable(txtMsg));
}
}

doGet(req, res);
}
}

×¢Ò⣺SenderServlet ÀàµÄÍêÕûÔ´´úÂë¿ÉÒÔ´Ó±¾ÎÄĩβµÄ ÏÂÔØ ²¿·Öͨ¹ýÏÂÔØ»ñµÃ¡£

ʼþ·ÖÅÉ servlet µ÷ÓõÄʼþ¿ò¼ÜµÄÓ¦ÓóÌÐòÁ÷³ÌÈç ͼ 6 Ëùʾ¡£

ͼ 6. ʼþ Web Ó¦ÓóÌÐòµÄ˳Ðò

²¿ÊðÓ¦ÓóÌÐò

ʼþ¿ò¼ÜµÄÀàºÍ Web Ó¦ÓóÌÐò´ò°üÔÚ .war ÎļþÖУ¬²¢·ÅÖÃÔÚ GERONIMO_HOME/deploy Ŀ¼Ï¡£¶ÔÓÚ´´½¨²¢¸´ÖƵ½ deploy Ŀ¼Ï嵀 .war Îļþ£¬Geronimo ÔÚÆô¶¯Ê±»á×Ô¶¯²¿ÊðËü¡£·ÅÖÃÔÚ deploy Ŀ¼ÏµÄÓ¦ÓóÌÐòÊÇÈȼÓÔØµÄ£¬µ±·¢Éú¸ü¸Äʱ£¬Geronimo Äܹ»ÔÚÔËÐÐÊ±ÖØÐ¼ÓÔØÓ¦ÓóÌÐò¡£Õâʹµ÷ÊÔÓ¦ÓóÌÐò±äµÃ·Ç³£±ãÀû¡£

ÔËÐÐÓ¦ÓóÌÐò

Äú¿ÉÒÔʹÓÃλÓÚ GERONIMO_HOME/bin Ŀ¼ÏÂµÄÆô¶¯½Å±¾£¨startup.bat »ò startup.sh£©Æô¶¯ Geronimo Ó¦Ó÷þÎñÆ÷¡£µ±µ÷Óà Geronimo Æô¶¯½Å±¾Ê±£¬»á³öÏÖ Geronimo ¿ØÖÆÌ¨´°¿Ú¡£¶ÔÓÚ²¿ÊðµÄʼþ¿ò¼ÜµÄ Web Ó¦ÓóÌÐò£¬Æô¶¯Ê±³öÏÖµÄ Geronimo ¿ØÖÆÌ¨´°¿Ú½«°üº¬ÀàËÆÓÚ Çåµ¥ 7 ËùʾµÄÐУ¬È·ÈÏ Web Ó¦ÓóÌÐòÒѳɹ¦Æô¶¯¡£

Çåµ¥ 7. Web Ó¦ÓóÌÐòµÄ³É¹¦Æô¶¯

00:12:33,921 INFO [EventChannel] Starting EventChannel...
00:12:33,937 INFO [EventChannel] Creating topic connection...
00:12:35,062 INFO [EventChannel] EventChannel started
00:12:35,062 INFO [EventChannel] Event Consumer started
00:12:35,093 INFO [SenderServlet] AllTravelEventReceiver
[com.jeffhanson.eda.EventReceiver@f84033]
00:12:35,093 INFO [SenderServlet] FlightEventReceiver
[com.jeffhanson.eda.EventReceiver@3ee73b]
00:12:35,093 INFO [SenderServlet] LodgingEventReceiver
[com.jeffhanson.eda.EventReceiver@16127f4]

½«Ê¼þ·¢Ë͸ø servlet ºó£¬servlet »á½«Ëü·¢²¼¸øÊ¼þͨµÀ¡£Èç¹û½«°üº¬Îı¾ Flight 2365 to Detroit will be delayed 15 minutes µÄ Flight-Delayed ÏûÏ¢·¢Ë͸ø servlet£¬Ôò Geronimo ¿ØÖÆÌ¨´°¿Ú»áÏÔʾ ÀàËÆÓÚ Çåµ¥ 8 µÄÐÅÏ¢¡£

Çåµ¥ 8. ³É¹¦µÄʼþ·¢²¼

00:12:53,718 INFO [SenderServlet] >>>>>
00:12:53,718 INFO [SenderServlet] >>>>>
00:12:53,734 INFO [EventChannel] Publishing event
[com.jeffhanson.eda. events.business.FlightDelayed @863854]
00:12:53,859 INFO [EventReceiver] EventReceiver [flightEventReceiver]
received event [Flight 2365 to Detroit will be delayed 15 minutes]
00:12:53,859 INFO [EventReceiver] EventReceiver [allTravelEventReceiver]
received event [Flight 2365 to Detroit will be delayed 15 minutes]

½áÊøÓï

Éè¼ÆÄܹ»¶Ôʵʱ¸ü¸ÄºÍʼþ×÷³ö¼°Ê±ÏìÓ¦µÄÓÐЧʼþÇý¶¯Èí¼þϵͳÊÇÒ»ÏÔÓ¹¤×÷¡£½áºÏʹÓà SOA ÓëʹÓà Java ·´ÉäµÄÓÐЧʼþÇý¶¯µÄ½»»¥¿ò¼Ü¿ÉÒÔ¼õÉÙ¸´ÔÓÐÔ£¬²¢Ôö¼ÓÁé»îÐÔ¡£Geronimo ƽ̨ÌṩÁË API ºÍ¹¤¾ß£¨°üÀ¨ JMS Ìṩ³ÌÐò£©£¬¿ÉÒÔÓÃÀ´¹¹½¨¹¦ÄÜÇ¿´óµÄʼþÇý¶¯µÄ½»»¥¿ò¼Ü¡£

´ÓÏßÐÔÆóÒµ±à³Ì×ªÒÆµ½ÃæÏò·þÎñµÄÉè¼ÆÖ»ÄÜ´øÀ´ÊÊÓÃÓÚ SOA Ä£Ð͵ÄÓÅÊÆ¡£Öع¹ÏµÍ³ÒÔ»ñµÃÒµÎñ·þÎñ»áµ¼Ö·þÎñºÍ×é¼þµÄÄ£¿é»¯¿ò¼Ü¡£Èç¹û·þÎñ»ù´¡ÉèÊ©µÄ½»»¥Ä£ÐÍÃô½Ý¶ø¿ÉÀ©Õ¹£¬ÄÇôÄú¿ÉÒÔ½«ÕâЩ×é¼þÖØÓÃÓÚ¶àÖÖ²»Í¬µÄÓ¦ÓóÌÐò¡£SOA¡¢EDA ºÍ Apache Geronimo Ϊ¹¦ÄÜÇ¿´óµÄÓÐЧÈí¼þ»ù´¡ÉèÊ©ÌṩÁË»ù´¡¡£

   
2158 ´Îä¯ÀÀ       28
Ïà¹ØÎÄÕÂ

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

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

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