±à¼ÍƼö: |
±¾ÎÄϵͳµÄ½éÉÜÁËCtripPaymentRepeaterµÄÄ¿±êÒÔ¼°ÊµÏÖÔÀíÒÔ¼°Á÷Á¿¸´ÖÆ¡¢Á÷Á¿»Ø·ÅµÄ¼¼Êõ·½°¸£¬Ï£Íû¸øÒòƵ·±½øÐлعé²âÊÔ¶øÀ§ÈŵÄÅóÓÑһЩ°ïÖúºÍ½è¼ø¡£ ±¾ÎÄÀ´×ÔÓÚ΢ÐÅЯ³Ì¼¼Êõ£¬ÓÉ»ðÁú¹ûÈí¼þAnna±à¼¡¢ÍƼö¡£
|
|
Ò»¡¢ÏµÍ³»Ø¹éÎÊÌâ
»Ø¹é²âÊÔÊÇÈí¼þÉúÃüÖÜÆÚÒ»¸öÊ®·ÖÖØÒªµÄ»·½Ú£¬µ«ÏîÄ¿ÔÚËæ×Ű汾µÄÖð²½µü´ú£¬¹¦ÄÜÈÕÒæÔö¶à£¬ÏµÍ³Óú¼Ó¸´ÔÓ£¬ÔÚ²âÊÔ¹ý³ÌÖвâÊÔÈËÔ±³£³£ÐèÒª»Ø¹éÎȶ¨°æ±¾µÄ¹¦ÄÜÒÔ±£Ö¤²»±»´ý·¢²¼°æ±¾ÐèÇóËùÓ°Ïì¡£ÈôÒª¶Ôϵͳ½øÐÐÈ«·½Î»»Ø¹é£¬Õâ¸ö²âÊԵŤ×÷Á¿½«»á·Ç³£ÅӴ󣬶øÇÒ¿ÉÄܼ¸°ÙÉÏǧÓÃÀýÖвŻᷢÏÖÒ»¸öÉõÖÁÊÇ
0 ¸öÎÊÌ⣬²âÊÔͶÈë²ú³ö²»³É±ÈÀý¡£
¶ø CPR ÔòΪÉÏÊöÎÊÌâÌṩÁ˽ϺõĽâ¾ö·½°¸¡£Ëüͨ¹ý»ùÓÚÎȶ¨°æ±¾µÄÊä³ö£¬¶Ô´ý·¢²¼°æ±¾µÄÊä³ö½øÐбȽϣ¬Í¬Ê±»¹½«Ð£ÑéÁ½¸ö°æ±¾¶ÔÏÂÓÎÇëÇóµÄ²îÒì¡£¸ù¾Ý±È¶Ô½á¹ûÆÀÅдý·¢²¼°æ±¾ÊÇ·ñÕýÈ·£¬¿ÉÒÔ´ó´ó½µµÍ»Ø¹éµÄ¹¤×÷Á¿¡£
¶þ¡¢CPR Ä¿±ê
´óÁ¿ÕæÊµÁ÷Á¿È·±£¸²¸ÇÂʽ«Â¼ÖƵÄÁ÷Á¿×÷ΪÓÃÀý¹ÜÀíÆðÀ´½øÐÐ×Ô¶¯»¯»Ø¹éÁ÷Á¿»Ø·ÅÖ§³Ö×Óµ÷ÓÃ×Ô¶¯»¯ mock£¬±ÜÃâ»Ø·Å²úÉúÔàÊý¾ÝÁ÷Á¿»Ø·ÅÖ§³Ö×Óµ÷Óýá¹ûµÄÑéÖ¤¼õÉÙÈËÁ¦×ÊÔ´
Èý¡¢Ä¿±êʵÏÖ»ù±¾¹ý³Ì

