±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚ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 Ϊ¹¦ÄÜÇ¿´óµÄÓÐЧÈí¼þ»ù´¡ÉèÊ©ÌṩÁË»ù´¡¡£ |