1£©Ê×ÏȽ«²¿ÊðÁËÎȶ¨´úÂëµÄ·þÎñÆ÷×÷ΪÁ÷Á¿²É¼¯Ô´¡£²âÊÔÈËÔ±ÔÚ½øÐй¦ÄÜ¡¢½Ó¿Ú²âÊÔʱ£¬ÊµÏÖ²âÊÔÖ´Ðйý³ÌÖÐÖ÷µ÷ÓÃÒÔ¼°×Óµ÷ÓõÄÈë²ÎºÍ·µ»ØÖµµÄÂ¼ÖÆ¡£Í¨¹ý¹¦ÄܺͽӿڲâÊÔʵÏÖ¶ÔÓ¦Óù¦ÄܵÄÈ«Á¿¸²¸Ç£¬Ê¹µÃÓ¦ÓÃÖÐÇëÇóÁ÷Á¿¶¼»á±»Â¼ÖƵ½¡£
2£©½«Â¼ÖƵ½µÄÇëÇóÁ÷Á¿¸´ÖƵ½ console ƽ̨£¬ÓɲâÊÔÈËÔ±·ÖÎöÓÐЧµÄÁ÷Á¿¹éÄÉΪÓÃÀý¡£ºóÐø¼´¿É²ÉÓÃÕâЩÓÐЧÓÃÀýÀ´¶Ô´ý·¢²¼°æ±¾½øÐлطźͲîÒì±È¶Ô¡£
3£©»Ø·ÅÍê³É¸æÖªµ½²âÊÔÈËÔ±£¬ÓɲâÊÔÈËÔ±¶Ô»Ø·ÅµÄ²îÒì½á¹û½øÐÐÈ·ÈÏ£¬¿ìËÙ·¢ÏÖ±»²âϵͳ bug ²¢½â¾ö¡£
ËÄ¡¢CPR ÔÀí¼°ÊµÏÖ
4.1. CPR Â¼ÖÆµÄÊý¾Ýץȡµã

ÈçÉÏͼËùʾ£¬CPR ²É¼¯µÄÊý¾ÝÖ÷ҪΪÁ½·½Ã棺´ý²âÓ¦ÓýÓÊÕµ½µÄ¿Í»§¶ËÇëÇó¼°ÏìÓ¦£»´ý²âÓ¦ÓýÓÊÕÇëÇóºóÏòÍⲿ·þÎñµÄ×Óµ÷ÓÃÇëÇó¼°ÏìÓ¦¡£CPR
Ŀǰ֧³ÖµÄÇëÇóÀàÐÍÈçÉÏͼ³ÈÉ«¿òÖÐËùʾ£»µ« CPR ±¾ÉíÉè¼ÆÊ±¶Ô¸÷ÀàÇëÇó²ÉÓòå¼þʽÉè¼Æ£¬Ê¹Æä¾ßÓнϺõÄÀ©Õ¹ÐÔ£¬¶ÔÓÚºóÐøÆäËûÐèÒª²¶»ñµÄÀàÐÍÄܺܺõĽøÐÐÖ§³Ö¡£µ±Ç°
CPR ϵͳ֧³ÖµÄ±¨ÎÄÐÒéΪ JSON ºÍ PB(ProtoBuf)¡£
4.2. CPR ½á¹¹¼ò½é
CPR ·ÖΪÁ½´ó×é¼þ£º

1£©CPR (CtripPaymentRepeater) ×é¼þ£¬¸Ã×é¼þ»ùÓÚ¿ªÔ´µÄ jvm-sandbox
¿ª·¢£¬ÓÃÓÚÂ¼ÖÆºÍ»Ø·ÅÁ÷Á¿¡£´Ë×é¼þºËÐÄΪÁ½²¿·Ö£º
CPRRecord£ºÄ¿±êÊÇÔÚÎȶ¨´úÂë»·¾³ÖÐÂ¼ÖÆÇëÇóµ÷ÓõÄÈë²ÎºÍ·µ»ØÖµ£¬²¢ÉÏË͵½´æ´¢·þÎñ¡£Ê¹µÃ CPR
Replay ¾ß±¸»Ø·ÅÁ÷Á¿µÄÊý¾Ý¡£
CPRReplay£º¹¦ÄÜΪ½ÓÊջطŷþÎñÌṩµÄ»Ø·ÅÁ÷Á¿£¬ÔÚ´ý²â´úÂë»·¾³ÖнøÐлطţ¬²¢½«»Ø·Å½á¹ûÉÏËÍÖÁ¶Ô±È·þÎñ£¬ÈÃÆäʵÏÖÕý³£ÏµÍ³ºÍ´ý²âϵͳ·µ»Ø½á¹û±È¶Ô²îÒìµÄÄÜÁ¦¡£
2£©CPRConsole ×é¼þ£¬¸Ã×é¼þÖ÷ÒªÂ¼ÖÆ/»Ø·ÅµÄÅäÖùÜÀí£»Êý¾Ý´æ´¢/Êý¾Ý¶Ô±ÈµÈ¾ß±¸¶àÖÖÄÜÁ¦¡£Ö÷Òª°üº¬Èý²¿·Ö£º
´æ´¢·þÎñ£º¶Ô½ÓÊÕµ½µÄÂ¼ÖÆÁ÷Á¿Êý¾Ý£¬½«Æä³Ö¾Ã»¯±£´æ£¬´ýºóÐøÓû§É¸Ñ¡ÓÐЧÁ÷Á¿¡£
»Ø·Å·þÎñ£º¹¦ÄÜΪ½«Â¼ÖÆÁ÷Á¿½øÐл¹Ô£¬È»ºó¶ÔÈë¿Úµ÷ÓÃ×öÒ»´ÎÁ÷Á¿µÄ·¢Æð,ʹµÃ CPR Replay¡£
¶Ô±È·þÎñ£º¶Ô½ÓÊÕµ½µÄ»Ø·ÅÊý¾ÝÓëÂ¼ÖÆÊý¾Ý½øÐвîÒì±È¶Ô¡£
4.3 CPR ´¦ÀíÁ÷³Ì
ÈçÉÏͼËùʾ£¬Í¨¹ýÕâÁ½´ó×é¼þµÄÐͬ¹¤×÷½«Îȶ¨´úÂëµÄÁ÷Á¿×Ô¶¯²¶»ñ²¢³Ö¾Ã»¯´æ´¢£¬È»ºóÓɲâÊÔÈËÔ±·ÖÎöÁ÷Á¿ÊÕ²ØÎªÓÐЧÓÃÀý£¬¶ÔÓÚºóÐø´ýÕýʽ·¢²¼µÄ´úÂ룬¿ÉÒÔÓÃÓÐЧÓÃÀýÀ´½øÐлطźͲîÒì±È¶Ô£¬¸ù¾Ý²îÒì±È¶Ô½á¹û·¢ÏÖ´ý²âϵͳ´æÔÚµÄÎÊÌâ¡£

¸ÃϵͳÔÚ´¦Àí±È¶ÔʱÓÐÁ½¸öÓëÆäËû·½°¸½Ï´ó²»Í¬µÄÌØÐÔ£º
1£©¶Ô×Óµ÷Óà MOCK ´¦Àí£º±¾·½°¸²ÉÓõÄÊǼǼÏÂÔʼ×Óµ÷ÓÃÄÚÈݼ°×Óµ÷Ó÷µ»ØÄÚÈÝ£»ÔÚϵͳÄÚ²¿Íê³É¶Ô×Óµ÷Ó÷µ»ØµÄ´¦Àí£¬²»ÔÙÐèҪʵ¼ÊµÄ×Óϵͳ»ò
mock ϵͳ½øÐвâÊÔÖ§³Å¡£ÒԴ˼õСÁË»·¾³¡¢Êý¾Ý²âÊÔ´¦ÀíµÄÄѶȺÍ׼ȷÐÔ¡£
2£©×Óµ÷ÓñȶÔÊý¾ÝµÄ´¦Àí£º±¾·½°¸²ÉÓõÄÊDZȶÔ×Óµ÷ÓÃÇëÇó¡£ÀýÈçÒ»¸ö DB ²Ù×÷£¬ÈôÇëÇóÄÚÈÝÊÇÎÞÎóµÄ£¬ÔòÈ϶¨ÇëÇóÕý³££»²»ÔÙÈ¥±È¶Ô¾ßÌåµÄÊý¾Ý¿â´æ´¢Öµ¡£ÕâÑùµÄ´¦Àí·½Ê½Í¬Ñù¼ò»¯Á˲âÊÔ»·¾³´î½¨¡¢²âÊÔÊý¾Ý×¼±¸£¬Í¬Ê±»¹½â¾öÁ˲âÊÔ»·¾³ÖÐÊý¾Ý¹²Ïí±ä¸ü¿ÉÄÜ´øÀ´µÄÊý¾Ý²îÒìÎÊÌâ¡£
4.4 Á÷Á¿¸´ÖÆÊµÏÖ
ÔÚÕû¸öÂ¼ÖÆ¹ý³ÌÖУ¬CPR ½øÐÐÂ¼ÖÆµÄ´¦ÀíÁ÷³ÌÖ÷ÒªÊÇÔÚ DefaultEventListener ÀàÖÐʵÏÖ¡£
1£©DefaultEventListener Àà
DefaultEventListener ÊÇÓÃÀ´´¦Àí´¥·¢Ê¼þµÄÀà¡£²»Í¬µÄ²å¼þ (soa,mysql,http,redis
µÈ) ¿ÉÒÔ×Ô¶¨Òå×Ô¼ºµÄ EventListener À´½øÐи÷×ÔÌØÊâµÄʼþ´¦Àí¡£Ä¿Ç°²å¼þĬÈÏʹÓà DefaultEventListener¡£
ÔÚ DefaultEventListener ÖУ¬³Ð½ÓµÄÊÇËùÓÐʼþµÄ´¦Àí£¬Ò²¾ÍÊÇËµÂ¼ÖÆ/»Ø·Å²Ù×÷¶¼ÊǼ¯ÖÐÔÚÕâ¸öÀàÖÐʵÏֵģ¬Ö»ÊǸù¾Ý²»Í¬µÄÌõ¼þÀ´Çø·ÖÊÇÂ¼ÖÆÁ÷Á¿»¹ÊǻطÅÁ÷Á¿£¬´Ó¶øÅжϸÃÖ´ÐÐÂ¼ÖÆ»¹ÊǸÃÖ´Ðлطš£
µ±Ê¼þµÚÒ»´Î¹ýÂËʱ£¬»á½øÐÐÒ»´Î³õʼ»¯¸ú×ÙÆ÷¡£

ÆäÖÐ traceId ʵ¼ÊÉÏÊÇÕâ¸ö¸ú×ÙÆ÷µÄ¶ÀÁ¢±êʶ¡£ËùÒÔÎÞÂÛÊÇÂ¼ÖÆºÍ»Ø·Å¶¼»áÓÐÆä¶ÀÁ¢µÄ traceId¡£
2£©Before ʼþ´¦Àí
¶ÔÓ¦µÄ·½·¨ÊÇ DefaultEventListener.doBefore¡£

¸ù¾Ý traceID Åжϵ±Ç°Á÷Á¿ÊÇ·ñΪ»Ø·ÅÁ÷Á¿£¬ÈôΪ»Ø·ÅÁ÷Á¿Ôòµ÷Óà processor.doMock
·½·¨Ö´ÐÐ Mock£¬Ö´ÐÐÍê³ÉºóÖ±½Ó·µ»Ø£¬²»ÔÙÖ´ÐкóÐø²Ù×÷¡£
Èôµ±Ç°Á÷Á¿ÎªÂ¼ÖÆÁ÷Á¿£¬Ôò»ùÓÚµ±Ç°»ñÈ¡µ½µÄÐÅÏ¢³õʼ»¯ Invocation ʵÀý£¬ÆäÖлáµ÷Óòå¼þÖÐ
processor#assembleIdentity¡¢processor#assembleRequest¡¢processor#assembleResponse¡¢processor#assembleThrowable
Ëĸö·½·¨£¬·Ö±ð´¦Àíµ÷Óñêʶ¡¢ÇëÇó²ÎÊý¡¢·µ»Ø½á¹û¡¢Å׳öÒì³£¡£×îºó½«µ±Ç°Ê¼þµÄ Invocation ÐÅÏ¢´æ·Åµ½Â¼ÖÆ»º´æÖС£
3£©Return ʼþ´¦Àí/ Throw ʼþ´¦Àí
Return/ Throw ʼþµÄ´¦ÀíÂß¼»ù±¾Ò»Ö¡£

Åжϵ±Ç°Á÷Á¿ÊÇ·ñΪ»Ø·ÅÁ÷Á¿£¬ÈôΪ»Ø·ÅÁ÷Á¿ÔòÖ±½Ó·µ»Ø£¬²»Ö´ÐкóÐø²Ù×÷¡£
ÈôÂ¼ÖÆÁ÷Á¿Ôò´ÓÂ¼ÖÆ»º´æÖлñÈ¡¶ÔÓ¦µÄ Invocation ʵÀý£¬µ÷Óòå¼þµ÷Óô¦ÀíÆ÷µÄ assembleResponse/assembleThrowable
·½·¨£¬²¢½« reponst/throwable ½á¹ûÉèÖõ½ Invocation ʵÀýÖС£
»Øµ÷µ÷ÓüàÌýÆ÷ InvocationListener#onInvocation ·½·¨£¬ÅÐ¶Ï Invocation
ÊÇÈë¿Úµ÷Óû¹ÊÇ×Óµ÷Óã¬Èç¹ûÊÇ×Óµ÷ÓÃÔò±£´æµ½Â¼ÖÆ»º´æÖУ¬Èç¹û²»ÊÇÔòµ÷ÓÃÏûϢͶµÝÆ÷µÄ broadcastRecord
·½·¨½«Â¼ÖƼǼÐòÁл¯ºóÉÏ´«¸ø cpr-console¡£
4.5 Á÷Á¿»Ø·ÅʵÏÖ
»Ø·ÅÁ÷³Ì£¬ÊÇÓɲâÊÔÈËԱѡÔñÓÐЧÓÃÀý£¬ÔÚ´ý²âϵͳÖÐÖ´Ðлطš£
»Ø·Å·þÎñ½ÓÊܵ½»Ø·Å¼Ç¼£¬¶Ô¼Ç¼½øÐз´ÐòÁл¯£¬»¹Ôµ½ÔÀ´Â¼ÖƵĶÔÏ󣬱£Ö¤ classloader ÓëÂ¼ÖÆÊ±ºòÒ»Ö¡£CPR
ÔÚÖ´ÐлطÅÈÎÎñµÄ¹ý³ÌÖУ¬Ê×ÏÈ»á¸ù¾ÝÂ¼ÖÆ¼Ç¼µÄÐÅÏ¢£¬¹¹ÔìÏàͬµÄÇëÇ󣬶Ա»¹ÒÔØµÄÈÎÎñ½øÐÐÇëÇ󣬲¢¸ú×ٻطÅÇëÇóµÄ´¦ÀíÁ÷³Ì£¬ÒÔ±ã¼Ç¼»Ø·Å½á¹ûÒÔ¼°Ö´ÐÐ
mock ¶¯×÷¡£Õû¸ö»Ø·Å¹ý³Ì±È½Ï¸´ÔÓ£¬Ö÷Òª°üÀ¨ÒÔϼ¸¸ö¸öÁ÷³Ì£º
1£©»Ø·ÅÇëÇóµÄ´¦Àí
ÕâÀïÒÔ http »Ø·ÅÈë¿ÚΪÀý£¬RepeaterModule#repeat ·½·¨ÊǻطÅÇëÇó×î³õ´¦ÀíÈë¿Ú¡£Ìí¼Ó
@Command ×¢½â£¬Ê¹µÃÍⲿ¿ÉÒÔʹÓà http ÐÒ鷽ʽµ÷ÓÃÈë¿Ú¡£

¸Ã·½·¨ÔÚ½ÓÊÕÍⲿµÄ»Ø·ÅÇëÇóºó£¬¶ÔÇëÇó²ÎÊý½øÐÐУÑ飬УÑéͨ¹ýºó»á½«²ÎÊýʵÀý»¯£¬ÐγÉÒ»¸ö»Ø·Åʼþ RepeatEvent£¬·¢²¼µ½
EventBusInner Öб» RepeatSubscribeSupporter#onSubscribe
·½·¨½øÐд¦Àí¡£

´¦Àí¹ý³ÌΪÊ×ÏȻὫ RepeatEvent µÄ²ÎÊý½øÐз´ÐòÁл¯£¬»ñÈ¡»Ø·ÅÏà¹ØµÄÂ¼ÖÆ¼Ç¼µÄÐÅÏ¢£¬È»ºóͨ¹ýÕâЩÐÅÏ¢´Ó
prepeater-console ÀÈ¡¶ÔÓ¦µÄÂ¼ÖÆ¼Ç¼ÏêÇ飨RecordModel£©£¬×îºóÓÃĬÈÏÁ÷Á¿·Ö·¢Æ÷
DefaultFlowDispatcher ½øÐзַ¢¡£
2£©»Ø·ÅÈÎÎñµÄ·Ö·¢
»Ø·ÅÈÎÎñµÄ·Ö·¢ÓÉ DefaultFlowDispatcher#dispatch ·½·¨ÊµÏÖ¡£

Ö÷ÒªÊÇÕë¶Ô»Ø·ÅÈÎÎñµÄÐÅÏ¢½øÐÐУÑ飬УÑéʧ°Ü»áÅ׳ö´íÎóµ½Éϲ㡣ͨ¹ýУÑéµÄ»Ø·ÅÈÎÎñ£¬Ôò»á³õʼ»¯»Ø·ÅÉÏÏÂÎÄÐÅÏ¢£¬²¢´æ·Åµ½»Ø·Å»º´æÖС£¸ù¾Ý»Ø·ÅÈÎÎñµÄÈë¿Ú²å¼þÀàÐÍ£¬»ñÈ¡¶ÔÓ¦²å¼þµÄ
repeater ½øÐлطŴ¦Àí¡£
3£©»Ø·Å½á¹ûÖ´ÐÐÓë¼Ç¼
»Ø·ÅÈÎÎñÖ´ÐС¢»Ø·Å½á¹û¼Ç¼µÄʵÏÖÂß¼ÔÚ AbstractRepeater#repeat ÖÐʵÏÖ¡£

ͨ¹ý executeRepeat ·½·¨½»Óɸ÷¸ö²å¼þµÄ»Ø·ÅÆ÷ʵÀýÀ´µ÷Óᣵ±²å¼þ¿ªÊ¼Ö´ÐлطÅÈÎÎñʱ£¬»á¸ù¾Ý»Ø·ÅÉÏÏÂÎÄÒÔ¼°µ±Ç°
repeater µÄÓ¦ÓÃÐÅÏ¢³õʼ»¯»Ø·Å½á¹û¼Ç¼ RepeaterModel µÄʵÀý¡£
³õʼ»¯»Ø·Å½á¹û¼Ç¼ºó£¬³õʼ»¯»Ø·ÅÏ̸߳ú×Ù²¢´¥·¢»Ø·ÅÇëÇó²¢»ñÈ¡»Ø·ÅÇëÇ󷵻صĽá¹û¡£
»ñÈ¡»Ø·ÅÇëÇ󷵻صĽá¹ûºó£¬Í£Ö¹Ï̸߳ú×Ù£¬½«»Ø·Å½á¹ûÒÔ¼°µ±Ç°µÄһЩ״̬ÐÅÏ¢±£´æµ½»Ø·Å½á¹û¼Ç¼µÄʵÀýÖС£
×îºóͨ¹ýµ÷ÓÃÏûϢͶµÝÆ÷µÄ AbstractBroadcaster#broadcastRepeat
·½·¨½«»Ø·Å½á¹û¼Ç¼ÐòÁл¯ºóÉÏ´«µ½ crp-console ±£´æ¡£
4£©»Ø·Å¹ý³ÌÖÐµÄ Mock ´¦Àí
ÔڻطŹý³ÌÖУ¬Ö±½ÓÔÚ DefaultEventListner#Before ʼþ´¦ÀíÖÐÖ´ÐС£

processor#doMock ·½·¨£¬½»¸ø²å¼þµ÷Óô¦ÀíÆ÷Ö´ÐÐ mock£¬²¢ÇÒÖ»¶Ô×Óµ÷ÓÃʼþÖ´ÐÐ mock¡£
public void doMock (BeforeEvent event, Boolean
entrance, InvokeType type) throws ProcessControlException
{
/*
* »ñÈ¡»Ø·ÅÉÏÏÂÎÄ
*/
RepeatContext context = RepeatCache.getRepeatContext(Tracer.getTraceId());
/*
* mockÖ´ÐÐÌõ¼þ
*/
if (!skipMock(event, entrance, context) &&
context != null && context.getMeta().isMock())
{
try {
/*
* ¹¹½¨mockÇëÇó
*/
final MockRequest request = MockRequest.builder()
.argumentArray(this.assembleRequest(event))
.event(event)
.identity(this.assembleIdentity(event))
.meta(context.getMeta())
.recordModel(context.getRecordModel())
.traceId(context.getTraceId())
.repeatId(context.getMeta().getRepeatId())
.index (SequenceGenerator.generate (context.getTraceId()))
.type(type)
.build();
/*
* Ö´ÐÐmock¶¯×÷
*/
final MockResponse mr = StrategyProvider.instance().provide
(context.getMeta().getStrategyType()).execute(request);
/*
* ´¦Àí²ßÂÔÍÆ¼ö½á¹û
*/
switch (mr.action) {
case SKIP_IMMEDIATELY:
break;
case THROWS_IMMEDIATELY:
ProcessControlException .throwThrowsImmediately
(mr.throwable);
break;
case RETURN_IMMEDIATELY:
// if (!type.equals(InvokeType.MYSQL) &&!
type.equals(InvokeType.MYBATIS)){
ProcessControlException.throwReturnImmediately
(assembleMockResponse(event, mr.invocation));
// }
break;
default:
ProcessControlException .throwThrowsImmediately
(new RepeatException("invalid action"));
break;
}
} catch (ProcessControlException pce) {
throw pce;
} catch (Throwable throwable) {
ProcessControlException .throwThrowsImmediately
(new RepeatException("unexpected code snippet
here.", throwable));
}
}
}
|
AbstractInvocationProcessor#doMock ·½·¨µÄʵÏÖ£¬Óë AbstractRepeater#repeat
ÏàËÆ£¬Êµ¼Êµ÷ÓÃʱÊÇͨ¹ý²å¼þÖи÷×﵀ Processor µÄʵÀý½øÐе÷Óõġ£
µ±¿ªÊ¼Ö´ÐлطŠmock ʱ£¬»áÏÈ»ñÈ¡»Ø·ÅÉÏÏÂÎĵÄÐÅÏ¢¡£¸ù¾Ý»Ø·ÅÉÏÏÂÎĵÄÐÅÏ¢£¬ÅжÏÊÇ·ñÌø¹ý mock
µÄÖ´ÐС£µ±ÐèÒªÖ´ÐÐ mock ʱ£¬»á¸ù¾Ý»Ø·ÅÉÏÏÂÎÄÖеÄÐÅÏ¢³õʼ»¯ MockRequest ʵÀý£¬Í¨¹ý
mock ²ßÂÔ¼ÆËã»ñÈ¡ MockResponse¡£
¸ù¾Ý MockResponse ·µ»Ø×´Ì¬½øÐв»Í¬µÄ²Ù×÷£º
µ± MockResponse Ö´Ðнá¹ûÊÇ·µ»ØÕý³£ÄÚÈÝʱ£¬¾Í»áÅ׳öÒ»¸öÖÕÖ¹µ±Ç°µ÷ÓòÙ×÷²¢·µ»Øµ±Ç°µÄ·µ»Ø½á¹û£¬ÓÃ
ProcessControlException Òì³£À´×èµ²ÐèÒª mock µÄ·½·¨µÄʵ¼Êµ÷Óá£
µ± MockResponse Ö´Ðнá¹ûÊÇ·µ»ØÒ»¸öÒ쳣ʱ£¬¾Í»áÅ׳öÒ»¸öÖÕÖ¹µ±Ç°µ÷ÓòÙ×÷²¢Å׳ö ProcessControlException
Òì³££¬´ËʱÐèÒª mock µÄ·½·¨²»»á±»ÕæÊµµ÷Óá£
Ö»Óе± MockResponse ·µ»Ø×´Ì¬ÊÇ skip ʱ£¬Ôò²»¶ÔÕâ¸öµ÷ÓÃʼþ×öÈκδ¦Àí£¬µ÷ÓûáÕæÊµ·¢Éú£¬ÆäËûÈκÎ״̬¶¼»áͨ¹ýÅ׳ö
ProcessControlException Òì³£À´×èµ²Õâ¸öʼþµÄʵ¼Êµ÷Óá£
4.6. ȱÏÝÅж¨¼òÎö
1£©¶ÔÓÚ¶Á²Ù×÷£¬ÎÒÃÇÖ÷Òª¹Ø×¢ÔÚÏàͬÇëÇóÏÂÕý³£ÏµÍ³ºÍ´ý²âϵͳµÄ·µ»Ø½á¹ûµÄ²îÒ죬¶Á½Ó¿ÚÒ²Ìᳫ¶ÔËùÓжÔÍâÇëÇó½øÐÐ
mock£¬ÕâÑù»Ø·ÅʱÄܱ£³Öµ±Ê±µÄÒ»¸öÏÖ³¡»·¾³£¬±£Ö¤ÑéÖ¤µÄ׼ȷÐÔ¡£
2£©¶ÔÓÚд²Ù×÷£¬Ö»ÑéÖ¤½Ó¿Ú·µ»Ø½á¹ûÊDz»¹»µÄ£¬ÐèÒªÑéÖ¤Ëü¾ßÌåдÈëµÄÊý¾ÝÊÇ·ñÕýÈ·¡£ÀýÈç´´½¨Ö§¸¶¶©µ¥»áµ÷ÓÃ
PPI µÄд¶©µ¥ PPI.Bill.CreatePaymentBill ½Ó¿Ú£¬ÄÇôÎÒÃÇÐèÒªÑéÖ¤»Ø·Åʱµ÷ÓÃ
PPI µÄ²ÎÊýºÍÂ¼ÖÆÊ±µ÷Óà PPI µÄ²ÎÊýÊÇ·ñÒ»Ö¡£
3£©¶Ô±ÈĬÈÏÊÇÈ«¶ÔÏó×Ö¶ÎÖðÒ»¶Ô±È¡£ÓÉÓÚÂ¼ÖÆ»·¾³ºÍ»Ø·Å»·¾³Ëù´¦»·¾³²»Í¬£¬ÓÐһЩ±ØÈ»²»Ò»ÖµÄÐÅÏ¢£¬ÀýÈçËæ»úÊý¡¢Ê±¼ä£¬ÒÔ¼°ÏµÍ³
ip µÈµÈ£¬ÕâЩÄÚÈÝϵͳ×öÁËĬÈϲ»±È¶Ô´¦Àí¡£ÏµÍ³¶ÔÓÚ×Óµ÷ÓÃÊÇĬÈ϶ԱÈËùÓÐ×Óµ÷Óã¬Ò²¿ÉÒÔͨ¹ýƽ̨ÅäÖÃÅųýһЩ²»¹ØÐĵÄ×Óµ÷ÓõĶԱȡ£
4.7 Êý¾Ý°²È«±£»¤
ÏµÍ³Â¼ÖÆÓë»Ø·Å¹ý³ÌÖлùÓÚ¶ÔͨѶ¡¢Êý¾ÝµÄ°²È«±£»¤ÒªÇó£¬ÏµÍ³ÊµÏÖÁ˶Թ«Ë¾Éñ¶Ü°²È«ÏµÍ³µÄ½ÓÈ룬ʹµÃ´«Êä¹ý³Ì¡¢Â䵨Êý¾Ý¼°ÈÕÖ¾µÈÉæ¼°°²È«ÒªÇóµÄÊý¾ÝÄÚÈݶ¼·ûºÏÁËÐÅÏ¢°²È«ÒªÇó¡£Ò²È·±£ÁËʹÓÃÕß²»»á½Ó´¥µ½Ãô¸ÐÊý¾ÝµÈÏÞÖÆÐÔÄÚÈÝ¡£
Î塢С½á
ÔÚϵͳ³ÉÊìµÄǰÌáÏ£¬¿ÉÒÔÀ©Õ¹±¾Æ½Ì¨½øÐÐÉú²úÊý¾ÝµÄ²É¼¯±È¶Ô¡£µ±ÕâÒ»²½ÊµÏֺ󣬿ÉÒÔÏë¼û»Ø¹é½«ÕæÕý²»ÔÙÊÇÒ»¼þÄÑÊ£¬ÓÈÆäÊÇÉú²ú»Ø¹éÐèÒªÃæ¶ÔµÄÊý¾ÝÎÛȾµÈÎÊÌâ¶¼½«²»ÔÙÊÇÎÊÌ⡣ͬʱ¸Ãƽ̨»¹¿ÉÑÝ»¯Îª
MOCK ƽ̨£¬ÕâÑùµÄ MOCK ½«²»ÔÙÒÀÀµÈκÎϵͳ£¬Ö»ÐèÔÚ´ý²âÓ¦ÓõķþÎñÆ÷ÉÏÔö¼ÓÒ»¸ö Agent
¼´¿ÉÍê³É¡£
|