{"id":53735,"date":"2025-08-12T16:20:32","date_gmt":"2025-08-12T08:20:32","guid":{"rendered":"https:\/\/www.wsisp.com\/helps\/53735.html"},"modified":"2025-08-12T16:20:32","modified_gmt":"2025-08-12T08:20:32","slug":"%e3%80%90%e6%99%ba%e8%83%bd%e5%8d%8f%e5%90%8c%e4%ba%91%e5%9b%be%e5%ba%93%e3%80%91%e6%99%ba%e8%83%bd%e5%8d%8f%e5%90%8c%e4%ba%91%e5%9b%be%e5%ba%93%e7%ac%ac%e5%8d%81%e4%b8%80%e5%bc%b9%ef%bc%9a%e5%9f%ba","status":"publish","type":"post","link":"https:\/\/www.wsisp.com\/helps\/53735.html","title":{"rendered":"\u3010\u667a\u80fd\u534f\u540c\u4e91\u56fe\u5e93\u3011\u667a\u80fd\u534f\u540c\u4e91\u56fe\u5e93\u7b2c\u5341\u4e00\u5f39\uff1a\u57fa\u4e8e WebSocket \u5b9e\u73b0\u534f\u540c\u7f16\u8f91\u529f\u80fd\u3001\u57fa\u4e8e Disruptor \u4f18\u5316 WebSocket \u957f\u8fde\u63a5\u3001\u9ad8\u5e76\u53d1\u573a\u666f\u4e0b\u7684\u963b\u585e\u3001\u987a\u5e8f\u4fdd\u8bc1\u4e0e\u4f4e\u5ef6\u8fdf\u95ee\u9898"},"content":{"rendered":"<p><img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/08\/20250812082007-689af93773c60.gif\" alt=\"\u5728\u8fd9\u91cc\u63d2\u5165\u56fe\u7247\u63cf\u8ff0\" \/><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/08\/20250812082008-689af93806c8e.png\" alt=\"\u5728\u8fd9\u91cc\u63d2\u5165\u56fe\u7247\u63cf\u8ff0\" \/><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/08\/20250812082011-689af93bdc7be.gif\" alt=\"\u5728\u8fd9\u91cc\u63d2\u5165\u56fe\u7247\u63cf\u8ff0\" \/><\/p>\n<hr \/>\n<h2><font color=\"orange\"><font face=\"\u534e\u6587\u884c\u6977\"><font size=\"6\">\u672c\u8282\u91cd\u70b9<\/font><\/font><\/font><\/h2>\n<hr \/>\n<p>\u4e0a\u4e00\u8282\u6211\u4eec\u5df2\u7ecf\u5b8c\u6210\u4e86\u56e2\u961f\u7a7a\u95f4\u7684\u521b\u5efa\u3001\u6210\u5458\u7ba1\u7406\u548c\u6743\u9650\u63a7\u5236\u7b49\u529f\u80fd\u3002\u4e3a\u4e86\u63d0\u9ad8\u9879\u76ee\u7684\u5546\u4e1a\u4ef7\u503c&#xff0c;\u672c\u8282\u6765\u5b8c\u6210\u672c\u9879\u76ee\u7684\u4eae\u70b9\u529f\u80fd \u2014\u2014 \u56fe\u7247\u534f\u540c\u7f16\u8f91\u3002<\/p>\n<p>\u5927\u7eb2&#xff1a;<\/p>\n<ul>\n<li>\u56fe\u7247\u534f\u540c\u7f16\u8f91\u9700\u6c42\u5206\u6790<\/li>\n<li>\u56fe\u7247\u534f\u540c\u7f16\u8f91\u65b9\u6848\u8bbe\u8ba1<\/li>\n<li>\u56fe\u7247\u534f\u540c\u7f16\u8f91\u540e\u7aef\u5f00\u53d1<\/li>\n<\/ul>\n<p>\u901a\u8fc7\u672c\u8282&#xff0c;\u4f60\u5c06\u5b66\u4e60\u5230\u591a\u4eba\u5b9e\u65f6\u534f\u4f5c\u529f\u80fd\u7684\u8bbe\u8ba1\u5f00\u53d1&#xff0c;\u6d89\u53ca WebSocket\u3001\u4e8b\u4ef6\u9a71\u52a8\u8bbe\u8ba1\u3001Disruptor \u65e0\u9501\u961f\u5217\u7b49\u6280\u672f\u77e5\u8bc6\u3002\u5b66\u4f1a\u540e\u518d\u53bb\u5f00\u53d1\u804a\u5929\u5ba4\u4e4b\u7c7b\u7684\u4e1a\u52a1&#xff0c;\u90fd\u4f1a\u8f7b\u677e\u5f88\u591a\u3002<\/p>\n<hr \/>\n<h2><font color=\"orange\"><font face=\"\u534e\u6587\u884c\u6977\"><font size=\"6\">\u4e00\u3001\u9700\u6c42\u5206\u6790<\/font><\/font><\/font><\/h2>\n<hr \/>\n<p>\u73b0\u5728\u5f88\u591a\u4ea7\u54c1\u90fd\u6709\u591a\u4eba\u534f\u4f5c\u529f\u80fd&#xff0c;\u6bd4\u5982\u534f\u540c\u6587\u6863\u3001\u534f\u540c\u7d20\u6750\u8bbe\u8ba1\u3001\u534f\u540c\u4ee3\u7801\u7f16\u8f91\u5668\u7b49\u7b49&#xff0c;\u53ef\u4ee5\u63d0\u9ad8\u534f\u4f5c\u7684\u6548\u7387\u3002<\/p>\n<p>\u5bf9\u4e8e\u6211\u4eec\u7684\u9879\u76ee&#xff0c;\u6240\u8c13\u7684\u56fe\u7247\u534f\u540c\u7f16\u8f91\u529f\u80fd&#xff0c;\u662f\u5728\u56fe\u7247\u7f16\u8f91\u7684\u57fa\u7840\u4e0a\u589e\u52a0\u4e86 \u201c\u534f\u540c\u201d \u7684\u6982\u5ff5\u3002<\/p>\n<p>\u5f53\u7528\u6237\u7f16\u8f91\u67d0\u5f20\u56fe\u7247\u65f6&#xff0c;\u5176\u4ed6\u7528\u6237\u53ef\u4ee5 \u5b9e\u65f6 \u770b\u5230\u7f16\u8f91\u6548\u679c\u548c\u64cd\u4f5c\u63d0\u793a\u3002<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/08\/20250812082012-689af93c31069.png\" alt=\"image-20250806150651817\" \/><\/p>\n<p>\u6ce8\u610f&#xff0c;\u56e0\u4e3a\u53ea\u6709\u56e2\u961f\u7a7a\u95f4\u624d\u4f1a\u6709\u591a\u4e2a\u7528\u6237\u7f16\u8f91\u540c\u4e00\u5f20\u56fe\u7247&#xff0c;\u6240\u4ee5\u8be5\u529f\u80fd\u53ea\u5bf9\u56e2\u961f\u7a7a\u95f4\u5f00\u653e&#xff0c;\u9700\u8981\u6210\u5458\u5177\u6709\u7f16\u8f91\u6743\u9650\u3002\u534f\u540c\u7684\u56fe\u7247\u7f16\u8f91\u64cd\u4f5c\u5305\u62ec\u5de6\u65cb\u3001\u53f3\u65cb\u3001\u653e\u5927\u3001\u7f29\u5c0f\u3002<\/p>\n<hr \/>\n<h2><font color=\"orange\"><font face=\"\u534e\u6587\u884c\u6977\"><font size=\"6\">\u4e8c\u3001\u65b9\u6848\u8bbe\u8ba1<\/font><\/font><\/font><\/h2>\n<hr \/>\n<p>\u867d\u7136\u9700\u6c42\u4ecb\u7ecd\u5f88\u7b80\u5355&#xff0c;\u4f46\u662f\u6d89\u53ca\u5230\u591a\u4eba\u534f\u4f5c\u7684\u4e1a\u52a1&#xff0c;\u6709\u5f88\u591a\u95ee\u9898\u9700\u8981\u8003\u8651&#xff0c;\u6bd4\u5982&#xff1a;<\/p>\n<ul>\n<li>\u591a\u4e2a\u7528\u6237\u4e4b\u95f4\u5982\u4f55\u8fdb\u884c\u4ea4\u4e92&#xff1f;<\/li>\n<li>\u5982\u4f55\u9632\u6b62\u534f\u4f5c\u7f16\u8f91\u65f6\u51fa\u73b0\u51b2\u7a81&#xff1f;<\/li>\n<li>\u5982\u4f55\u63d0\u9ad8\u534f\u4f5c\u7684\u5b9e\u65f6\u6027&#xff1f;<\/li>\n<\/ul>\n<hr \/>\n<h3><font color=\"purple\"><font face=\"\u534e\u6587\u884c\u6977\"><font size=\"6\">\u534f\u4f5c\u4ea4\u4e92\u6d41\u7a0b<\/font><\/font><\/font><\/h3>\n<hr \/>\n<p>\u591a\u4eba\u534f\u4f5c\u65f6&#xff0c;\u6bcf\u4e2a\u7528\u6237\u7684\u52a8\u4f5c\u90fd\u9700\u8981\u901a\u77e5\u5230\u5176\u4ed6\u7528\u6237&#xff0c;\u6536\u5230\u901a\u77e5\u6d88\u606f\u7684\u7528\u6237\u9700\u8981\u8fdb\u884c\u76f8\u5e94\u7684\u5904\u7406\u3002<\/p>\n<p>\u6bd4\u5982\u7528\u6237 A \u653e\u5927\u4e86\u56fe\u7247&#xff0c;\u5c31\u9700\u8981\u7ed9\u5176\u4ed6\u6b63\u5728\u7f16\u8f91\u7684\u7528\u6237\u53d1\u9001 \u201c\u56fe\u7247\u653e\u5927\u201d \u6d88\u606f&#xff0c;\u5176\u4ed6\u7528\u6237\u6536\u5230\u8fd9\u4e2a\u6d88\u606f\u540e&#xff0c;\u9700\u8981\u540c\u6b65\u653e\u5927\u81ea\u5df1\u754c\u9762\u4e0a\u7684\u56fe\u7247\u3002<\/p>\n<p>\u8fd9\u5176\u5b9e\u662f\u4e00\u79cd \u4e8b\u4ef6\u9a71\u52a8 \u7684\u67b6\u6784\u8bbe\u8ba1\u601d\u60f3&#xff0c;\u534f\u4f5c\u7f16\u8f91\u4e2d\u7684\u6bcf\u4e2a\u7528\u6237\u52a8\u4f5c\u672c\u8d28\u4e0a\u662f\u4e00\u4e2a \u4e8b\u4ef6&#xff0c;\u6267\u884c\u52a8\u4f5c\u65f6\u4f1a\u4ea7\u751f\u4e8b\u4ef6\u5e76\u63d0\u4ea4\u7ed9\u670d\u52a1\u5668&#xff1b;\u670d\u52a1\u5668\u6536\u5230\u4e8b\u4ef6\u540e&#xff0c;\u4f1a\u8f6c\u53d1\u7ed9\u5176\u4ed6\u7528\u6237&#xff1b;\u5176\u4ed6\u7528\u6237\u6536\u5230\u4e8b\u4ef6\u540e&#xff0c;\u5c31\u8981\u4f5c\u4e3a\u4e8b\u4ef6\u7684\u6d88\u8d39\u8005\u6765\u5904\u7406\u4e8b\u4ef6\u3002<\/p>\n<p>\u6d41\u7a0b\u5982\u56fe&#xff1a;<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/08\/20250812082014-689af93ecd4ed.png\" alt=\"image-20250806153730737\" \/><\/p>\n<p>\u76f8\u6bd4\u4e8e\u751f\u4ea7\u8005\u76f4\u63a5\u8c03\u7528\u6d88\u8d39\u8005&#xff0c;\u4e8b\u4ef6\u9a71\u52a8\u6a21\u578b\u7684\u4e3b\u8981\u4f18\u70b9\u5728\u4e8e \u89e3\u8026 \u548c\u5f02\u6b65\u6027\u3002<\/p>\n<p>\u5728\u4e8b\u4ef6\u9a71\u52a8\u6a21\u578b\u4e2d&#xff0c;\u751f\u4ea7\u8005\u548c\u6d88\u8d39\u8005\u4e0d\u9700\u8981\u76f4\u63a5\u4f9d\u8d56\u4e8e\u5f7c\u6b64\u7684\u5b9e\u73b0&#xff0c;\u751f\u4ea7\u8005\u53ea\u9700\u89e6\u53d1\u4e8b\u4ef6\u5e76\u5c06\u5176\u53d1\u9001\u5230\u4e8b\u4ef6\u5206\u53d1\u5668&#xff0c;\u6d88\u8d39\u8005\u5219\u6839\u636e\u4e8b\u4ef6\u7c7b\u578b\u5904\u7406\u903b\u8f91\u3002\u8fd9\u6837\u591a\u4e2a\u6d88\u8d39\u8005\u53ef\u4ee5\u72ec\u7acb\u54cd\u5e94\u540c\u4e00\u4e8b\u4ef6&#xff08;\u6bd4\u5982\u4e00\u4e2a\u7528\u6237\u65cb\u8f6c\u4e86\u56fe\u7247&#xff0c;\u5176\u4ed6\u7528\u6237\u90fd\u80fd\u540c\u6b65&#xff09;&#xff0c;\u7cfb\u7edf\u66f4\u52a0\u7075\u6d3b&#xff0c;\u53ef\u6269\u5c55\u6027\u66f4\u5f3a\u3002<\/p>\n<p>\u6b64\u5916&#xff0c;\u4e8b\u4ef6\u9a71\u52a8\u8fd8\u53ef\u4ee5\u63d0\u5347\u7cfb\u7edf\u7684 \u5e76\u53d1\u6027 \u548c \u5b9e\u65f6\u6027&#xff0c;\u53ef\u4ee5\u7406\u89e3\u4e3a\u591a\u5f15\u5165\u4e86\u4e00\u4e2a\u4e2d\u4ecb\u6765\u5e2e\u5fd9&#xff0c;\u901a\u8fc7\u5f02\u6b65\u6d88\u606f\u4f20\u9012&#xff0c;\u51cf\u5c11\u4e86\u963b\u585e\u548c\u7b49\u5f85&#xff0c;\u80fd\u591f\u66f4\u9ad8\u6548\u5730\u5904\u7406\u591a\u4e2a\u5e76\u53d1\u4efb\u52a1\u3002<\/p>\n<p>\u8001\u5e08\u627e\u4e00\u4e2a\u8bfe\u4ee3\u8868&#xff0c;\u5c31\u4e0d\u9700\u8981\u81ea\u5df1\u4e00\u4e2a\u4e00\u4e2a\u5730\u6536\u4f5c\u4e1a\u4e86&#xff0c;\u53ef\u4ee5\u505a\u5176\u4ed6\u4e8b\u60c5\u3002<\/p>\n<hr \/>\n<p>\u4e0b\u9762\u6211\u4eec\u6309\u7167\u00b7\u4e8b\u4ef6\u9a71\u52a8\u7684\u8bbe\u8ba1\u00b7&#xff0c;\u6765\u8be6\u7ec6\u5217\u4e3e\u534f\u4f5c\u7f16\u8f91\u7684\u4ea4\u4e92\u6d41\u7a0b&#xff1a;<\/p>\n<table>\n<tr>\u4e8b\u4ef6\u89e6\u53d1\u8005&#xff08;\u7528\u6237 A \u7684\u52a8\u4f5c&#xff09;\u4e8b\u4ef6\u7c7b\u578b&#xff08;\u53d1\u9001\u6d88\u606f&#xff09;\u4e8b\u4ef6\u6d88\u8d39\u8005&#xff08;\u5176\u4ed6\u7528\u6237\u7684\u5904\u7406&#xff09;<\/tr>\n<tbody>\n<tr>\n<td>\u7528\u6237 A \u5efa\u7acb\u8fde\u63a5&#xff0c;\u52a0\u5165\u7f16\u8f91<\/td>\n<td>INFO<\/td>\n<td>\u663e\u793a\u201c\u7528\u6237 A \u52a0\u5165\u7f16\u8f91\u201d\u7684\u901a\u77e5<\/td>\n<\/tr>\n<tr>\n<td>\u7528\u6237 A \u6267\u884c\u7f16\u8f91\u64cd\u4f5c<\/td>\n<td>EDIT_ACTION<\/td>\n<td>\u653e\u5927 \/ \u7f29\u5c0f \/ \u5de6\u65cb \/ \u53f3\u65cb\u5f53\u524d\u56fe\u7247<\/td>\n<\/tr>\n<tr>\n<td>\u7528\u6237 A \u65ad\u5f00\u8fde\u63a5&#xff0c;\u79bb\u5f00\u7f16\u8f91<\/td>\n<td>INFO<\/td>\n<td>\u663e\u793a\u201c\u7528\u6237 A \u79bb\u5f00\u7f16\u8f91\u201d\u7684\u901a\u77e5<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<hr \/>\n<h3><font color=\"purple\"><font face=\"\u534e\u6587\u884c\u6977\"><font size=\"6\">\u89e3\u51b3\u534f\u4f5c\u51b2\u7a81<\/font><\/font><\/font><\/h3>\n<hr \/>\n<h4><font color=\"red\"><font face=\"\u534e\u6587\u884c\u6977\"><font size=\"6\">1\u3001\u89e3\u51b3\u65b9\u6848<\/font><\/font><\/font><\/h4>\n<hr \/>\n<p>\u5047\u8bbe\u8fd9\u6837\u4e00\u79cd\u573a\u666f&#xff1a;\u5c0f\u96f7\u548c\u674e\u86cb\u540c\u65f6\u5feb\u901f\u70b9\u51fb\u4e86\u5341\u6b21\u65cb\u8f6c&#xff0c;\u6700\u7ec8\u7684\u7ed3\u679c\u4f1a\u662f\u600e\u6837\u7684\u5462&#xff1f;<\/p>\n<p>\u5982\u679c\u6240\u6709\u4e8b\u4ef6\u90fd\u662f\u6309\u987a\u5e8f\u5904\u7406\u7684&#xff0c;\u90a3\u7ed3\u679c\u5c31\u5f88\u6e05\u6670\u4e86&#xff0c;\u4f46\u4e8b\u5b9e\u4e0a&#xff0c;\u4e3a\u4e86\u63d0\u9ad8\u6027\u80fd\u548c\u54cd\u5e94\u901f\u5ea6&#xff0c;\u4e8b\u4ef6\u901a\u5e38\u662f \u5e76\u53d1 \u7684&#xff0c;\u800c\u4e0d\u662f\u4e25\u683c\u7684\u987a\u5e8f\u6267\u884c\u3002<\/p>\n<p>\u8fd9\u79cd\u5e76\u53d1\u64cd\u4f5c\u4f1a\u5f15\u53d1 \u534f\u4f5c\u51b2\u7a81&#xff0c;\u5bfc\u81f4\u5176\u4ed6\u7528\u6237\u770b\u5230\u7684\u65cb\u8f6c\u6548\u679c\u662f\u4e71\u5e8f\u7684\u3002\u90a3\u4e48\u4f60\u4f1a\u600e\u4e48\u89e3\u51b3\u534f\u4f5c\u51b2\u7a81\u7684\u95ee\u9898\u5462&#xff1f;<\/p>\n<p>\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u4e1a\u52a1\u8bbe\u8ba1\u6765\u51cf\u5c11\u5f00\u53d1\u6210\u672c&#xff0c;\u6bd4\u5982\u7ea6\u5b9a \u540c\u4e00\u65f6\u523b\u53ea\u5141\u8bb8\u4e00\u4f4d\u7528\u6237\u8fdb\u5165\u7f16\u8f91\u56fe\u7247\u7684\u72b6\u6001&#xff0c;\u6b64\u65f6\u5176\u4ed6\u7528\u6237\u53ea\u80fd\u5b9e\u65f6\u6d4f\u89c8\u5230\u4fee\u6539\u6548\u679c&#xff0c;\u4f46\u4e0d\u80fd\u53c2\u4e0e\u7f16\u8f91&#xff1b;<\/p>\n<p>\u8fdb\u5165\u7f16\u8f91\u72b6\u6001\u7684\u7528\u6237\u53ef\u4ee5\u9000\u51fa\u7f16\u8f91&#xff0c;\u5176\u4ed6\u7528\u6237\u624d\u53ef\u4ee5\u8fdb\u5165\u7f16\u8f91\u72b6\u6001\u3002\u7c7b\u4f3c\u4e8e\u7ed9\u56fe\u7247\u7f16\u8f91\u8fd9\u4e2a\u52a8\u4f5c\u52a0\u4e86\u4e00\u628a\u9501&#xff0c;\u76f4\u63a5\u4ece\u6e90\u5934\u4e0a\u89e3\u51b3\u4e86\u7f16\u8f91\u51b2\u7a81\u7684\u95ee\u9898\u3002<\/p>\n<p>\u6b64\u65f6&#xff0c;\u534f\u4f5c\u7f16\u8f91\u7684\u4ea4\u4e92\u6d41\u7a0b\u53c8\u8981\u589e\u52a0 2 \u4e2a\u52a8\u4f5c \u2014\u2014 \u8fdb\u5165\u7f16\u8f91\u72b6\u6001\u548c\u9000\u51fa\u7f16\u8f91\u72b6\u6001&#xff1a;<\/p>\n<table>\n<tr>\u4e8b\u4ef6\u89e6\u53d1\u8005&#xff08;\u7528\u6237 A \u7684\u52a8\u4f5c&#xff09;\u4e8b\u4ef6\u7c7b\u578b&#xff08;\u53d1\u9001\u6d88\u606f&#xff09;\u4e8b\u4ef6\u6d88\u8d39\u8005&#xff08;\u5176\u4ed6\u7528\u6237\u7684\u5904\u7406&#xff09;<\/tr>\n<tbody>\n<tr>\n<td>\u7528\u6237 A \u5efa\u7acb\u8fde\u63a5&#xff0c;\u52a0\u5165\u7f16\u8f91<\/td>\n<td>INFO<\/td>\n<td>\u663e\u793a\u201c\u7528\u6237 A \u52a0\u5165\u7f16\u8f91\u201d\u7684\u901a\u77e5<\/td>\n<\/tr>\n<tr>\n<td>\u7528\u6237 A \u8fdb\u5165\u7f16\u8f91\u72b6\u6001<\/td>\n<td>ENTER_EDIT<\/td>\n<td>\u5176\u4ed6\u7528\u6237\u754c\u9762\u663e\u793a\u201c\u7528\u6237 A \u5f00\u59cb\u7f16\u8f91\u56fe\u7247\u201d&#xff0c;\u9501\u5b9a\u7f16\u8f91\u72b6\u6001<\/td>\n<\/tr>\n<tr>\n<td>\u7528\u6237 A \u6267\u884c\u7f16\u8f91\u64cd\u4f5c<\/td>\n<td>EDIT_ACTION<\/td>\n<td>\u653e\u5927 \/ \u7f29\u5c0f \/ \u5de6\u65cb \/ \u53f3\u65cb\u5f53\u524d\u56fe\u7247<\/td>\n<\/tr>\n<tr>\n<td>\u7528\u6237 A \u9000\u51fa\u7f16\u8f91\u72b6\u6001<\/td>\n<td>EXIT_EDIT<\/td>\n<td>\u89e3\u9501\u7f16\u8f91\u72b6\u6001&#xff0c;\u63d0\u793a\u5176\u4ed6\u7528\u6237\u53ef\u4ee5\u8fdb\u5165\u7f16\u8f91\u72b6\u6001<\/td>\n<\/tr>\n<tr>\n<td>\u7528\u6237 A \u65ad\u5f00\u8fde\u63a5&#xff0c;\u79bb\u5f00\u7f16\u8f91<\/td>\n<td>INFO<\/td>\n<td>\u663e\u793a\u201c\u7528\u6237 A \u79bb\u5f00\u7f16\u8f91\u201d\u7684\u901a\u77e5&#xff0c;\u5e76\u91ca\u653e\u7f16\u8f91\u72b6\u6001<\/td>\n<\/tr>\n<tr>\n<td>\u7528\u6237 A \u53d1\u9001\u4e86\u9519\u8bef\u7684\u6d88\u606f<\/td>\n<td>ERROR<\/td>\n<td>\u663e\u793a\u9519\u8bef\u6d88\u606f\u7684\u901a\u77e5<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u5176\u5b9e\u6838\u5fc3\u6d41\u7a0b\u662f\u524d 5 \u884c&#xff0c;\u4f46\u662f\u8003\u8651\u5230\u524d\u7aef\u4f20\u9012\u4e86\u9519\u8bef\u53c2\u6570\u7684\u60c5\u51b5&#xff0c;\u6211\u4eec\u65b0\u589e\u4e00\u79cd ERROR \u4e8b\u4ef6\u7c7b\u578b&#xff0c;\u53ef\u7528\u4e8e\u5c55\u793a\u9519\u8bef\u63d0\u793a\u4fe1\u606f\u3002<\/p>\n<p>\u5728\u672c\u9879\u76ee\u4e2d&#xff0c;\u6211\u4eec\u5c31\u91c7\u7528\u8fd9\u79cd\u65b9\u6848&#xff0c;\u4e0d\u4ec5\u5b9e\u73b0\u7b80\u5355\u3001\u6d41\u7a0b\u6e05\u6670&#xff0c;\u4e5f\u5c3d\u6700\u5927\u53ef\u80fd\u51cf\u5c11\u4e86\u7f16\u8f91\u51b2\u7a81\u7684\u98ce\u9669\u3002\u4f46\u8fd9\u79cd\u65b9\u6848\u7684\u7f3a\u70b9\u4e5f\u5f88\u660e\u663e&#xff0c;\u51cf\u5c11\u4e86\u5b9e\u65f6\u534f\u4f5c\u7684\u4fbf\u5229\u6027&#xff0c;\u5bf9\u4e8e\u534f\u4f5c\u8bbe\u8ba1\u3001\u534f\u4f5c\u7f16\u7801\u3001\u534f\u4f5c\u6587\u6863\u7684\u573a\u666f&#xff0c;\u540c\u4e00\u65f6\u95f4\u53ea\u80fd\u6709\u4e00\u4e2a\u7528\u6237\u7f16\u8f91&#xff0c;\u63d0\u9ad8\u7684\u6548\u7387\u6709\u9650\u3002<\/p>\n<p>\u6240\u4ee5\u8fd9\u91cc\u518d\u5206\u4eab\u53e6\u5916\u4e00\u79cd\u5b9e\u65f6\u534f\u540c\u7b97\u6cd5\u4f5c\u4e3a\u6269\u5c55\u77e5\u8bc6\u3002<\/p>\n<hr \/>\n<h4><font color=\"red\"><font face=\"\u534e\u6587\u884c\u6977\"><font size=\"6\">2\u3001\u6269\u5c55\u77e5\u8bc6 &#8211; OT \u7b97\u6cd5\u5b9e\u65f6\u534f\u540c<\/font><\/font><\/font><\/h4>\n<hr \/>\n<p>OT \u7b97\u6cd5&#xff08;Operational Transformation&#xff09;\u662f\u4e00\u79cd\u652f\u6301\u5206\u5e03\u5f0f\u7cfb\u7edf\u4e2d&#xff0c;\u591a\u4e2a\u7528\u6237\u5b9e\u65f6\u534f\u4f5c\u7f16\u8f91\u7684\u6838\u5fc3\u7b97\u6cd5&#xff0c;\u5e7f\u6cdb\u5e94\u7528\u4e8e\u5728\u7ebf\u6587\u6863\u534f\u4f5c\u7b49\u573a\u666f\u3002OT \u7b97\u6cd5\u7684\u4e3b\u8981\u529f\u80fd\u662f\u89e3\u51b3\u5e76\u53d1\u7f16\u8f91\u51b2\u7a81&#xff0c;\u786e\u4fdd\u7f16\u8f91\u7ed3\u679c\u5728\u6240\u6709\u7528\u6237\u7ec8\u7aef\u4e00\u81f4\u3002<\/p>\n<p>OT \u7b97\u6cd5\u5176\u5b9e\u5f88\u597d\u7406\u89e3&#xff0c;\u5148\u770b\u4e0b 3 \u4e2a\u6838\u5fc3\u6982\u5ff5&#xff1a;<\/p>\n<ul>\n<li>\u64cd\u4f5c (Operation) &#xff1a;\u8868\u793a\u7528\u6237\u5bf9\u534f\u4f5c\u5185\u5bb9\u7684\u4fee\u6539&#xff0c;\u6bd4\u5982\u63d2\u5165\u5b57\u7b26\u3001\u5220\u9664\u5b57\u7b26\u7b49\u3002<\/li>\n<li>\u8f6c\u5316 (Transformation) &#xff1a;\u5f53\u591a\u4e2a\u7528\u6237\u540c\u65f6\u7f16\u8f91\u5185\u5bb9\u65f6&#xff0c;OT \u4f1a\u6839\u636e\u64cd\u4f5c\u7684\u4e0a\u4e0b\u6587\u5c06\u5b83\u4eec\u8f6c\u5316&#xff0c;\u4f7f\u5f97\u8fd9\u4e9b\u64cd\u4f5c\u53ef\u4ee5\u6309\u7167\u4e0d\u540c\u7684\u987a\u5e8f\u5e94\u7528&#xff0c;\u800c\u7ed3\u679c\u4fdd\u6301\u4e00\u81f4\u3002<\/li>\n<li>\u56e0\u679c\u4e00\u81f4\u6027 &#xff1a;OT \u7b97\u6cd5\u786e\u4fdd\u64cd\u4f5c\u6309\u7167\u7528\u6237\u770b\u5230\u7684\u987a\u5e8f\u88ab\u6b63\u786e\u6267\u884c&#xff0c;\u5373\u6bcf\u4e2a\u7528\u6237\u7684\u64cd\u4f5c\u57fa\u4e8e\u6700\u65b0\u7684\u5185\u5bb9\u72b6\u6001\u3002<\/li>\n<\/ul>\n<p>\u5176\u4e2d&#xff0c;\u6700\u91cd\u8981\u7684\u5c31\u662f \u8f6c\u5316 \u6b65\u9aa4\u4e86&#xff0c;\u76f8\u5f53\u4e8e\u6709\u4e00\u4e2a\u8d1f\u8d23\u4eba\u7edf\u4e00\u6536\u96c6\u5927\u5bb6\u7684\u64cd\u4f5c&#xff0c;\u7136\u540e\u6309\u7167\u8bbe\u5b9a\u7684\u89c4\u5219\u548c\u4fe1\u606f\u8fdb\u884c\u6392\u5e8f\u4e0e\u5408\u5e76&#xff0c;\u6700\u7ec8\u7ed9\u5927\u5bb6\u4e00\u4e2a\u7edf\u4e00\u7684\u7ed3\u679c\u3002<\/p>\n<p>\u4e3e\u4e00\u4e2a\u7b80\u5355\u7684\u4f8b\u5b50&#xff1a;<\/p>\n<p>\u5047\u8bbe\u521d\u59cb\u5185\u5bb9\u662f &#034;abc&#034;&#xff0c;\u7528\u6237 A \u548c B \u540c\u65f6\u8fdb\u884c\u7f16\u8f91&#xff1a;<\/p>\n<ul>\n<li>\u7528\u6237 A \u5728\u4f4d\u7f6e 1 \u63d2\u5165 &#034;x&#034;<\/li>\n<li>\u7528\u6237 B \u5728\u4f4d\u7f6e 2 \u5220\u9664 &#034;b&#034;<\/li>\n<\/ul>\n<hr \/>\n<p>\u5982\u679c\u4e0d\u4f7f\u7528 OT \u7b97\u6cd5&#xff0c;\u7ed3\u679c\u662f&#xff1a;<\/p>\n<ul>\n<li>\u7528\u6237 A \u64cd\u4f5c\u540e&#xff0c;\u5185\u5bb9\u53d8\u4e3a &#034;axbc&#034;<\/li>\n<li>\u7528\u6237 B \u64cd\u4f5c\u540e&#xff0c;\u5185\u5bb9\u53d8\u4e3a &#034;ac&#034;<\/li>\n<\/ul>\n<p>\u5982\u679c\u76f4\u63a5\u5e94\u7528 B \u7684\u64cd\u4f5c\u5230 A \u7684\u7ed3\u679c&#xff0c;\u5f97\u5230\u7684\u662f &#034;ac&#034;&#xff0c;\u5bf9\u4e8e A \u6765\u8bf4&#xff0c;\u76f8\u5f53\u4e8e\u5220\u9664\u4e86 &#034;b&#034;&#xff0c;A \u4f1a\u611f\u5230\u4e00\u8138\u61f5\u903c\u3002<\/p>\n<hr \/>\n<p>\u5982\u679c\u4f7f\u7528 OT \u7b97\u6cd5&#xff0c;\u7ed3\u679c\u662f&#xff1a;<\/p>\n<ul>\n<li>\u7528\u6237 A \u7684\u64cd\u4f5c&#xff0c;\u5e94\u7528\u540e\u5185\u5bb9\u4e3a &#034;axbc&#034;<\/li>\n<li>\u7528\u6237 B \u7684\u64cd\u4f5c\u7ecf\u8fc7 OT \u8f6c\u5316\u4e3a\u5220\u9664 &#034;b&#034; \u5728 &#034;axbc&#034; \u4e2d\u7684\u65b0\u4f4d\u7f6e<\/li>\n<li>\u6700\u7ec8\u7528\u6237 A \u548c B \u7684\u5185\u5bb9\u90fd\u4e00\u81f4\u4e3a &#034;axc&#034;&#xff0c;\u7b26\u5408\u9884\u671f\u3002<\/li>\n<\/ul>\n<p>OT \u7b97\u6cd5\u786e\u4fdd\u65e0\u8bba\u7528\u6237\u7f16\u8f91\u7684\u987a\u5e8f\u5982\u4f55&#xff0c;\u6700\u7ec8\u5185\u5bb9\u662f\u4e00\u81f4\u7684\u3002<\/p>\n<p>\u5f53\u7136&#xff0c;\u5177\u4f53\u7684 OT \u7b97\u6cd5\u8fd8\u662f\u8981\u6839\u636e\u9700\u6c42\u6765\u8bbe\u8ba1\u4e86&#xff0c;\u534f\u4f5c\u5bc6\u5ea6\u8d8a\u9ad8&#xff0c;\u7b97\u6cd5\u8bbe\u8ba1\u96be\u5ea6\u8d8a\u5927\u3002<\/p>\n<p>\u6b64\u5916&#xff0c;\u8fd8\u6709\u4e00\u79cd\u4e0e OT \u7c7b\u4f3c\u7684\u534f\u540c\u7b97\u6cd5 CRDT&#xff08;Conflict-free Replicated Data Type&#xff09;&#xff0c;\u5176\u901a\u8fc7\u6570\u5b66\u6a21\u578b&#xff0c;\u5b9e\u73b0\u65e0\u9700\u4e2d\u5fc3\u5316\u8f6c\u5316\u7684\u51b2\u7a81\u89e3\u51b3&#xff0c;\u5728\u79bb\u7ebf\u534f\u4f5c\u573a\u666f\u4e2d\u66f4\u5177\u4f18\u52bf&#xff0c;\u611f\u5174\u8da3\u7684\u540c\u5b66\u53ef\u4ee5\u81ea\u884c\u4e86\u89e3\u3002<\/p>\n<hr \/>\n<h4><font color=\"red\"><font face=\"\u534e\u6587\u884c\u6977\"><font size=\"6\">3\u3001\u63d0\u9ad8\u534f\u4f5c\u5b9e\u65f6\u6027<\/font><\/font><\/font><\/h4>\n<hr \/>\n<p>\u5728\u5b9e\u65f6\u901a\u8baf\u7684\u4e1a\u52a1\u573a\u666f\u4e2d&#xff0c;\u5e38\u7528\u7684\u6280\u672f\u65b9\u6848\u5305\u62ec\u957f\u8f6e\u8be2\u3001SSE \u548c WebSocket\u3002<\/p>\n<p>\u7531\u4e8e\u6211\u4eec\u7684\u4e1a\u52a1\u9700\u6c42\u9700\u8981\u5b9e\u73b0\u9891\u7e41\u4e14\u9ad8\u6548\u7684\u53cc\u5411\u901a\u4fe1&#xff0c;\u56e0\u6b64\u6211\u4eec\u9009\u7528 WebSocket \u6765\u5b9e\u73b0\u5373\u65f6\u901a<\/p>\n<p>\u8baf\u3002<\/p>\n<hr \/>\n<h5><font color=\"gree\"><font face=\"\u534e\u6587\u884c\u6977\"><font size=\"6\">1\u3001\u4ec0\u4e48\u662f<\/font><\/font><\/font><font color=\"gree\"><font face=\"\u534e\u6587\u6977\u4f53\"><font size=\"6\"> WebSocket&#xff1f;<\/font><\/font><\/font><\/h5>\n<hr \/>\n<p>WebSocket \u662f\u4e00\u79cd \u5168\u53cc\u5de5\u901a\u4fe1\u534f\u8bae&#xff0c;\u8ba9\u5ba2\u6237\u7aef&#xff08;\u6bd4\u5982\u6d4f\u89c8\u5668&#xff09;\u548c\u670d\u52a1\u5668\u4e4b\u95f4\u80fd\u591f\u4fdd\u6301\u5b9e\u65f6\u3001\u6301\u7eed\u7684\u8fde\u63a5\u3002\u548c\u4f20\u7edf\u7684 HTTP \u8bf7\u6c42 &#8211; \u54cd\u5e94\u6a21\u5f0f\u4e0d\u540c&#xff0c;WebSocket \u662f\u4e00\u6761 \u201c\u5e38\u5f00\u7684\u96a7\u9053\u201d&#xff0c;\u8fde\u63a5\u7684\u53cc\u65b9\u53ef\u4ee5\u968f\u65f6\u53d1\u9001\u548c\u63a5\u6536\u6570\u636e&#xff0c;\u800c\u4e0d\u9700\u8981\u4e0d\u65ad\u5efa\u7acb\u548c\u5173\u95ed\u8fde\u63a5\u3002<\/p>\n<p>\u6253\u4e2a\u6bd4\u65b9&#xff1a;<\/p>\n<ul>\n<li>HTTP \u5c31\u50cf\u70b9\u5916\u5356&#xff1a;\u6bcf\u6b21\u4e0b\u5355&#xff08;\u8bf7\u6c42&#xff09; &#8211; \u5230\u8d27&#xff08;\u54cd\u5e94&#xff09;\u90fd\u662f\u4e00\u6b21\u72ec\u7acb\u7684\u64cd\u4f5c&#xff0c;\u5b8c\u6210\u540e\u8fde\u63a5\u5173\u95ed\u3002<\/li>\n<li>WebSocket \u50cf\u662f\u6253\u7535\u8bdd&#xff1a;\u4f60\u6253\u901a\u4e86\u7535\u8bdd&#xff08;\u5efa\u7acb\u8fde\u63a5&#xff09;&#xff0c;\u53ef\u4ee5\u968f\u65f6\u804a\u5929&#xff08;\u53cc\u5411\u901a\u4fe1&#xff09;&#xff0c;\u76f4\u5230\u6302\u65ad&#xff08;\u5173\u95ed\u8fde\u63a5&#xff09;\u3002<\/li>\n<\/ul>\n<p><img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/08\/20250812082015-689af93fafbfd.png\" alt=\"image-20250806153935781\" \/><\/p>\n<hr \/>\n<h5><font color=\"gree\"><font face=\"\u534e\u6587\u6977\u4f53\"><font size=\"6\">2\u3001WebSocket<\/font><\/font><\/font><font color=\"gree\"><font face=\"\u534e\u6587\u884c\u6977\"><font size=\"6\"> \u7684\u5e94\u7528\u573a\u666f<\/font><\/font><\/font><\/h5>\n<hr \/>\n<p>WebSocket \u7684\u4e3b\u8981\u4f5c\u7528\u662f \u5b9e\u73b0\u5b9e\u65f6\u6570\u636e\u4f20\u8f93&#xff0c;\u9002\u7528\u4e8e\u9700\u8981\u9891\u7e41\u4ea4\u4e92\u6216\u8005\u5b9e\u65f6\u66f4\u65b0\u6570\u636e\u7684\u573a\u666f\u3002\u6bd4\u5982&#xff1a;<\/p>\n<ul>\n<li>\u5373\u65f6\u901a\u8baf&#xff08;\u804a\u5929\u8f6f\u4ef6\u3001\u5b9e\u65f6\u534f\u4f5c\u5de5\u5177&#xff09;<\/li>\n<li>\u5b9e\u65f6\u6570\u636e\u66f4\u65b0&#xff08;\u80a1\u7968\u884c\u60c5\u3001\u4f53\u80b2\u6bd4\u8d5b\u6bd4\u5206&#xff09;<\/li>\n<li>\u5728\u7ebf\u6e38\u620f&#xff08;\u591a\u4eba\u5b9e\u65f6\u4e92\u52a8&#xff09;<\/li>\n<li>\u7269\u8054\u7f51&#xff08;\u8bbe\u5907\u72b6\u6001\u5b9e\u65f6\u4f20\u8f93&#xff09;<\/li>\n<li>\u534f\u540c\u7f16\u8f91&#xff08;\u50cf\u8bed\u96c0\u8fd9\u6837\u7684\u591a\u4eba\u534f\u4f5c\u7f16\u8f91&#xff09;<\/li>\n<\/ul>\n<p>\u901a\u8fc7 WebSocket&#xff0c;\u5ba2\u6237\u7aef\u4e0e\u670d\u52a1\u5668\u4e4b\u95f4\u80fd\u591f\u663e\u8457\u51cf\u5c11\u6d88\u606f\u4f20\u8f93\u7684\u5ef6\u8fdf&#xff0c;\u63d0\u9ad8\u901a\u4fe1\u6548\u7387&#xff0c;\u540c\u65f6\u964d\u4f4e\u6570\u636e\u4f20\u8f93\u7684\u5f00\u9500\u3002<\/p>\n<hr \/>\n<h5><font color=\"gree\"><font face=\"\u534e\u6587\u6977\u4f53\"><font size=\"6\">3\u3001WebSocket<\/font><\/font><\/font><font color=\"gree\"><font face=\"\u534e\u6587\u884c\u6977\"><font size=\"6\"> \u548c<\/font><\/font><\/font><font color=\"gree\"><font face=\"\u534e\u6587\u6977\u4f53\"><font size=\"6\"> HTTP <\/font><\/font><\/font><font color=\"gree\"><font face=\"\u534e\u6587\u884c\u6977\"><font size=\"6\">\u7684\u5173\u7cfb<\/font><\/font><\/font><\/h5>\n<hr \/>\n<p>WebSocket \u548c HTTP \u662f\u4e24\u79cd\u4e0d\u540c\u7684\u901a\u4fe1\u534f\u8bae&#xff0c;\u4f46\u5b83\u4eec\u662f\u7d27\u5bc6\u76f8\u5173\u7684&#xff0c;\u90fd\u662f\u57fa\u4e8e TCP \u534f\u8bae\u3001\u90fd\u53ef\u4ee5\u5728\u540c\u6837\u7684\u7aef\u53e3\u4e0a\u5de5\u4f5c&#xff08;\u6bd4\u5982 80 \u548c 443&#xff09;\u3002\u9996\u5148\u8981\u660e\u786e&#xff0c;WebSocket \u662f\u5efa\u7acb\u5728 HTTP \u57fa\u7840\u4e4b\u4e0a\u7684&#xff01;<\/p>\n<p>WebSocket \u7684\u8fde\u63a5\u9700\u8981\u901a\u8fc7 HTTP \u534f\u8bae\u53d1\u8d77\u4e00\u4e2a\u63e1\u624b&#xff08;\u79f0\u4e3a HTTP Upgrade \u8bf7\u6c42&#xff09;&#xff0c;\u8fd9\u4e2a\u63e1\u624b\u8bf7\u6c42\u662f WebSocket \u5efa\u7acb\u8fde\u63a5\u7684\u524d\u63d0&#xff0c;\u8868\u660e\u5e0c\u671b\u5207\u6362\u534f\u8bae&#xff1b;\u670d\u52a1\u5668\u5982\u679c\u652f\u6301 WebSocket&#xff0c;\u4f1a\u8fd4\u56de\u4e00\u4e2a HTTP 101 \u72b6\u6001\u7801&#xff0c;\u8868\u793a\u534f\u8bae\u5207\u6362\u6210\u529f\u3002<\/p>\n<p>\u63e1\u624b\u5b8c\u6210\u540e&#xff0c;HTTP \u534f\u8bae\u7684\u4f5c\u7528\u7ed3\u675f&#xff0c;\u901a\u4fe1\u4f1a\u5207\u6362\u4e3a WebSocket \u534f\u8bae&#xff0c;\u53cc\u65b9\u53ef\u4ee5\u5f00\u59cb\u5168\u53cc\u5de5\u901a\u4fe1\u3002<\/p>\n<hr \/>\n<p>\u4e8c\u8005\u7684\u533a\u522b\u5982\u4e0b&#xff0c;\u5927\u5bb6\u4e86\u89e3\u4e00\u4e0b\u5c31\u597d&#xff1a;<\/p>\n<table>\n<tr>\u5bf9\u6bd4\u9879HTTPWebSocket<\/tr>\n<tbody>\n<tr>\n<td>\u901a\u4fe1\u6a21\u5f0f<\/td>\n<td>\u8bf7\u6c42 &#8211; \u54cd\u5e94&#xff08;\u5355\u5411&#xff09;<\/td>\n<td>\u5168\u53cc\u5de5\u901a\u4fe1&#xff08;\u53cc\u5411&#xff09;<\/td>\n<\/tr>\n<tr>\n<td>\u8fde\u63a5\u72b6\u6001<\/td>\n<td>\u6bcf\u6b21\u8bf7\u6c42\u521b\u5efa\u65b0\u7684\u8fde\u63a5<\/td>\n<td>\u63e1\u624b\u540e\u4fdd\u6301\u6301\u7eed\u8fde\u63a5<\/td>\n<\/tr>\n<tr>\n<td>\u6570\u636e\u4f20\u8f93\u6548\u7387<\/td>\n<td>\u6bcf\u6b21\u901a\u4fe1\u90fd\u9700\u8981\u5e26\u5b8c\u6574\u5934\u90e8&#xff0c;\u5f00\u9500\u5927<\/td>\n<td>\u6570\u636e\u5e27\u5c0f&#xff0c;\u4f20\u8f93\u9ad8\u6548<\/td>\n<\/tr>\n<tr>\n<td>\u9002\u7528\u573a\u666f<\/td>\n<td>\u9759\u6001\u7f51\u9875\u52a0\u8f7d\u3001API \u8c03\u7528\u7b49\u975e\u5b9e\u65f6\u573a\u666f<\/td>\n<td>\u5b9e\u65f6\u4ea4\u4e92\u573a\u666f&#xff0c;\u5982\u804a\u5929\u3001\u6e38\u620f\u3001\u76f4\u64ad\u7b49<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<hr \/>\n<h5><font color=\"gree\"><font face=\"\u534e\u6587\u6977\u4f53\"><font size=\"6\">4\u3001WebSocket <\/font><\/font><\/font><font color=\"gree\"><font face=\"\u534e\u6587\u884c\u6977\"><font size=\"6\">\u534f\u4f5c\u7f16\u8f91\u7684\u6d41\u7a0b<\/font><\/font><\/font><\/h5>\n<hr \/>\n<p>\u901a\u8fc7 WebSocket \u5b9e\u65f6\u901a\u4fe1\u7684\u80fd\u529b&#xff0c;\u53ef\u4ee5\u5c06\u7528\u6237\u7684\u7f16\u8f91\u64cd\u4f5c\u53d1\u7ed9 WebSocket \u670d\u52a1\u5668&#xff0c;\u518d\u7531\u670d\u52a1\u5668\u8f6c\u53d1\u7ed9\u5176\u4ed6\u8fde\u63a5\u670d\u52a1\u5668\u7684\u7528\u6237\u524d\u7aef&#xff0c;\u524d\u7aef\u5c31\u53ef\u4ee5\u6839\u636e\u64cd\u4f5c\u5904\u7406\u56fe\u7247\u3002<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/08\/20250812082016-689af94066759.png\" alt=\"image-20250806154006558\" \/><\/p>\n<p>\u5177\u4f53\u7684\u4e1a\u52a1\u6d41\u7a0b&#xff1a;<\/p>\n<li>\u5efa\u7acb\u8fde\u63a5\u4e4b\u524d&#xff0c;\u5148\u8fdb\u884c\u7528\u6237\u6743\u9650\u6821\u9a8c&#xff1b;\u6821\u9a8c\u901a\u8fc7\u540e&#xff0c;\u5c06&#096;&#096;\u767b\u5f55\u7528\u6237\u4fe1\u606f\u3001\u8981\u7f16\u8f91\u7684\u56fe\u7247\u4fe1\u606f\u4fdd\u5b58\u5230\u8981\u5efa\u7acb\u7684 WebSocket \u8fde\u63a5\u7684\u4f1a\u8bdd\u5c5e\u6027&#096;\u4e2d\u3002<\/li>\n<li>\u5efa\u7acb\u8fde\u63a5\u6210\u529f\u540e&#xff0c;\u5c06 WebSocket \u4f1a\u8bdd\u4fdd\u5b58\u5230\u8be5\u56fe\u7247\u5bf9\u5e94\u7684\u4f1a\u8bdd\u96c6\u5408\u4e2d&#xff0c;\u4fbf\u4e8e\u540e\u7eed\u5206\u53d1\u6d88\u606f\u7ed9\u5176\u4ed6\u4f1a\u8bdd\u3002<\/li>\n<li>\u524d\u7aef\u5c06\u6d88\u606f\u53d1\u9001\u5230\u540e\u7aef&#xff0c;\u540e\u7aef\u6839\u636e\u6d88\u606f\u7c7b\u578b\u5206\u53d1\u5230\u5bf9\u5e94\u7684\u5904\u7406\u5668\u3002<\/li>\n<li>\u5904\u7406\u5668\u5904\u7406\u6d88\u606f&#xff0c;\u5c06\u5904\u7406\u7ed3\u679c\u4f5c\u4e3a\u6d88\u606f\u53d1\u9001\u7ed9\u9700\u8981\u7684 WebSocket \u5ba2\u6237\u7aef\u3002<\/li>\n<li>\u5f53\u524d\u7aef\u65ad\u5f00\u8fde\u63a5\u65f6&#xff0c;\u5220\u9664\u4f1a\u8bdd\u96c6\u5408\u4e2d\u7684 WebSocket \u4f1a\u8bdd&#xff0c;\u91ca\u653e\u8d44\u6e90\u3002<\/li>\n<p><img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/08\/20250812082017-689af94118994.png\" alt=\"image-20250806154133746\" \/><\/p>\n<p>\u548c HTTP \u8bf7\u6c42\u4e00\u6837&#xff0c;\u524d\u7aef\u548c WebSocket \u670d\u52a1\u5668\u4e4b\u95f4\u4f20\u8f93\u4fe1\u606f\u65f6&#xff0c;\u4e5f\u53ef\u4ee5\u901a\u8fc7 JSON \u683c\u5f0f\u5bf9\u6570\u636e\u8fdb\u884c\u5e8f\u5217\u5316\u3002<\/p>\n<hr \/>\n<h5><font color=\"gree\"><font face=\"\u534e\u6587\u6977\u4f53\"><font size=\"6\">5\u3001WebSocket <\/font><\/font><\/font><font color=\"gree\"><font face=\"\u534e\u6587\u884c\u6977\"><font size=\"6\"> \u7684\u5b9e\u73b0\u65b9\u5f0f<\/font><\/font><\/font><\/h5>\n<hr \/>\n<p>\u5bf9\u4e8e Java Spring \u9879\u76ee&#xff0c;\u4e3b\u8981\u6709\u539f\u751f WebSocket&#xff08;\u57fa\u4e8e WebSocketHandler \u5b9e\u73b0&#xff09;\u3001STOMP\u3001WebFlux \u8fd9 3 \u79cd\u5b9e\u73b0\u65b9\u5f0f\u3002<\/p>\n<p>\u5b83\u4eec\u4e4b\u95f4\u7684\u5bf9\u6bd4\u5982\u4e0b&#xff1a;<\/p>\n<table>\n<tr>\u5b9e\u73b0\u65b9\u5f0f\u7279\u70b9\u4f18\u70b9\u7f3a\u70b9\u9002\u7528\u573a\u666f<\/tr>\n<tbody>\n<tr>\n<td>\u539f\u751f WebSocket<\/td>\n<td>\u4f4e\u5c42 API&#xff0c;\u624b\u52a8\u7ba1\u7406\u8fde\u63a5\u4e0e\u6d88\u606f<\/td>\n<td>\u8f7b\u91cf\u3001\u7075\u6d3b\u3001\u9002\u7528\u4e8e\u7b80\u5355\u70b9\u5bf9\u70b9\u901a\u4fe1<\/td>\n<td>\u9700\u8981\u624b\u52a8\u7ba1\u7406\u4f1a\u8bdd\u548c\u5206\u53d1&#xff0c;\u4e0d\u652f\u6301 STOMP<\/td>\n<td>\u7b80\u5355\u7684\u5b9e\u65f6\u63a8\u9001&#xff0c;\u4f4e\u5e76\u53d1\u573a\u666f<\/td>\n<\/tr>\n<tr>\n<td>WebSocket &#043; STOMP &#043; SockJS<\/td>\n<td>\u57fa\u4e8e STOMP&#xff0c;\u652f\u6301\u53d1\u5e03 \/ \u8ba2\u9605\u6a21\u5f0f<\/td>\n<td>\u652f\u6301 STOMP\u3001\u6d88\u606f\u4ee3\u7406\u3001\u9002\u914d SockJS<\/td>\n<td>\u4f9d\u8d56\u5916\u90e8\u4ee3\u7406&#xff0c;\u914d\u7f6e\u8f83\u590d\u6742<\/td>\n<td>\u804a\u5929\u5ba4\u3001\u591a\u4eba\u534f\u4f5c&#xff0c;\u9ad8\u7ea7\u5b9e\u65f6\u5e94\u7528<\/td>\n<\/tr>\n<tr>\n<td>WebFlux &#043; Reactive WebSocket<\/td>\n<td>\u57fa\u4e8e WebFlux \u7684\u54cd\u5e94\u5f0f\u5b9e\u73b0<\/td>\n<td>\u9ad8\u5e76\u53d1\u3001\u975e\u963b\u585e\u3001\u9002\u7528\u4e8e\u5927\u6d41\u91cf\u573a\u666f<\/td>\n<td>\u5b66\u4e60\u66f2\u7ebf\u9ad8&#xff0c;\u4e0d\u652f\u6301 STOMP<\/td>\n<td>\u9ad8\u5e76\u53d1\u573a\u666f\u3001\u5927\u6570\u636e\u6d41\u63a8\u9001<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u9009\u62e9\u5efa\u8bae&#xff1a;\u5bf9\u4e8e\u5927\u591a\u6570\u7b80\u5355\u5b9e\u65f6\u63a8\u9001&#xff0c;\u9009\u7528\u539f\u751f WebSocket&#xff1b;\u5bf9\u4e8e\u590d\u6742\u7684\u804a\u5929\u5ba4\u548c\u534f\u540c\u7cfb\u7edf&#xff0c;\u9009\u7528 WebSocket &#043; STOMP &#043; SockJS&#xff1b;\u5bf9\u4e8e\u9ad8\u5e76\u53d1\u3001\u4f4e\u5ef6\u8fdf\u6570\u636e\u6d41\u63a8\u9001&#xff0c;\u9009\u7528 WebFlux &#043; Reactive WebSocket\u3002<\/p>\n<p>\u5bf9\u4e8e\u6211\u4eec\u7684\u9879\u76ee&#xff0c;\u5e76\u53d1\u8981\u6c42\u4e0d\u9ad8&#xff0c;\u9009\u62e9 Spring \u539f\u751f\u7684 WebSocket \u6765\u964d\u4f4e\u5f00\u53d1\u6210\u672c\u3002\u660e\u786e\u65b9\u6848\u540e&#xff0c;\u6211\u4eec\u8fdb\u5165\u540e\u7aef\u5f00\u53d1\u3002<\/p>\n<hr \/>\n<h2><font color=\"orange\"><font face=\"\u534e\u6587\u884c\u6977\"><font size=\"6\">\u4e09\u3001\u540e\u7aef\u5f00\u53d1<\/font><\/font><\/font><\/h2>\n<hr \/>\n<h3><font color=\"red\"><font face=\"\u534e\u6587\u884c\u6977\"><font size=\"6\">1\u3001\u5f15\u5165<\/font><\/font><\/font><font color=\"red\"><font face=\"\u534e\u6587\u6977\u4f53\"><font size=\"6\"> WebSocket <\/font><\/font><\/font><font color=\"red\"><font face=\"\u534e\u6587\u884c\u6977\"><font size=\"6\">\u4f9d\u8d56<\/font><\/font><\/font><\/h3>\n<hr \/>\n<p>\u5f15\u5165\u4f9d\u8d56&#xff1a;<\/p>\n<p><span class=\"token comment\">&lt;!&#8211; websocket &#8211;&gt;<\/span><br \/>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>dependency<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>groupId<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>org.springframework.boot<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>groupId<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>artifactId<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>spring-boot-starter-websocket<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>artifactId<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>dependency<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><\/p>\n<p>\u65b0\u5efa manager.websocket \u5305&#xff0c;\u6240\u6709\u548c WebSocket \u76f8\u5173\u7684\u4ee3\u7801\u90fd\u653e\u5230\u8be5\u5305\u4e0b\u3002<\/p>\n<hr \/>\n<h3><font color=\"red\"><font face=\"\u534e\u6587\u884c\u6977\"><font size=\"6\">2\u3001\u5b9a\u4e49\u6570\u636e\u6a21\u578b<\/font><\/font><\/font><\/h3>\n<hr \/>\n<p>\u65b0\u5efa websocket.model \u5305&#xff0c;\u5b58\u653e\u6570\u636e\u6a21\u578b&#xff0c;\u5305\u62ec\u8bf7\u6c42\u7c7b\u3001\u54cd\u5e94\u7c7b\u3001\u679a\u4e3e\u7c7b\u3002<\/p>\n<p>1. \u5b9a\u4e49\u56fe\u7247\u7f16\u8f91\u8bf7\u6c42\u6d88\u606f&#xff0c;\u4e5f\u5c31\u662f\u524d\u7aef\u8981\u53d1\u9001\u7ed9\u540e\u7aef\u7684\u53c2\u6570&#xff1a;<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/08\/20250812082019-689af9430b182.png\" alt=\"image-20250807165302026\" \/><\/p>\n<p><span class=\"token annotation punctuation\">&#064;Data<\/span><br \/>\n<span class=\"token annotation punctuation\">&#064;NoArgsConstructor<\/span><br \/>\n<span class=\"token annotation punctuation\">&#064;AllArgsConstructor<\/span><br \/>\n<span class=\"token keyword\">public<\/span> <span class=\"token keyword\">class<\/span> <span class=\"token class-name\">PictureEditRequestMessage<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/**<br \/>\n     * \u6d88\u606f\u7c7b\u578b&#xff0c;\u4f8b\u5982 &#034;ENTER_EDIT&#034;, &#034;EXIT_EDIT&#034;, &#034;EDIT_ACTION&#034;<br \/>\n     *\/<\/span><br \/>\n    <span class=\"token keyword\">private<\/span> <span class=\"token class-name\">String<\/span> type<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/**<br \/>\n     * \u6267\u884c\u7684\u7f16\u8f91\u52a8\u4f5c<br \/>\n     *\/<\/span><br \/>\n    <span class=\"token keyword\">private<\/span> <span class=\"token class-name\">String<\/span> editAction<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<hr \/>\n<p>2. \u5b9a\u4e49\u56fe\u7247\u7f16\u8f91\u54cd\u5e94\u6d88\u606f&#xff0c;\u4e5f\u5c31\u662f\u540e\u7aef\u8981\u53d1\u9001\u7ed9\u524d\u7aef\u7684\u4fe1\u606f&#xff1a;<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/08\/20250812082019-689af94386f1b.png\" alt=\"image-20250807165313930\" \/><\/p>\n<p><span class=\"token annotation punctuation\">&#064;Data<\/span><br \/>\n<span class=\"token annotation punctuation\">&#064;NoArgsConstructor<\/span><br \/>\n<span class=\"token annotation punctuation\">&#064;AllArgsConstructor<\/span><br \/>\n<span class=\"token keyword\">public<\/span> <span class=\"token keyword\">class<\/span> <span class=\"token class-name\">PictureEditResponseMessage<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/**<br \/>\n     * \u6d88\u606f\u7c7b\u578b&#xff0c;\u4f8b\u5982 &#034;INFO&#034;, &#034;ERROR&#034;, &#034;ENTER_EDIT&#034;, &#034;EXIT_EDIT&#034;, &#034;EDIT_ACTION&#034;<br \/>\n     *\/<\/span><br \/>\n    <span class=\"token keyword\">private<\/span> <span class=\"token class-name\">String<\/span> type<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/**<br \/>\n     * \u4fe1\u606f<br \/>\n     *\/<\/span><br \/>\n    <span class=\"token keyword\">private<\/span> <span class=\"token class-name\">String<\/span> message<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/**<br \/>\n     * \u6267\u884c\u7684\u7f16\u8f91\u52a8\u4f5c<br \/>\n     *\/<\/span><br \/>\n    <span class=\"token keyword\">private<\/span> <span class=\"token class-name\">String<\/span> editAction<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/**<br \/>\n     * \u7528\u6237\u4fe1\u606f<br \/>\n     *\/<\/span><br \/>\n    <span class=\"token keyword\">private<\/span> <span class=\"token class-name\">UserVO<\/span> user<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<hr \/>\n<p>3. \u5b9a\u4e49\u56fe\u7247\u7f16\u8f91\u6d88\u606f\u7c7b\u578b\u679a\u4e3e&#xff0c;\u4fbf\u4e8e\u540e\u7eed\u6839\u636e\u6d88\u606f\u7c7b\u578b\u8fdb\u884c\u76f8\u5e94\u7684\u5904\u7406&#xff1a;<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/08\/20250812082019-689af943e01e2.png\" alt=\"image-20250807165342140\" \/><\/p>\n<p><span class=\"token annotation punctuation\">&#064;Getter<\/span><br \/>\n<span class=\"token keyword\">public<\/span> <span class=\"token keyword\">enum<\/span> <span class=\"token class-name\">PictureEditMessageTypeEnum<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token function\">INFO<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\u53d1\u9001\u901a\u77e5&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;INFO&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token function\">ERROR<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\u53d1\u9001\u9519\u8bef&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;ERROR&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token function\">ENTER_EDIT<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\u8fdb\u5165\u7f16\u8f91\u72b6\u6001&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;ENTER_EDIT&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token function\">EXIT_EDIT<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\u9000\u51fa\u7f16\u8f91\u72b6\u6001&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;EXIT_EDIT&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token function\">EDIT_ACTION<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\u6267\u884c\u7f16\u8f91\u64cd\u4f5c&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;EDIT_ACTION&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">private<\/span> <span class=\"token keyword\">final<\/span> <span class=\"token class-name\">String<\/span> text<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">private<\/span> <span class=\"token keyword\">final<\/span> <span class=\"token class-name\">String<\/span> value<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token class-name\">PictureEditMessageTypeEnum<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">String<\/span> text<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">String<\/span> value<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">this<\/span><span class=\"token punctuation\">.<\/span>text <span class=\"token operator\">&#061;<\/span> text<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">this<\/span><span class=\"token punctuation\">.<\/span>value <span class=\"token operator\">&#061;<\/span> value<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/**<br \/>\n     * \u6839\u636e value \u83b7\u53d6\u679a\u4e3e<br \/>\n     *\/<\/span><br \/>\n    <span class=\"token keyword\">public<\/span> <span class=\"token keyword\">static<\/span> <span class=\"token class-name\">PictureEditMessageTypeEnum<\/span> <span class=\"token function\">getEnumByValue<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">String<\/span> value<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>value <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token keyword\">null<\/span> <span class=\"token operator\">||<\/span> value<span class=\"token punctuation\">.<\/span><span class=\"token function\">isEmpty<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> <span class=\"token keyword\">null<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token class-name\">PictureEditMessageTypeEnum<\/span> typeEnum <span class=\"token operator\">:<\/span> <span class=\"token class-name\">PictureEditMessageTypeEnum<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">values<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>typeEnum<span class=\"token punctuation\">.<\/span>value<span class=\"token punctuation\">.<\/span><span class=\"token function\">equals<\/span><span class=\"token punctuation\">(<\/span>value<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token keyword\">return<\/span> typeEnum<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token keyword\">null<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<hr \/>\n<p>4. \u5b9a\u4e49\u56fe\u7247\u7f16\u8f91\u64cd\u4f5c\u7c7b\u578b\u679a\u4e3e&#xff1a;<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/08\/20250812082020-689af9443eab7.png\" alt=\"image-20250807165406437\" \/><\/p>\n<p><span class=\"token annotation punctuation\">&#064;Getter<\/span><br \/>\n<span class=\"token keyword\">public<\/span> <span class=\"token keyword\">enum<\/span> <span class=\"token class-name\">PictureEditActionEnum<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token function\">ZOOM_IN<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\u653e\u5927\u64cd\u4f5c&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;ZOOM_IN&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token function\">ZOOM_OUT<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\u7f29\u5c0f\u64cd\u4f5c&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;ZOOM_OUT&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token function\">ROTATE_LEFT<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\u5de6\u65cb\u64cd\u4f5c&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;ROTATE_LEFT&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token function\">ROTATE_RIGHT<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\u53f3\u65cb\u64cd\u4f5c&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;ROTATE_RIGHT&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">private<\/span> <span class=\"token keyword\">final<\/span> <span class=\"token class-name\">String<\/span> text<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">private<\/span> <span class=\"token keyword\">final<\/span> <span class=\"token class-name\">String<\/span> value<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token class-name\">PictureEditActionEnum<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">String<\/span> text<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">String<\/span> value<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">this<\/span><span class=\"token punctuation\">.<\/span>text <span class=\"token operator\">&#061;<\/span> text<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">this<\/span><span class=\"token punctuation\">.<\/span>value <span class=\"token operator\">&#061;<\/span> value<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/**<br \/>\n     * \u6839\u636e value \u83b7\u53d6\u679a\u4e3e<br \/>\n     *\/<\/span><br \/>\n    <span class=\"token keyword\">public<\/span> <span class=\"token keyword\">static<\/span> <span class=\"token class-name\">PictureEditActionEnum<\/span> <span class=\"token function\">getEnumByValue<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">String<\/span> value<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>value <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token keyword\">null<\/span> <span class=\"token operator\">||<\/span> value<span class=\"token punctuation\">.<\/span><span class=\"token function\">isEmpty<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> <span class=\"token keyword\">null<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token class-name\">PictureEditActionEnum<\/span> actionEnum <span class=\"token operator\">:<\/span> <span class=\"token class-name\">PictureEditActionEnum<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">values<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>actionEnum<span class=\"token punctuation\">.<\/span>value<span class=\"token punctuation\">.<\/span><span class=\"token function\">equals<\/span><span class=\"token punctuation\">(<\/span>value<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token keyword\">return<\/span> actionEnum<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token keyword\">null<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<hr \/>\n<h3><font color=\"red\"><font face=\"\u534e\u6587\u6977\u4f53\"><font size=\"6\">3\u3001WebSocket <\/font><\/font><\/font><font color=\"red\"><font face=\"\u534e\u6587\u884c\u6977\"><font size=\"6\"> \u62e6\u622a\u5668 &#8211; \u6743\u9650\u6821\u9a8c<\/font><\/font><\/font><\/h3>\n<hr \/>\n<p>\u5728 WebSocket \u8fde\u63a5\u524d\u9700\u8981\u8fdb\u884c\u6743\u9650\u6821\u9a8c&#xff0c;\u5982\u679c\u53d1\u73b0\u7528\u6237\u6ca1\u6709\u56e2\u961f\u7a7a\u95f4\u5185\u7f16\u8f91\u56fe\u7247\u7684\u6743\u9650&#xff0c;\u5219\u62d2\u7edd\u63e1\u624b&#xff0c;\u53ef\u4ee5\u901a\u8fc7\u5b9a\u4e49\u4e00\u4e2a WebSocket \u62e6\u622a\u5668\u5b9e\u73b0\u8fd9\u4e2a\u80fd\u529b\u3002<\/p>\n<p>\u6b64\u5916&#xff0c;\u7531\u4e8e HTTP \u548c WebSocket \u7684\u533a\u522b&#xff0c;\u6211\u4eec\u4e0d\u80fd\u5728\u540e\u7eed\u6536\u5230\u524d\u7aef\u6d88\u606f\u65f6\u76f4\u63a5\u4ece request \u5bf9\u8c61\u4e2d\u83b7\u53d6\u5230\u767b\u5f55\u7528\u6237\u4fe1\u606f&#xff0c;\u56e0\u6b64\u4e5f\u9700\u8981\u901a\u8fc7 WebSocket \u62e6\u622a\u5668&#xff0c;\u4e3a\u5373\u5c06\u5efa\u7acb\u8fde\u63a5\u7684 WebSocket \u4f1a\u8bdd\u6307\u5b9a\u4e00\u4e9b\u5c5e\u6027&#xff0c;\u6bd4\u5982\u767b\u5f55\u7528\u6237\u4fe1\u606f\u3001\u7f16\u8f91\u7684\u56fe\u7247 id \u7b49\u3002<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/08\/20250812082020-689af944d3ca9.png\" alt=\"image-20250807165611246\" \/><\/p>\n<p>\u7f16\u5199\u62e6\u622a\u5668\u7684\u4ee3\u7801&#xff0c;\u9700\u8981\u5b9e\u73b0 HandshakeInterceptor \u63a5\u53e3&#xff1a;<\/p>\n<p><span class=\"token comment\">\/**<br \/>\n * Websocket \u62e6\u622a\u5668, \u5efa\u7acb\u8fde\u63a5\u524d\u9700\u8981\u5148\u8fdb\u884c\u6821\u9a8c<br \/>\n *\/<\/span><br \/>\n<span class=\"token annotation punctuation\">&#064;Slf4j<\/span><br \/>\n<span class=\"token keyword\">public<\/span> <span class=\"token keyword\">class<\/span> <span class=\"token class-name\">WsHandshakeInterceptor<\/span> <span class=\"token keyword\">implements<\/span> <span class=\"token class-name\">HandshakeInterceptor<\/span> <span class=\"token punctuation\">{<\/span><\/p>\n<p>    <span class=\"token annotation punctuation\">&#064;Resource<\/span><br \/>\n    <span class=\"token keyword\">private<\/span> <span class=\"token class-name\">UserService<\/span> userService<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token annotation punctuation\">&#064;Resource<\/span><br \/>\n    <span class=\"token keyword\">private<\/span> <span class=\"token class-name\">PictureService<\/span> pictureService<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token annotation punctuation\">&#064;Resource<\/span><br \/>\n    <span class=\"token keyword\">private<\/span> <span class=\"token class-name\">SpaceService<\/span> spaceService<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token annotation punctuation\">&#064;Resource<\/span><br \/>\n    <span class=\"token keyword\">private<\/span> <span class=\"token class-name\">SpaceUserAuthManager<\/span> spaceUserAuthManager<span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u5f00\u53d1\u56e2\u961f\u7a7a\u95f4\u65f6, \u5f00\u53d1\u7684\u516c\u5171\u529f\u80fd\u5bf9\u8c61, \u91cc\u9762\u6709\u65b9\u6cd5, \u53ef\u4ee5\u6839\u636e\u4e0d\u540c\u60c5\u51b5, \u8fd4\u56de\u5f53\u524d\u767b\u5f55\u7528\u6237\u7684\u6743\u9650\u5217\u8868<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 1. \u5b9e\u73b0 HandshakeInterceptor \u63a5\u53e3, \u91cd\u5199\u63e1\u624b\u524d\u3001\u63e1\u624b\u540e\u7684\u4e24\u4e2a\u65b9\u6cd5\u7684\u903b\u8f91<\/span><\/p>\n<p>    <span class=\"token comment\">\/**<br \/>\n     * \u5f53\u524d\u65b9\u6cd5\u662f\u5efa\u7acb\u8fde\u63a5\u524d\u7684\u6821\u9a8c, \u5982\u679c\u6821\u9a8c\u4fe1\u606f\u6ca1\u901a\u8fc7, \u8fd4\u56de false \u8fde\u63a5\u5931\u8d25\u5373\u53ef, \u65e0\u9700\u629b\u5f02\u5e38, \u901a\u8fc7\u6253\u65e5\u5fd7\u786e\u5b9a\u9519\u8bef\u4f4d\u7f6e<br \/>\n     * &#064;param request<br \/>\n     * &#064;param response<br \/>\n     * &#064;param wsHandler<br \/>\n     * &#064;param attributes \u7ed9 WebSocketSession \u4f1a\u8bdd\u8bbe\u7f6e\u5c5e\u6027<br \/>\n     * &#064;return<br \/>\n     * &#064;throws Exception<br \/>\n     *\/<\/span><br \/>\n    <span class=\"token annotation punctuation\">&#064;Override<\/span><br \/>\n    <span class=\"token keyword\">public<\/span> <span class=\"token keyword\">boolean<\/span> <span class=\"token function\">beforeHandshake<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">ServerHttpRequest<\/span> request<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">ServerHttpResponse<\/span> response<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">WebSocketHandler<\/span> wsHandler<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">Map<\/span><span class=\"token generics\"><span class=\"token punctuation\">&lt;<\/span><span class=\"token class-name\">String<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">Object<\/span><span class=\"token punctuation\">&gt;<\/span><\/span> attributes<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">throws<\/span> <span class=\"token class-name\">Exception<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ 2. \u63e1\u624b\u524d\u7684\u903b\u8f91, \u5728\u8fd9\u4e2a\u65b9\u6cd5\u4e2d\u5b8c\u6210\u5efa\u7acb\u8fde\u63a5\u524d\u7684\u6821\u9a8c, \u6b65\u9aa4\u5982\u4e0b:<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u83b7\u53d6\u767b\u5f55\u7528\u6237<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u6821\u9a8c\u7528\u6237\u662f\u5426\u6709\u7f16\u8f91\u5f53\u524d\u56fe\u7247\u7684\u6743\u9650<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u5982\u679c\u662f\u56e2\u961f\u7a7a\u95f4, \u5e76\u4e14\u6709\u7f16\u8f91\u8005\u6743\u9650, \u624d\u80fd\u5efa\u7acb\u8fde\u63a5<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u8bbe\u7f6e\u7528\u6237\u767b\u5f55\u4fe1\u606f\u7b49\u5c5e\u6027\u5230 WebSocket \u4f1a\u8bdd\u4e2d<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>request <span class=\"token keyword\">instanceof<\/span> <span class=\"token class-name\">ServletServerHttpRequest<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token comment\">\/\/ 3. \u4ece ServletServerHttpRequest \u4e2d\u62ff\u5230 ServletRequest<\/span><br \/>\n            <span class=\"token class-name\">HttpServletRequest<\/span> httpServletRequest <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">ServletServerHttpRequest<\/span><span class=\"token punctuation\">)<\/span> request<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">getServletRequest<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token comment\">\/\/ 4. \u4ece\u8bf7\u6c42\u4e2d\u83b7\u53d6\u4fe1\u606f, \u5982\u7528\u6237\u4fe1\u606f, \u6b63\u5728\u7f16\u8f91\u7684\u56fe\u7247\u4fe1\u606f<\/span><br \/>\n            <span class=\"token class-name\">String<\/span> pictureId <span class=\"token operator\">&#061;<\/span> httpServletRequest<span class=\"token punctuation\">.<\/span><span class=\"token function\">getParameter<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;pictureId&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">StrUtil<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">isBlank<\/span><span class=\"token punctuation\">(<\/span>pictureId<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token comment\">\/\/ \u627e\u4e0d\u5230\u5f53\u524d\u7f16\u8f91\u7684\u56fe\u7247<\/span><br \/>\n                log<span class=\"token punctuation\">.<\/span><span class=\"token function\">error<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\u7f3a\u5c11\u4f53\u56fe\u7247\u53c2\u6570, \u62d2\u7edd\u63e1\u624b&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n            <span class=\"token comment\">\/\/ 5. \u83b7\u53d6\u5f53\u524d\u767b\u5f55\u7528\u6237\u4fe1\u606f<\/span><br \/>\n            <span class=\"token class-name\">User<\/span> loginUser <span class=\"token operator\">&#061;<\/span> userService<span class=\"token punctuation\">.<\/span><span class=\"token function\">getLoginUser<\/span><span class=\"token punctuation\">(<\/span>httpServletRequest<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">ObjUtil<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">isEmpty<\/span><span class=\"token punctuation\">(<\/span>loginUser<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span><br \/>\n                log<span class=\"token punctuation\">.<\/span><span class=\"token function\">error<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\u7528\u6237\u672a\u767b\u5f55, \u62d2\u7edd\u63e1\u624b&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><\/p>\n<p>            <span class=\"token comment\">\/\/ 6. \u67e5\u5230\u5f53\u524d\u56fe\u7247\u4fe1\u606f, \u7531\u4e8e\u6821\u9a8c\u5f53\u524d\u767b\u5f55\u7528\u6237\u662f\u5426\u6709\u7f16\u8f91\u6743\u9650<\/span><br \/>\n            <span class=\"token class-name\">Picture<\/span> picture <span class=\"token operator\">&#061;<\/span> pictureService<span class=\"token punctuation\">.<\/span><span class=\"token function\">getById<\/span><span class=\"token punctuation\">(<\/span>pictureId<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">ObjUtil<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">isEmpty<\/span><span class=\"token punctuation\">(<\/span>picture<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span><br \/>\n                log<span class=\"token punctuation\">.<\/span><span class=\"token function\">error<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\u56fe\u7247\u4e0d\u5b58\u5728, \u62d2\u7edd\u63e1\u624b&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><\/p>\n<p>            <span class=\"token class-name\">Long<\/span> spaceId <span class=\"token operator\">&#061;<\/span> picture<span class=\"token punctuation\">.<\/span><span class=\"token function\">getSpaceId<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token class-name\">Space<\/span> space <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">null<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token comment\">\/\/ 8. \u6821\u9a8c\u56fe\u7247\u6240\u5728\u7a7a\u95f4\u662f\u5426\u5b58\u5728, \u4ee5\u53ca\u6240\u5728\u7a7a\u95f4\u662f\u5426\u4e3a\u56e2\u961f\u7a7a\u95f4<\/span><br \/>\n            <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>spaceId <span class=\"token operator\">!&#061;<\/span> <span class=\"token keyword\">null<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span><br \/>\n                space <span class=\"token operator\">&#061;<\/span> spaceService<span class=\"token punctuation\">.<\/span><span class=\"token function\">getById<\/span><span class=\"token punctuation\">(<\/span>spaceId<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">ObjUtil<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">isEmpty<\/span><span class=\"token punctuation\">(<\/span>space<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span><br \/>\n                    log<span class=\"token punctuation\">.<\/span><span class=\"token function\">error<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\u56fe\u7247\u6240\u5728\u7a7a\u95f4\u4e0d\u5b58\u5728, \u62d2\u7edd\u63e1\u624b&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><br \/>\n                <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>space<span class=\"token punctuation\">.<\/span><span class=\"token function\">getSpaceType<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">!&#061;<\/span> <span class=\"token class-name\">SpaceTypeEnum<\/span><span class=\"token punctuation\">.<\/span><span class=\"token constant\">TEAM<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">getValue<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span><br \/>\n                    log<span class=\"token punctuation\">.<\/span><span class=\"token function\">error<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\u56fe\u7247\u6240\u5728\u7a7a\u95f4\u4e0d\u662f\u56e2\u961f\u7a7a\u95f4, \u62d2\u7edd\u63e1\u624b&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n            <span class=\"token comment\">\/\/ 9. spaceId \u4e3a\u7a7a, \u8868\u793a\u5f53\u524d\u7a7a\u95f4\u662f\u516c\u5171\u56fe\u5e93<\/span><br \/>\n            <span class=\"token comment\">\/\/ \u516c\u5171\u56fe\u5e93\u7406\u8bba\u4e0a\u4e0d\u652f\u6301\u534f\u540c\u7f16\u8f91, \u4f46\u662f\u4e3a\u4e86\u62d3\u5c55\u591a\u4e2a\u7ba1\u7406\u5458\u534f\u540c\u7f16\u8f91\u516c\u5171\u7a7a\u95f4\u56fe\u7247, \u524d\u9762\u7684\u4ee3\u7801\u628a space \u62bd\u51fa\u6765<\/span><br \/>\n            <span class=\"token class-name\">List<\/span><span class=\"token generics\"><span class=\"token punctuation\">&lt;<\/span><span class=\"token class-name\">String<\/span><span class=\"token punctuation\">&gt;<\/span><\/span> permissionList <span class=\"token operator\">&#061;<\/span> spaceUserAuthManager<span class=\"token punctuation\">.<\/span><span class=\"token function\">getPermissionList<\/span><span class=\"token punctuation\">(<\/span>space<span class=\"token punctuation\">,<\/span> loginUser<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token comment\">\/\/ \u5f15\u5165\u5f00\u53d1\u56e2\u961f\u7a7a\u95f4\u65f6\u7684 bean: SpaceUserAuthManager, \u53ef\u4ee5\u8c03\u7528\u6821\u9a8c\u65b9\u6cd5<\/span><br \/>\n            <span class=\"token comment\">\/\/ getPermissionList() \u6709\u903b\u8f91, \u5982\u679c space &#061;&#061; null &amp;&amp; \u662f\u7ba1\u7406\u5458, \u8fd4\u56de\u7ba1\u7406\u5458\u6743\u9650\u5217\u8868<\/span><\/p>\n<p>            <span class=\"token comment\">\/\/ 10. \u6821\u9a8c\u7f16\u8f91\u6743\u9650, \u5982\u679c\u5f53\u524d\u6743\u9650\u5217\u8868\u6ca1\u6709\u7f16\u8f91\u6743\u9650, \u62d2\u7edd\u63e1\u624b<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>permissionList<span class=\"token punctuation\">.<\/span><span class=\"token function\">contains<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">SpaceUserPermissionConstant<\/span><span class=\"token punctuation\">.<\/span><span class=\"token constant\">PICTURE_EDIT<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span><br \/>\n                log<span class=\"token punctuation\">.<\/span><span class=\"token function\">error<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\u7528\u6237\u6ca1\u6709\u7f16\u8f91\u56fe\u7247\u7684\u6743\u9650, \u62d2\u7edd\u63e1\u624b&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><\/p>\n<p>            <span class=\"token comment\">\/\/ 11. \u6821\u9a8c\u901a\u8fc7, \u53ef\u4ee5\u63e1\u624b, \u8bbe\u7f6e\u767b\u5f55\u7528\u6237\u7b49\u4fe1\u606f\u5230 WebSocket \u4f1a\u8bdd\u4e2d<\/span><br \/>\n            attributes<span class=\"token punctuation\">.<\/span><span class=\"token function\">put<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;user&#034;<\/span><span class=\"token punctuation\">,<\/span> loginUser<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            attributes<span class=\"token punctuation\">.<\/span><span class=\"token function\">put<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;userId&#034;<\/span><span class=\"token punctuation\">,<\/span> loginUser<span class=\"token punctuation\">.<\/span><span class=\"token function\">getId<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u4e0d\u4e00\u5b9a\u7528\u5f97\u4e0a, \u4f46\u662f\u53ef\u4ee5\u4f20<\/span><br \/>\n            attributes<span class=\"token punctuation\">.<\/span><span class=\"token function\">put<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;pictureId&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">Long<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">valueOf<\/span><span class=\"token punctuation\">(<\/span>pictureId<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u4e00\u5b9a\u8981\u4f20, \u4e00\u4f1a\u8981\u7ef4\u62a4\u56fe\u7247ID\u5bf9\u5e94\u7684\u4f1a\u8bdd\u96c6\u5408<\/span><br \/>\n            <span class=\"token comment\">\/\/ \u4ece\u8bf7\u6c42\u4e2d\u83b7\u53d6\u5230\u7684 pictureId \u662f String \u7c7b\u578b\u7684, \u9700\u8981\u8f6c\u4e3a Long \u7c7b\u578b<\/span><br \/>\n            <span class=\"token comment\">\/\/ \u5728\u63e1\u624b\u901a\u8fc7\u7684\u4f4d\u7f6e, \u5411\u53c2\u6570 Map&lt;String, Object&gt; attributes \u63d2\u5165\u952e\u503c\u5bf9, \u5373\u53ef\u628a\u8fd9\u4e9b\u4fe1\u606f\u9884\u7f6e\u5230\u5373\u5c06\u521b\u5efa\u7684 WebSocket \u4f1a\u8bdd\u4e2d<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">true<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token annotation punctuation\">&#064;Override<\/span><br \/>\n    <span class=\"token keyword\">public<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token function\">afterHandshake<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">ServerHttpRequest<\/span> request<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">ServerHttpResponse<\/span> response<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">WebSocketHandler<\/span> wsHandler<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">Exception<\/span> exception<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><\/p>\n<p>    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<hr \/>\n<h3><font color=\"red\"><font face=\"\u534e\u6587\u6977\u4f53\"><font size=\"6\">4\u3001WebSocket <\/font><\/font><\/font><font color=\"red\"><font face=\"\u534e\u6587\u884c\u6977\"><font size=\"6\"> \u5904\u7406\u5668<\/font><\/font><\/font><\/h3>\n<hr \/>\n<h4><font color=\"gree\"><font face=\"\u534e\u6587\u884c\u6977\"><font size=\"6\">(1) \u5b9a\u4e49<\/font><\/font><\/font><font color=\"gree\"><font face=\"\u534e\u6587\u6977\u4f53\"><font size=\"6\"> WebSocket <\/font><\/font><\/font><font color=\"gree\"><font face=\"\u534e\u6587\u884c\u6977\"><font size=\"6\">\u5904\u7406\u5668\u7c7b<\/font><\/font><\/font><\/h4>\n<hr \/>\n<p>\u6211\u4eec\u9700\u8981\u5b9a\u4e49 WebSocket \u5904\u7406\u5668\u7c7b&#xff0c;\u5728\u8fde\u63a5\u6210\u529f\u3001\u8fde\u63a5\u5173\u95ed\u3001\u63a5\u6536\u5230\u5ba2\u6237\u7aef\u6d88\u606f\u65f6\u8fdb\u884c\u76f8\u5e94\u7684\u5904\u7406\u3002<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/08\/20250812082021-689af9456c768.png\" alt=\"image-20250807175541658\" \/><\/p>\n<p><span class=\"token annotation punctuation\">&#064;Component<\/span><br \/>\n<span class=\"token keyword\">public<\/span> <span class=\"token keyword\">class<\/span> <span class=\"token class-name\">PictureEditHandler<\/span> <span class=\"token keyword\">extends<\/span> <span class=\"token class-name\">TextWebSocketHandler<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u53ef\u4ee5\u7ee7\u627f TextWebSocketHandler \u62bd\u8c61\u7c7b&#xff0c;\u8fd9\u6837\u5c31\u80fd\u4ee5\u5b57\u7b26\u4e32\u7684\u65b9\u5f0f\u53d1\u9001\u548c\u63a5\u53d7\u6d88\u606f\u4e86&#xff1b;<\/p>\n<p>\u56e0\u4e3a\u540e\u7eed\u90fd\u662f\u4f7f\u7528 JSON \u8fdb\u884c\u524d\u540e\u7aef\u7684\u6570\u636e\u4ea4\u4e92&#xff0c;\u56e0\u6b64\u7ee7\u627f WebSocketHandler \u884d\u751f\u7684 TextWebSocketHandler&#xff1b;<\/p>\n<hr \/>\n<p>\u63a5\u4e0b\u6765&#xff0c;\u6211\u4eec\u8981\u91cd\u5199\u62bd\u8c61\u7c7b\u4e2d\u7684\u4e09\u4e2a\u65b9\u6cd5&#xff1a;<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/08\/20250812082021-689af945ed2f6.png\" alt=\"image-20250809085247879\" \/><\/p>\n<hr \/>\n<h4><font color=\"gree\"><font face=\"\u534e\u6587\u884c\u6977\"><font size=\"6\">(2) \u5b9a\u4e49\u5168\u5c40\u96c6\u5408\u5e38\u91cf<\/font><\/font><\/font><\/h4>\n<hr \/>\n<p>\u9996\u5148\u5728\u5904\u7406\u5668\u7c7b\u4e2d\u5b9a\u4e49 2 \u4e2a\u5e38\u91cf&#xff0c;\u5206\u522b\u4e3a&#xff1a;<\/p>\n<ul>\n<li>\u4fdd\u5b58\u5f53\u524d\u6b63\u5728\u7f16\u8f91\u7684\u7528\u6237 id&#xff0c;\u6267\u884c\u7f16\u8f91\u64cd\u4f5c\u3001\u8fdb\u5165\u6216\u9000\u51fa\u7f16\u8f91\u65f6\u90fd\u4f1a\u6821\u9a8c\u3002<\/li>\n<li>\u4fdd\u5b58\u53c2\u4e0e\u7f16\u8f91\u56fe\u7247\u7684\u7528\u6237 WebSocket \u4f1a\u8bdd\u7684\u96c6\u5408\u3002\u7531\u4e8e\u6bcf\u4e2a\u56fe\u7247\u7684\u534f\u4f5c\u7f16\u8f91\u90fd\u662f\u76f8\u4e92\u72ec\u7acb\u7684&#xff0c;\u6240\u4ee5\u9700\u8981\u7528 Map \u6765\u533a\u5206\u6bcf\u4e2a\u56fe\u7247 id \u5bf9\u5e94\u7684\u6570\u636e\u3002<\/li>\n<\/ul>\n<p>\u4ee3\u7801\u5982\u4e0b&#xff1a;<\/p>\n<p><span class=\"token annotation punctuation\">&#064;Component<\/span><br \/>\n<span class=\"token keyword\">public<\/span> <span class=\"token keyword\">class<\/span> <span class=\"token class-name\">PictureEditHandler<\/span> <span class=\"token keyword\">extends<\/span> <span class=\"token class-name\">TextWebSocketHandler<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u6bcf\u5f20\u56fe\u7247\u7684\u7f16\u8f91\u72b6\u6001&#xff0c;key: pictureId, value: \u5f53\u524d\u6b63\u5728\u7f16\u8f91\u7684\u7528\u6237 ID<\/span><br \/>\n    <span class=\"token keyword\">private<\/span> <span class=\"token keyword\">final<\/span> <span class=\"token class-name\">Map<\/span><span class=\"token generics\"><span class=\"token punctuation\">&lt;<\/span><span class=\"token class-name\">Long<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">Long<\/span><span class=\"token punctuation\">&gt;<\/span><\/span> pictureEditingUsers <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token class-name\">ConcurrentHashMap<\/span><span class=\"token generics\"><span class=\"token punctuation\">&lt;<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u4fdd\u5b58\u6240\u6709\u8fde\u63a5\u7684\u4f1a\u8bdd&#xff0c;key: pictureId, value: \u7528\u6237\u4f1a\u8bdd\u96c6\u5408<\/span><br \/>\n    <span class=\"token keyword\">private<\/span> <span class=\"token keyword\">final<\/span> <span class=\"token class-name\">Map<\/span><span class=\"token generics\"><span class=\"token punctuation\">&lt;<\/span><span class=\"token class-name\">Long<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">Set<\/span><span class=\"token punctuation\">&lt;<\/span><span class=\"token class-name\">WebSocketSession<\/span><span class=\"token punctuation\">&gt;<\/span><span class=\"token punctuation\">&gt;<\/span><\/span> pictureSessions <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token class-name\">ConcurrentHashMap<\/span><span class=\"token generics\"><span class=\"token punctuation\">&lt;<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ &#8230;..<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u4e3a\u4fdd\u8bc1\u7ebf\u7a0b\u5b89\u5168&#xff0c;\u5168\u5c40\u5e38\u91cf\u96c6\u5408pictureSessions \u548c pictureEditingUsers \u90fd\u5fc5\u987b\u4f7f\u7528 ConcurrentHashMap&#xff1a;<\/p>\n<li>\n<p>pictureSessions \u7684 key \u4e3a pictureId&#xff0c;value \u4e3a Set&lt;WebSocketSession&gt;\u3002 \u540c\u4e00\u4e2a PictureEditHandler \u5b9e\u4f8b\u4f1a\u88ab\u6240\u6709 WebSocket \u8fde\u63a5\u5171\u4eab&#xff0c;\u591a\u4e2a\u7ebf\u7a0b&#xff08;\u8fde\u63a5&#xff09;\u4f1a\u5e76\u53d1\u8bfb\u5199\u8be5 Map&#xff1b;\u7531\u4e8e\u53ef\u80fd\u540c\u65f6\u6709\u591a\u4e2a WebSocket \u5ba2\u6237\u7aef\u5efa\u7acb\u8fde\u63a5\u548c\u53d1\u9001\u6d88\u606f&#xff0c;\u96c6\u5408\u8981\u4f7f\u7528\u5e76\u53d1\u5305&#xff08;JUC&#xff09;\u4e2d\u7684 ConcurrentHashMap&#xff0c;\u6765\u4fdd\u8bc1\u7ebf\u7a0b\u5b89\u5168\u3002\u53ea\u6709 ConcurrentHashMap \u624d\u80fd\u907f\u514d\u7ade\u6001\u6761\u4ef6\u548c\u6570\u636e\u4e22\u5931\u3002<\/p>\n<\/li>\n<li>\n<p>pictureEditingUsers \u7684 key \u4e3a pictureId&#xff0c;value \u4e3a\u5f53\u524d\u6b63\u5728\u7f16\u8f91\u8be5\u56fe\u7247\u7684 userId\u3002 \u8be5 Map \u540c\u6837\u4f1a\u88ab\u5e76\u53d1\u8bbf\u95ee&#xff0c;\u7528\u4e8e\u5224\u65ad\u67d0\u5f20\u56fe\u7247\u662f\u5426\u5df2\u6709\u7528\u6237\u6b63\u5728\u7f16\u8f91&#xff1b;\u5fc5\u987b\u4f7f\u7528\u7ebf\u7a0b\u5b89\u5168\u7684 ConcurrentHashMap \u6765\u786e\u4fdd\u72b6\u6001\u4e00\u81f4\u3002<\/p>\n<\/li>\n<hr \/>\n<h4><font color=\"gree\"><font face=\"\u534e\u6587\u884c\u6977\"><font size=\"6\">(3) \u5b9a\u4e49\u516c\u5171\u65b9\u6cd5&#xff1a;\u5e7f\u64ad\u7f16\u8f91\u4fe1\u606f<\/font><\/font><\/font><\/h4>\n<hr \/>\n<p>\u7531\u4e8e\u63a5\u4e0b\u6765\u5f88\u591a\u6d88\u606f&#xff0c;\u90fd\u9700\u8981\u4f20\u9012\u7ed9\u6240\u6709\u534f\u4f5c\u8005&#xff0c;\u6240\u4ee5\u5148\u7f16\u5199\u4e00\u4e2a \u5e7f\u64ad\u6d88\u606f \u7684\u65b9\u6cd5\u3002<\/p>\n<ul>\n<li>\u8be5\u65b9\u6cd5\u4f1a\u6839\u636e pictureId&#xff0c;\u5c06\u54cd\u5e94\u6d88\u606f\u53d1\u9001\u7ed9\u7f16\u8f91\u8be5\u56fe\u7247\u7684\u6240\u6709\u4f1a\u8bdd\u3002<\/li>\n<li>\u8003\u8651\u5230\u53ef\u80fd\u4f1a\u6709\u6d88\u606f&#xff0c;\u4e0d\u9700\u8981\u53d1\u9001\u7ed9\u7f16\u8f91\u8005\u672c\u4eba\u7684\u60c5\u51b5&#xff0c;\u8be5\u65b9\u6cd5\u8fd8\u53ef\u4ee5\u63a5\u53d7 excludeSession \u53c2\u6570&#xff0c;\u652f\u6301\u6392\u9664\u6389\u5411\u67d0\u4e2a\u4f1a\u8bdd\u53d1\u9001\u6d88\u606f\u3002<\/li>\n<\/ul>\n<p>\u4ee3\u7801\u5982\u4e0b&#xff1a;<\/p>\n<p><span class=\"token keyword\">private<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token function\">broadcastToPicture<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">Long<\/span> pictureId<span class=\"token punctuation\">,<\/span><br \/>\n                                <span class=\"token class-name\">PictureEditResponseMessage<\/span> pictureEditResponseMessage<span class=\"token punctuation\">,<\/span><span class=\"token class-name\">WebSocketSession<\/span> excludeSession<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">throws<\/span> <span class=\"token class-name\">Exception<\/span> <span class=\"token punctuation\">{<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 12. \u52a0\u4e0a\u53c2\u6570 WebSocketSession excludeSession, \u8868\u793a\u4e0d\u9700\u8981\u63a5\u6536\u5e7f\u64ad\u4fe1\u606f\u7684 session<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u4e5f\u5c31\u662f Map value \u7684\u4f1a\u8bdd\u96c6\u5408\u4e2d, excludeSession \u6307\u7684\u662f\u7f16\u8f91\u64cd\u4f5c\u5bf9\u5e94\u7684\u7f16\u8f91\u8005\u7684 session<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u7f16\u8f91\u64cd\u4f5c, \u9700\u8981\u5bf9\u4e00\u4e2a session \u96c6\u5408\u4e2d, \u9664\u7f16\u8f91\u8005\u672c\u4eba session \u5916\u7684\u6240\u6709 session \u5e7f\u64ad\u4fe1\u606f<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 1. \u6839\u636e\u5168\u5c40\u5e38\u91cf\u96c6\u5408 pictureSessions \u83b7\u53d6\u7f16\u8f91\u5f53\u524d\u56fe\u7247\u5bf9\u5e94\u7684\u4f1a\u8bdd\u96c6\u5408<\/span><br \/>\n    <span class=\"token class-name\">Set<\/span><span class=\"token generics\"><span class=\"token punctuation\">&lt;<\/span><span class=\"token class-name\">WebSocketSession<\/span><span class=\"token punctuation\">&gt;<\/span><\/span> sessionSet <span class=\"token operator\">&#061;<\/span> pictureSessions<span class=\"token punctuation\">.<\/span><span class=\"token function\">get<\/span><span class=\"token punctuation\">(<\/span>pictureId<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 2. \u96c6\u5408\u4e0d\u4e3a\u7a7a, \u64ad\u653e\u5e7f\u64ad<\/span><br \/>\n    <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span><span class=\"token class-name\">ObjUtil<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">isNotEmpty<\/span><span class=\"token punctuation\">(<\/span>sessionSet<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ 3. \u904d\u5386\u4f1a\u8bdd\u96c6\u5408\u4e2d\u7684\u6bcf\u4e00\u4e2a\u4f1a\u8bdd<\/span><br \/>\n        <span class=\"token keyword\">for<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">WebSocketSession<\/span> session <span class=\"token operator\">:<\/span> sessionSet<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span><\/p>\n<p>            <span class=\"token comment\">\/\/ 8. \u521b\u5efa ObjectMapper \u5bf9\u8c61, \u6ce8\u610f\u5305\u662f jackson<\/span><br \/>\n            <span class=\"token class-name\">ObjectMapper<\/span> objectMapper <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token class-name\">ObjectMapper<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token comment\">\/\/ 9. \u914d\u7f6e\u5e8f\u5217\u5316: \u5c06 Long \u7c7b\u578b\u8f6c\u4e3a String , \u89e3\u51b3\u7cbe\u5ea6\u4e22\u5931\u7684\u95ee\u9898<\/span><br \/>\n            <span class=\"token class-name\">SimpleModule<\/span> <span class=\"token keyword\">module<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token class-name\">SimpleModule<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">module<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">addSerializer<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">Long<\/span><span class=\"token punctuation\">.<\/span><span class=\"token keyword\">class<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">ToStringSerializer<\/span><span class=\"token punctuation\">.<\/span>instance<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">module<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">addSerializer<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">Long<\/span><span class=\"token punctuation\">.<\/span><span class=\"token constant\">TYPE<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">ToStringSerializer<\/span><span class=\"token punctuation\">.<\/span>instance<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            objectMapper<span class=\"token punctuation\">.<\/span><span class=\"token function\">registerModule<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">module<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>            <span class=\"token comment\">\/\/ 10. \u5c06 pictureEditResponseMessage \u7684\u6240\u6709\u5c5e\u6027\u5e8f\u5217\u5316\u4e3a JSON \u5b57\u7b26\u4e32<\/span><br \/>\n            <span class=\"token class-name\">String<\/span> message <span class=\"token operator\">&#061;<\/span> objectMapper<span class=\"token punctuation\">.<\/span><span class=\"token function\">writeValueAsString<\/span><span class=\"token punctuation\">(<\/span>pictureEditResponseMessage<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token comment\">\/\/ \u53ef\u4ee5\u5904\u7406: pictureEditResponseMessage \u7684 UserVO \u7684 Long \u8f6c\u4e3a String \u7684\u60c5\u51b5, Hutool \u4e0d\u884c\u6216\u8005\u5f88\u9ebb\u70e6<\/span><\/p>\n<p>            <span class=\"token comment\">\/\/ 11. \u6ce8\u91ca\u6389 5\u30016, \u5c06\u5b8c\u5168\u8f6c\u6362\u4e3a String \u7684\u7f16\u8f91\u8bf7\u6c42\u4f20\u5165\u4f1a\u8bdd\u4fe1\u606f\u4e2d<\/span><br \/>\n            <span class=\"token class-name\">TextMessage<\/span> textMessage <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token class-name\">TextMessage<\/span><span class=\"token punctuation\">(<\/span>message<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>            <span class=\"token comment\">\/\/ 5. \u5c06\u5f53\u524d\u7f16\u8f91\u7684\u54cd\u5e94\u4fe1\u606f, \u4ece JSON \u8f6c\u4e3a JSON \u683c\u5f0f\u7684 String<\/span><br \/>\n            <span class=\"token comment\">\/\/ String str &#061; JSONUtil.toJsonStr(pictureEditResponseMessage);<\/span><\/p>\n<p>            <span class=\"token comment\">\/\/ 6. \u521b\u5efa\u4e00\u4e2a TextMessage \u5bf9\u8c61, \u5c06\u7f16\u8f91\u4fe1\u606f\u5b57\u7b26\u4e32\u4f5c\u4e3a\u53c2\u6570, \u8c03\u7528\u5bf9\u5e94\u7684\u6784\u9020\u65b9\u6cd5<\/span><br \/>\n            <span class=\"token comment\">\/\/ TextMessage textMessage &#061; new TextMessage(str);<\/span><\/p>\n<p>            <span class=\"token comment\">\/\/ 4. \u5224\u65ad\u5f53\u524d\u4f1a\u8bdd\u5143\u7d20\u662f\u5426\u4e3a\u5f00\u542f\u7684\u72b6\u6001<\/span><br \/>\n            <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>session<span class=\"token punctuation\">.<\/span><span class=\"token function\">isOpen<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span><\/p>\n<p>                <span class=\"token comment\">\/\/ 13. \u5bf9\u4f1a\u8bdd\u96c6\u5408\u4e2d, \u9664\u4e86\u7f16\u8f91\u8005\u672c\u4eba session \u5916\u7684\u6240\u6709 session, \u5e7f\u64ad\u5f53\u524d\u7f16\u8f91\u8005\u7f16\u8f91\u64cd\u4f5c\u7684\u4fe1\u606f<\/span><br \/>\n                <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>excludeSession <span class=\"token operator\">!&#061;<\/span> <span class=\"token keyword\">null<\/span> <span class=\"token operator\">&amp;&amp;<\/span> session<span class=\"token punctuation\">.<\/span><span class=\"token function\">equals<\/span><span class=\"token punctuation\">(<\/span>excludeSession<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span><br \/>\n                    <span class=\"token comment\">\/\/ \u5f53\u524d\u7f16\u8f91\u8005\u4e0d\u53d1\u9001\u4fe1\u606f<\/span><br \/>\n                    <span class=\"token keyword\">continue<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><\/p>\n<p>                <span class=\"token comment\">\/\/ 7. \u5c06 TextMessage \u5bf9\u8c61(\u5f53\u524d\u7f16\u8f91\u8005\u7f16\u8f91\u64cd\u4f5c\u7684\u4fe1\u606f)\u4f5c\u4e3a\u53c2\u6570, \u4f20\u5165\u4f1a\u8bdd\u5143\u7d20\u7684\u4fe1\u606f\u5c5e\u6027\u4e2d<\/span><br \/>\n                session<span class=\"token punctuation\">.<\/span><span class=\"token function\">sendMessage<\/span><span class=\"token punctuation\">(<\/span>textMessage<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token comment\">\/\/ sendMessage() \u9700\u8981\u629b\u5f02\u5e38<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ 14. \u7f16\u5199\u4e00\u4e2a\u91cd\u8f7d\u65b9\u6cd5, \u652f\u6301\u4e0d\u4f20 WebSocketSession excludeSession \u53c2\u6570<\/span><br \/>\n<span class=\"token keyword\">private<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token function\">broadcastToPicture<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">Long<\/span> pictureId<span class=\"token punctuation\">,<\/span><span class=\"token class-name\">PictureEditResponseMessage<\/span>  pictureEditResponseMessage<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">throws<\/span> <span class=\"token class-name\">Exception<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u8c03\u7528\u5199\u597d\u7684\u65b9\u6cd5, excludeSession \u4f20 null, \u80fd\u5904\u7406\u66f4\u591a\u79cd\u60c5\u51b5<\/span><br \/>\n    <span class=\"token function\">broadcastToPicture<\/span><span class=\"token punctuation\">(<\/span>pictureId<span class=\"token punctuation\">,<\/span> pictureEditResponseMessage<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">null<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<hr \/>\n<p>\u4e0a\u8ff0\u4ee3\u7801\u4e2d\u6709\u4e2a\u5c0f\u7ec6\u8282&#xff08;\u6ce8\u91ca 8~11&#xff09;&#xff1a;<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/08\/20250812082024-689af9482246e.png\" alt=\"image-20250809095430825\" \/><\/p>\n<p>\u524d\u7aef JS \u65e0\u6cd5\u63a5\u6536 Long \u7c7b\u578b\u7684\u5c5e\u6027(\u7b2c\u4e00\u671f\u7f16\u5199 config.JsonConfig \u89e3\u51b3 Long \u7c7b\u578b\u7cbe\u5ea6\u4e22\u5931\u95ee\u9898, \u4e5f\u5c31\u662f\u5c06 HTTP \u54cd\u5e94\u7684\u4fe1\u606f\u4ece Long \u8f6c String \u518d\u8fd4\u56de\u7ed9\u524d\u7aef)&#xff1a;<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/08\/20250812082026-689af94a6b0e2.png\" alt=\"image-20250809094118288\" \/><\/p>\n<p><span class=\"token annotation punctuation\">&#064;JsonComponent<\/span><br \/>\n<span class=\"token keyword\">public<\/span> <span class=\"token keyword\">class<\/span> <span class=\"token class-name\">JsonConfig<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/**<br \/>\n     * \u6dfb\u52a0 Long \u8f6c json \u7cbe\u5ea6\u4e22\u5931\u7684\u914d\u7f6e<br \/>\n     *\/<\/span><br \/>\n    <span class=\"token annotation punctuation\">&#064;Bean<\/span><br \/>\n    <span class=\"token keyword\">public<\/span> <span class=\"token class-name\">ObjectMapper<\/span> <span class=\"token function\">jacksonObjectMapper<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">Jackson2ObjectMapperBuilder<\/span> builder<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token class-name\">ObjectMapper<\/span> objectMapper <span class=\"token operator\">&#061;<\/span> builder<span class=\"token punctuation\">.<\/span><span class=\"token function\">createXmlMapper<\/span><span class=\"token punctuation\">(<\/span><span class=\"token boolean\">false<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">build<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token class-name\">SimpleModule<\/span> <span class=\"token keyword\">module<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token class-name\">SimpleModule<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">module<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">addSerializer<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">Long<\/span><span class=\"token punctuation\">.<\/span><span class=\"token keyword\">class<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">ToStringSerializer<\/span><span class=\"token punctuation\">.<\/span>instance<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">module<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">addSerializer<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">Long<\/span><span class=\"token punctuation\">.<\/span><span class=\"token constant\">TYPE<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">ToStringSerializer<\/span><span class=\"token punctuation\">.<\/span>instance<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        objectMapper<span class=\"token punctuation\">.<\/span><span class=\"token function\">registerModule<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">module<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> objectMapper<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u7531\u4e8e\u524d\u7aef JS \u7684\u957f\u6574\u6570\u53ef\u80fd\u4f1a\u4e22\u5931\u7cbe\u5ea6&#xff0c;\u6240\u4ee5\u4f7f\u7528 Jackson \u81ea\u5b9a\u4e49\u5e8f\u5217\u5316\u5668&#xff0c;\u5728\u5c06\u5bf9\u8c61\u8f6c\u6362\u4e3a JSON \u5b57\u7b26\u4e32\u65f6&#xff0c;\u5c06 Long \u7c7b\u578b\u8f6c\u6362\u4e3a String \u7c7b\u578b&#xff1b;<\/p>\n<p>HTTP \u8bf7\u6c42\u9700\u8981\u7ecf\u8fc7\u8fd9\u6837\u7684\u5904\u7406&#xff0c;\u624d\u53ef\u4ee5\u8fd4\u56de\u54cd\u5e94\u7ed9\u524d\u7aef&#xff0c;\u6211\u4eec\u5f53\u524d\u7684 WebSocket \u8bf7\u6c42\u4e5f\u9700\u8981\u5904\u7406 Long \u7c7b\u578b\u7cbe\u5ea6\u4e22\u5931\u7684\u95ee\u9898&#xff1b;<\/p>\n<p>\u5426\u5219\u65e0\u6cd5\u62ff\u5230\u6b63\u5728\u7f16\u8f91\u56fe\u7247\u7684\u7528\u6237\u6b63\u786e\u7684 ID&#xff0c;\u5c31\u4e0d\u597d\u5224\u65ad\u8be5\u7528\u6237\u662f\u5426\u6709\u6743\u9650\u7f16\u8f91\u8be5\u56fe\u7247\u4e86\u3002<\/p>\n<hr \/>\n<h4><font color=\"gree\"><font face=\"\u534e\u6587\u884c\u6977\"><font size=\"6\">(4) \u5b9e\u73b0\u8fde\u63a5\u5efa\u7acb\u6210\u529f\u540e\u6267\u884c\u7684\u65b9\u6cd5<\/font><\/font><\/font><\/h4>\n<hr \/>\n<p>\u5b9e\u73b0\u8fde\u63a5\u5efa\u7acb\u6210\u529f\u540e\u6267\u884c\u7684\u65b9\u6cd5&#xff0c;\u4fdd\u5b58\u4f1a\u8bdd\u5230\u96c6\u5408\u4e2d&#xff0c;\u5e76\u4e14\u7ed9\u5176\u4ed6\u4f1a\u8bdd\u53d1\u9001\u6d88\u606f&#xff1a;<\/p>\n<p><span class=\"token annotation punctuation\">&#064;Resource<\/span><br \/>\n<span class=\"token keyword\">private<\/span> <span class=\"token class-name\">UserService<\/span> userService<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token annotation punctuation\">&#064;Override<\/span><br \/>\n<span class=\"token keyword\">public<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token function\">afterConnectionEstablished<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">WebSocketSession<\/span> session<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">throws<\/span> <span class=\"token class-name\">Exception<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ 1. \u5728 WebSocket \u62e6\u622a\u5668\u6743\u9650\u6821\u9a8c\u4e2d, \u6211\u4eec\u5728 attributes(WebSocketSession \u53c2\u6570) \u4e2d\u8bbe\u7f6e\u4e86\u767b\u5f55\u7528\u6237\u3001\u56fe\u7247 id<\/span><br \/>\n    <span class=\"token comment\">\/\/ 2. \u4ece session \u5c5e\u6027\u4e2d\u83b7\u53d6\u5230\u5f53\u524d\u767b\u5f55\u7528\u6237\u6d88\u606f, \u5f53\u524d\u7f16\u8f91\u56fe\u7247\u7684 id<\/span><br \/>\n    <span class=\"token class-name\">User<\/span> user <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token class-name\">User<\/span><span class=\"token punctuation\">)<\/span> session<span class=\"token punctuation\">.<\/span><span class=\"token function\">getAttributes<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">get<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;user&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token class-name\">Long<\/span> pictureId <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token class-name\">Long<\/span><span class=\"token punctuation\">)<\/span> session<span class=\"token punctuation\">.<\/span><span class=\"token function\">getAttributes<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">get<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;pictureId&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ 3. \u4fdd\u5b58\u4f1a\u8bdd\u5230\u96c6\u5408\u4e2d<\/span><br \/>\n    <span class=\"token comment\">\/\/ 4. \u5982\u679c\u662f\u9996\u6b21\u5c06\u4f1a\u8bdd\u4fdd\u5b58\u5230 pictureSessions \u4e2d,\u6b64\u65f6\u9700\u8981\u521d\u59cb\u5316 pictureSessions \u7a7a\u96c6\u5408 <\/span><br \/>\n    pictureSessions<span class=\"token punctuation\">.<\/span><span class=\"token function\">putIfAbsent<\/span><span class=\"token punctuation\">(<\/span>pictureId<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">ConcurrentHashMap<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">newKeySet<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 5. \u4fdd\u5b58\u4f1a\u8bdd\u5230\u96c6\u5408\u4e2d<\/span><br \/>\n    pictureSessions<span class=\"token punctuation\">.<\/span><span class=\"token function\">get<\/span><span class=\"token punctuation\">(<\/span>pictureId<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">add<\/span><span class=\"token punctuation\">(<\/span>session<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 6. \u6784\u9020\u7f16\u8f91\u54cd\u5e94\u6d88\u606f<\/span><br \/>\n    <span class=\"token class-name\">PictureEditResponseMessage<\/span> pictureEditResponseMessage <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token class-name\">PictureEditResponseMessage<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    pictureEditResponseMessage<span class=\"token punctuation\">.<\/span><span class=\"token function\">setType<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;ENTER_EDIT&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ 7. \u6784\u9020\u8fd4\u56de\u7ed9\u524d\u7aef\u7684\u6d88\u606f<\/span><br \/>\n    <span class=\"token class-name\">String<\/span> message <span class=\"token operator\">&#061;<\/span> <span class=\"token class-name\">String<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">format<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\u7528\u6237 %s \u52a0\u5165\u7f16\u8f91&#034;<\/span><span class=\"token punctuation\">,<\/span> user<span class=\"token punctuation\">.<\/span><span class=\"token function\">getUserName<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    pictureEditResponseMessage<span class=\"token punctuation\">.<\/span><span class=\"token function\">setMessage<\/span><span class=\"token punctuation\">(<\/span>message<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 8. \u7f16\u8f91\u52a8\u4f5c\u4e0d\u7528\u8bbe\u7f6e, \u56e0\u4e3a\u5f53\u524d\u8bbe\u7f6e\u7684\u54cd\u5e94\u662f\u7528\u6237\u52a0\u5165\u7f16\u8f91\u64cd\u4f5c<\/span><br \/>\n    <span class=\"token comment\">\/\/ pictureEditResponseMessage.setEditAction();<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 9. \u8bbe\u7f6e\u8131\u654f\u540e\u7684\u7528\u6237\u6d88\u606f\u5230\u54cd\u5e94\u4e2d<\/span><br \/>\n    pictureEditResponseMessage<span class=\"token punctuation\">.<\/span><span class=\"token function\">setUser<\/span><span class=\"token punctuation\">(<\/span>userService<span class=\"token punctuation\">.<\/span><span class=\"token function\">getUserVO<\/span><span class=\"token punctuation\">(<\/span>user<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 10. \u5e7f\u64ad&#034;\u52a0\u5165\u7f16\u8f91\u4fe1\u606f&#034;\u7ed9\u5f53\u524d\u4f1a\u8bdd\u96c6\u5408\u7684\u6240\u6709\u4f1a\u8bdd\u5143\u7d20. \u5305\u62ec\u81ea\u5df1<\/span><br \/>\n    <span class=\"token function\">broadcastToPicture<\/span><span class=\"token punctuation\">(<\/span>pictureId<span class=\"token punctuation\">,<\/span> pictureEditResponseMessage<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<hr \/>\n<h4><font color=\"gree\"><font face=\"\u534e\u6587\u884c\u6977\"><font size=\"6\">(5) \u7f16\u5199\u63a5\u6536\u5ba2\u6237\u7aef\u6d88\u606f\u7684\u65b9\u6cd5<\/font><\/font><\/font><\/h4>\n<hr \/>\n<p>\u7f16\u5199\u63a5\u6536\u5ba2\u6237\u7aef\u6d88\u606f\u7684\u65b9\u6cd5&#xff0c;\u6839\u636e\u6d88\u606f\u7c7b\u522b\u6267\u884c\u4e0d\u540c\u7684\u5904\u7406&#xff1a;<\/p>\n<p><span class=\"token annotation punctuation\">&#064;Override<\/span><br \/>\n<span class=\"token keyword\">protected<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token function\">handleTextMessage<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">WebSocketSession<\/span> session<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">TextMessage<\/span> message<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">throws<\/span> <span class=\"token class-name\">Exception<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ 1. \u4ece TextMessage(JSON \u7c7b\u578b\u5b57\u7b26\u4e32) \u83b7\u53d6\u524d\u7aef\u53d1\u9001\u7684\u6d88\u606f\u5185\u5bb9 , \u5c06 JSON \u5b57\u7b26\u4e32\u8f6c\u6362\u4e3a PictureEditMessage<\/span><br \/>\n    <span class=\"token class-name\">PictureEditRequestMessage<\/span> pictureEditRequestMessage <span class=\"token operator\">&#061;<\/span> <span class=\"token class-name\">JSONUtil<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">toBean<\/span><span class=\"token punctuation\">(<\/span>message<span class=\"token punctuation\">.<\/span><span class=\"token function\">getPayload<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">PictureEditRequestMessage<\/span><span class=\"token punctuation\">.<\/span><span class=\"token keyword\">class<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u8fd9\u91cc\u4e0d\u9700\u8981\u914d\u7f6e\u81ea\u5b9a\u4e49 JSON \u5e8f\u5217\u5316, \u56e0\u4e3a\u524d\u7aef\u53d1\u9001\u7684\u6d88\u606f(\u5305\u62ec userId)\u672c\u6765\u5c31\u662f String \u7c7b\u578b\u4e86, \u6b63\u5e38\u89e3\u6790\u5373\u53ef<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 2. \u5c06 PictureEditMessage \u4e2d\u7684 type \u5c5e\u6027, \u8f6c\u4e3a\u6211\u4eec\u81ea\u5b9a\u4e49\u7684\u679a\u4e3e\u7c7b<\/span><br \/>\n    <span class=\"token class-name\">String<\/span> type <span class=\"token operator\">&#061;<\/span> pictureEditRequestMessage<span class=\"token punctuation\">.<\/span><span class=\"token function\">getType<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token class-name\">PictureEditMessageTypeEnum<\/span> pictureEditMessageTypeEnum <span class=\"token operator\">&#061;<\/span> <span class=\"token class-name\">PictureEditMessageTypeEnum<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">getEnumByValue<\/span><span class=\"token punctuation\">(<\/span>type<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 4. \u4ece session \u4e2d\u83b7\u53d6\u516c\u5171\u53c2\u6570<\/span><br \/>\n    <span class=\"token class-name\">User<\/span> user <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token class-name\">User<\/span><span class=\"token punctuation\">)<\/span> session<span class=\"token punctuation\">.<\/span><span class=\"token function\">getAttributes<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">get<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;user&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token class-name\">Long<\/span> pictureId <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token class-name\">Long<\/span><span class=\"token punctuation\">)<\/span> session<span class=\"token punctuation\">.<\/span><span class=\"token function\">getAttributes<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">get<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;pictureId&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 3. \u6839\u636e PictureEditMessageTypeEnum \u7684\u503c, \u4e5f\u5c31\u662f\u6839\u636e\u6d88\u606f\u7c7b\u578b, \u8fdb\u884c\u5bf9\u5e94\u7684\u5904\u7406<\/span><br \/>\n    <span class=\"token keyword\">switch<\/span> <span class=\"token punctuation\">(<\/span>pictureEditMessageTypeEnum<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">case<\/span> <span class=\"token constant\">ENTER_EDIT<\/span><span class=\"token operator\">:<\/span><br \/>\n            <span class=\"token function\">handleEnterEditMessage<\/span><span class=\"token punctuation\">(<\/span>pictureEditRequestMessage<span class=\"token punctuation\">,<\/span> session<span class=\"token punctuation\">,<\/span> user<span class=\"token punctuation\">,<\/span> pictureId<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">case<\/span> <span class=\"token constant\">EXIT_EDIT<\/span><span class=\"token operator\">:<\/span><br \/>\n            <span class=\"token function\">handleEditActionMessage<\/span><span class=\"token punctuation\">(<\/span>pictureEditRequestMessage<span class=\"token punctuation\">,<\/span> session<span class=\"token punctuation\">,<\/span> user<span class=\"token punctuation\">,<\/span> pictureId<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">case<\/span> <span class=\"token constant\">EDIT_ACTION<\/span><span class=\"token operator\">:<\/span><br \/>\n            <span class=\"token function\">handleExitEditMessage<\/span><span class=\"token punctuation\">(<\/span>pictureEditRequestMessage<span class=\"token punctuation\">,<\/span> session<span class=\"token punctuation\">,<\/span> user<span class=\"token punctuation\">,<\/span> pictureId<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">default<\/span><span class=\"token operator\">:<\/span><br \/>\n            <span class=\"token comment\">\/\/ \u6536\u5230 info \u3001error \u7c7b\u578b\u7684\u6d88\u606f, \u5982\u679c\u662f error, \u8bf4\u660e\u7528\u6237\u53c2\u6570\u4f20\u9012\u9519\u8bef, \u53ea\u7ed9\u5f53\u524d\u7528\u6237\u53d1\u9001\u4fe1\u606f<\/span><br \/>\n            <span class=\"token class-name\">PictureEditResponseMessage<\/span> pictureEditResponseMessage <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token class-name\">PictureEditResponseMessage<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            pictureEditResponseMessage<span class=\"token punctuation\">.<\/span><span class=\"token function\">setType<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">PictureEditMessageTypeEnum<\/span><span class=\"token punctuation\">.<\/span><span class=\"token constant\">ERROR<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">getValue<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            pictureEditResponseMessage<span class=\"token punctuation\">.<\/span><span class=\"token function\">setMessage<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\u6d88\u606f\u7c7b\u578b\u9519\u8bef&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            pictureEditResponseMessage<span class=\"token punctuation\">.<\/span><span class=\"token function\">setUser<\/span><span class=\"token punctuation\">(<\/span>userService<span class=\"token punctuation\">.<\/span><span class=\"token function\">getUserVO<\/span><span class=\"token punctuation\">(<\/span>user<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token comment\">\/\/ \u8fd9\u91cc\u4e25\u683c\u6765\u8bf4\u4e5f\u9700\u8981\u5904\u7406 Long \u7cbe\u5ea6\u4e22\u5931, \u4f46\u662f\u8fd9\u4e2a switch \u60c5\u51b5\u53ea\u662f\u4e00\u4e2a\u9519\u8bef\u6d88\u606f, \u5c31\u4e0d\u8f6c\u4e86<\/span><br \/>\n            session<span class=\"token punctuation\">.<\/span><span class=\"token function\">sendMessage<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">new<\/span> <span class=\"token class-name\">TextMessage<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">JSONUtil<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">toJsonStr<\/span><span class=\"token punctuation\">(<\/span>pictureEditRequestMessage<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<hr \/>\n<h4><font color=\"gree\"><font face=\"\u534e\u6587\u884c\u6977\"><font size=\"6\">(6) \u7f16\u5199\u6bcf\u4e2a\u5904\u7406\u6d88\u606f\u7684\u65b9\u6cd5<\/font><\/font><\/font><\/h4>\n<hr \/>\n<p>1. \u63a5\u4e0b\u6765\u4f9d\u6b21\u7f16\u5199\u6bcf\u4e2a\u5904\u7406\u6d88\u606f\u7684\u65b9\u6cd5\u3002\u9996\u5148\u662f\u7528\u6237\u8fdb\u5165\u7f16\u8f91\u72b6\u6001&#xff0c;\u8981\u8bbe\u7f6e\u5f53\u524d\u7528\u6237\u4e3a\u7f16\u8f91\u7528\u6237&#xff0c;\u5e76\u4e14\u5411\u5176\u4ed6\u5ba2\u6237\u7aef\u53d1\u9001\u6d88\u606f&#xff1a;<\/p>\n<p><span class=\"token comment\">\/**<br \/>\n* \u8fdb\u5165\u7f16\u8f91\u72b6\u6001<br \/>\n* &#064;param pictureEditRequestMessage<br \/>\n* &#064;param session<br \/>\n* &#064;param user<br \/>\n* &#064;param pictureId<br \/>\n*\/<\/span><br \/>\n<span class=\"token keyword\">public<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token function\">handleEnterEditMessage<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">PictureEditRequestMessage<\/span> pictureEditRequestMessage<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">WebSocketSession<\/span> session<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">User<\/span> user<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">Long<\/span> pictureId<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">throws<\/span> <span class=\"token class-name\">Exception<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token comment\">\/\/ 1. \u6ca1\u6709\u7528\u6237\u6b63\u5728\u7f16\u8f91\u56fe\u7247(\u7f16\u8f91\u5217\u8868\u4e2d\u6ca1\u6709\u8be5\u56fe\u7247, \u8bf4\u660e\u6ca1\u6709\u5176\u4ed6\u7528\u6237\u6b63\u5728\u7f16\u8f91), \u624d\u80fd\u8fdb\u5165\u7f16\u8f91<\/span><br \/>\n <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>pictureEditingUsers<span class=\"token punctuation\">.<\/span><span class=\"token function\">containsKey<\/span><span class=\"token punctuation\">(<\/span>pictureId<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span><br \/>\n     <span class=\"token comment\">\/\/ 2. \u8bbe\u7f6e\u5f53\u524d\u7528\u6237\u6b63\u5728\u7f16\u8f91\u8be5\u56fe\u7247<\/span><br \/>\n     pictureEditingUsers<span class=\"token punctuation\">.<\/span><span class=\"token function\">put<\/span><span class=\"token punctuation\">(<\/span>pictureId<span class=\"token punctuation\">,<\/span> user<span class=\"token punctuation\">.<\/span><span class=\"token function\">getId<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>     <span class=\"token comment\">\/\/ 3. \u6784\u9020\u54cd\u5e94, \u53d1\u9001\u52a0\u5165\u7f16\u8f91\u7684\u6d88\u606f\u901a\u77e5<\/span><br \/>\n     <span class=\"token class-name\">PictureEditResponseMessage<\/span> pictureEditResponseMessage <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token class-name\">PictureEditResponseMessage<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n     pictureEditResponseMessage<span class=\"token punctuation\">.<\/span><span class=\"token function\">setType<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">PictureEditMessageTypeEnum<\/span><span class=\"token punctuation\">.<\/span><span class=\"token constant\">ENTER_EDIT<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">getValue<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n     <span class=\"token class-name\">String<\/span> message <span class=\"token operator\">&#061;<\/span> <span class=\"token class-name\">String<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">format<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\u7528\u6237 %s \u5f00\u59cb\u7f16\u8f91\u56fe\u7247&#034;<\/span><span class=\"token punctuation\">,<\/span> user<span class=\"token punctuation\">.<\/span><span class=\"token function\">getUserName<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n     pictureEditResponseMessage<span class=\"token punctuation\">.<\/span><span class=\"token function\">setMessage<\/span><span class=\"token punctuation\">(<\/span>message<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n     pictureEditResponseMessage<span class=\"token punctuation\">.<\/span><span class=\"token function\">setUser<\/span><span class=\"token punctuation\">(<\/span>userService<span class=\"token punctuation\">.<\/span><span class=\"token function\">getUserVO<\/span><span class=\"token punctuation\">(<\/span>user<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>     <span class=\"token comment\">\/\/ 4. \u5e7f\u64ad\u7ed9\u6240\u6709\u7528\u6237<\/span><br \/>\n     <span class=\"token function\">broadcastToPicture<\/span><span class=\"token punctuation\">(<\/span>pictureId<span class=\"token punctuation\">,<\/span> pictureEditResponseMessage<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<hr \/>\n<p>2. \u7528\u6237\u6267\u884c\u7f16\u8f91\u64cd\u4f5c\u65f6&#xff0c;\u5c06\u8be5\u64cd\u4f5c\u540c\u6b65\u7ed9 \u9664\u4e86\u5f53\u524d\u7528\u6237\u4e4b\u5916 \u7684\u5176\u4ed6\u5ba2\u6237\u7aef&#xff0c;\u4e5f\u5c31\u662f\u8bf4\u7f16\u8f91\u64cd\u4f5c\u4e0d\u7528\u518d\u540c\u6b65\u7ed9\u81ea\u5df1&#xff1a;<\/p>\n<p><span class=\"token comment\">\/**<br \/>\n * \u7528\u6237\u6b63\u5728\u7f16\u8f91<br \/>\n * &#064;param pictureEditRequestMessage<br \/>\n * &#064;param session<br \/>\n * &#064;param user<br \/>\n * &#064;param pictureId<br \/>\n * &#064;throws Exception<br \/>\n *\/<\/span><br \/>\n<span class=\"token keyword\">public<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token function\">handleEditActionMessage<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">PictureEditRequestMessage<\/span> pictureEditRequestMessage<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">WebSocketSession<\/span> session<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">User<\/span> user<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">Long<\/span> pictureId<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">throws<\/span> <span class=\"token class-name\">Exception<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ 1. \u5982\u679c\u5f53\u524d\u56fe\u7247\u7684\u7f16\u8f91\u7528\u6237, \u4e0d\u662f\u6b63\u5728\u7f16\u8f91\u7684\u4eba, \u4e0d\u80fd\u7f16\u8f91<\/span><br \/>\n    <span class=\"token class-name\">Long<\/span> editingUserId <span class=\"token operator\">&#061;<\/span> pictureEditingUsers<span class=\"token punctuation\">.<\/span><span class=\"token function\">get<\/span><span class=\"token punctuation\">(<\/span>pictureId<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ 2. \u83b7\u53d6\u7f16\u8f91\u64cd\u4f5c<\/span><br \/>\n    <span class=\"token class-name\">String<\/span> editAction <span class=\"token operator\">&#061;<\/span> pictureEditRequestMessage<span class=\"token punctuation\">.<\/span><span class=\"token function\">getEditAction<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token class-name\">PictureEditActionEnum<\/span> actionEnum <span class=\"token operator\">&#061;<\/span> <span class=\"token class-name\">PictureEditActionEnum<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">getEnumByValue<\/span><span class=\"token punctuation\">(<\/span>editAction<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ 3. \u7f16\u8f91\u64cd\u4f5c\u4e0d\u5b58\u5728, \u6253\u65e5\u5fd7<\/span><br \/>\n    <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>actionEnum <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token keyword\">null<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span><br \/>\n        log<span class=\"token punctuation\">.<\/span><span class=\"token function\">error<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\u65e0\u6548\u7684\u7f16\u8f91\u52a8\u4f5c&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">return<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token comment\">\/\/ 4. \u786e\u8ba4\u5f53\u524d\u7528\u6237\u662f\u56fe\u7247\u7684\u7f16\u8f91\u8005<\/span><br \/>\n    <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>editingUserId <span class=\"token operator\">!&#061;<\/span> <span class=\"token keyword\">null<\/span> <span class=\"token operator\">&amp;&amp;<\/span> editingUserId<span class=\"token punctuation\">.<\/span><span class=\"token function\">equals<\/span><span class=\"token punctuation\">(<\/span>user<span class=\"token punctuation\">.<\/span><span class=\"token function\">getId<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ 5. \u6784\u9020\u54cd\u5e94\u4fe1\u606f, \u544a\u77e5\u5176\u4ed6\u7f16\u8f91\u8005\u5f53\u524d\u7528\u6237\u7684\u7f16\u8f91\u64cd\u4f5c<\/span><br \/>\n        <span class=\"token class-name\">PictureEditResponseMessage<\/span> pictureEditResponseMessage <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token class-name\">PictureEditResponseMessage<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        pictureEditResponseMessage<span class=\"token punctuation\">.<\/span><span class=\"token function\">setType<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">PictureEditMessageTypeEnum<\/span><span class=\"token punctuation\">.<\/span><span class=\"token constant\">EDIT_ACTION<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">getValue<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token class-name\">String<\/span> message <span class=\"token operator\">&#061;<\/span> <span class=\"token class-name\">String<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">format<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;%s \u6267\u884c\u4e86 %s&#034;<\/span><span class=\"token punctuation\">,<\/span> user<span class=\"token punctuation\">.<\/span><span class=\"token function\">getUserName<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> actionEnum<span class=\"token punctuation\">.<\/span><span class=\"token function\">getText<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        pictureEditResponseMessage<span class=\"token punctuation\">.<\/span><span class=\"token function\">setMessage<\/span><span class=\"token punctuation\">(<\/span>message<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        pictureEditResponseMessage<span class=\"token punctuation\">.<\/span><span class=\"token function\">setEditAction<\/span><span class=\"token punctuation\">(<\/span>editAction<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        pictureEditResponseMessage<span class=\"token punctuation\">.<\/span><span class=\"token function\">setUser<\/span><span class=\"token punctuation\">(<\/span>userService<span class=\"token punctuation\">.<\/span><span class=\"token function\">getUserVO<\/span><span class=\"token punctuation\">(<\/span>user<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ 6. \u5e7f\u64ad\u9664\u4e86\u5f53\u524d\u7f16\u8f91\u8005\u5916\u7684\u5176\u4ed6\u7528\u6237, \u5426\u5219\u4f1a\u9020\u6210\u91cd\u590d\u7f16\u8f91<\/span><br \/>\n        <span class=\"token function\">broadcastToPicture<\/span><span class=\"token punctuation\">(<\/span>pictureId<span class=\"token punctuation\">,<\/span> pictureEditResponseMessage<span class=\"token punctuation\">,<\/span> session<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<hr \/>\n<p>3. \u7528\u6237\u9000\u51fa\u7f16\u8f91\u64cd\u4f5c\u65f6&#xff0c;\u79fb\u9664\u5f53\u524d\u7528\u6237\u7684\u7f16\u8f91\u72b6\u6001&#xff0c;\u5e76\u4e14\u5411\u5176\u4ed6\u5ba2\u6237\u7aef\u53d1\u9001\u6d88\u606f&#xff1a;<\/p>\n<p><span class=\"token comment\">\/**<br \/>\n * \u7528\u6237\u9000\u51fa\u7f16\u8f91<br \/>\n * &#064;param pictureEditRequestMessage<br \/>\n * &#064;param session<br \/>\n * &#064;param user<br \/>\n * &#064;param pictureId<br \/>\n *\/<\/span><br \/>\n<span class=\"token keyword\">public<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token function\">handleExitEditMessage<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">PictureEditRequestMessage<\/span> pictureEditRequestMessage<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">WebSocketSession<\/span> session<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">User<\/span> user<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">Long<\/span> pictureId<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">throws<\/span> <span class=\"token class-name\">Exception<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ 1. \u83b7\u53d6\u5f53\u524d\u56fe\u7247\u5bf9\u5e94\u7684\u7f16\u8f91\u8005 ID <\/span><br \/>\n    <span class=\"token class-name\">Long<\/span> editingUserId <span class=\"token operator\">&#061;<\/span> pictureEditingUsers<span class=\"token punctuation\">.<\/span><span class=\"token function\">get<\/span><span class=\"token punctuation\">(<\/span>pictureId<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ 2. \u786e\u8ba4\u5f53\u524d\u7f16\u8f91\u8005\u662f\u5f53\u524d\u767b\u5f55\u7528\u6237<\/span><br \/>\n    <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>editingUserId <span class=\"token operator\">!&#061;<\/span> <span class=\"token keyword\">null<\/span> <span class=\"token operator\">&amp;&amp;<\/span> editingUserId<span class=\"token punctuation\">.<\/span><span class=\"token function\">equals<\/span><span class=\"token punctuation\">(<\/span>user<span class=\"token punctuation\">.<\/span><span class=\"token function\">getId<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ 3. \u4ece pictureEditingUsers \u79fb\u9664\u8be5 entry&lt;\u56fe\u7247 ID, \u7528\u6237 ID&gt;<\/span><br \/>\n        pictureEditingUsers<span class=\"token punctuation\">.<\/span><span class=\"token function\">remove<\/span><span class=\"token punctuation\">(<\/span>pictureId<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ 4. \u6784\u9020\u54cd\u5e94\u4fe1\u606f<\/span><br \/>\n        <span class=\"token class-name\">PictureEditResponseMessage<\/span> pictureEditResponseMessage <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token class-name\">PictureEditResponseMessage<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        pictureEditResponseMessage<span class=\"token punctuation\">.<\/span><span class=\"token function\">setType<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">PictureEditMessageTypeEnum<\/span><span class=\"token punctuation\">.<\/span><span class=\"token constant\">EXIT_EDIT<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">getValue<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token class-name\">String<\/span> message <span class=\"token operator\">&#061;<\/span> <span class=\"token class-name\">String<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">format<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;%s \u9000\u51fa\u7f16\u8f91&#034;<\/span><span class=\"token punctuation\">,<\/span> user<span class=\"token punctuation\">.<\/span><span class=\"token function\">getUserName<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        pictureEditResponseMessage<span class=\"token punctuation\">.<\/span><span class=\"token function\">setMessage<\/span><span class=\"token punctuation\">(<\/span>message<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        pictureEditResponseMessage<span class=\"token punctuation\">.<\/span><span class=\"token function\">setUser<\/span><span class=\"token punctuation\">(<\/span>userService<span class=\"token punctuation\">.<\/span><span class=\"token function\">getUserVO<\/span><span class=\"token punctuation\">(<\/span>user<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ 5. \u5e7f\u64ad\u9000\u51fa\u7f16\u8f91\u7684\u6d88\u606f\u901a\u77e5<\/span><br \/>\n        <span class=\"token function\">broadcastToPicture<\/span><span class=\"token punctuation\">(<\/span>pictureId<span class=\"token punctuation\">,<\/span> pictureEditResponseMessage<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<hr \/>\n<h4><font color=\"gree\"><font face=\"\u534e\u6587\u884c\u6977\"><font size=\"6\">(7) \u65ad\u5f00 <\/font><\/font><\/font><font color=\"gree\"><font face=\"\u534e\u6587\u6977\u4f53\"><font size=\"6\">WebSocket <\/font><\/font><\/font><font color=\"gree\"><font face=\"\u534e\u6587\u884c\u6977\"><font size=\"6\">\u65f6\u7684\u903b\u8f91<\/font><\/font><\/font><\/h4>\n<hr \/>\n<p>WebSocket \u8fde\u63a5\u5173\u95ed\u65f6&#xff0c;\u9700\u8981\u79fb\u9664\u5f53\u524d\u7528\u6237\u7684\u7f16\u8f91\u72b6\u6001\u3001\u5e76\u4e14\u4ece\u96c6\u5408\u4e2d\u5220\u9664\u5f53\u524d\u4f1a\u8bdd&#xff0c;\u8fd8\u53ef\u4ee5\u7ed9\u5176\u4ed6\u5ba2\u6237\u7aef\u53d1\u9001\u6d88\u606f\u901a\u77e5&#xff1a;<\/p>\n<p><span class=\"token comment\">\/**<br \/>\n * \u5173\u95ed\u8fde\u63a5<br \/>\n * &#064;param session<br \/>\n * &#064;param status<br \/>\n * &#064;throws Exception<br \/>\n *\/<\/span><br \/>\n<span class=\"token annotation punctuation\">&#064;Override<\/span><br \/>\n<span class=\"token keyword\">public<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token function\">afterConnectionClosed<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">WebSocketSession<\/span> session<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">CloseStatus<\/span> status<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">throws<\/span> <span class=\"token class-name\">Exception<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ 1. \u4ece session \u4e2d\u83b7\u53d6\u516c\u5171\u53c2\u6570<\/span><br \/>\n    <span class=\"token class-name\">User<\/span> user <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token class-name\">User<\/span><span class=\"token punctuation\">)<\/span> session<span class=\"token punctuation\">.<\/span><span class=\"token function\">getAttributes<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">get<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;user&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token class-name\">Long<\/span> pictureId <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token class-name\">Long<\/span><span class=\"token punctuation\">)<\/span> session<span class=\"token punctuation\">.<\/span><span class=\"token function\">getAttributes<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">get<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;pictureId&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 2. \u79fb\u9664\u5f53\u524d\u7528\u6237\u7684\u7f16\u8f91\u72b6\u6001<\/span><br \/>\n    <span class=\"token function\">handleExitEditMessage<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">null<\/span><span class=\"token punctuation\">,<\/span> session<span class=\"token punctuation\">,<\/span> user<span class=\"token punctuation\">,<\/span> pictureId<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 3. \u5220\u9664\u4f1a\u8bdd<\/span><br \/>\n    <span class=\"token class-name\">Set<\/span><span class=\"token generics\"><span class=\"token punctuation\">&lt;<\/span><span class=\"token class-name\">WebSocketSession<\/span><span class=\"token punctuation\">&gt;<\/span><\/span> sessionSet <span class=\"token operator\">&#061;<\/span> pictureSessions<span class=\"token punctuation\">.<\/span><span class=\"token function\">get<\/span><span class=\"token punctuation\">(<\/span>pictureId<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>sessionSet <span class=\"token operator\">!&#061;<\/span> <span class=\"token keyword\">null<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ 4. \u4ece\u4f1a\u8bdd\u96c6\u5408\u4e2d\u5220\u9664\u4f1a\u8bdd(\u4ece value \u5143\u7d20: \u4f1a\u8bdd\u96c6\u5408\u4e2d, \u79fb\u9664\u5355\u4e2a\u4f1a\u8bdd)<\/span><br \/>\n        sessionSet<span class=\"token punctuation\">.<\/span><span class=\"token function\">remove<\/span><span class=\"token punctuation\">(<\/span>session<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token comment\">\/\/ 5. \u5982\u679c value: \u4f1a\u8bdd\u96c6\u5408\u5df2\u7ecf\u6ca1\u6709\u4f1a\u8bdd\u4e86, \u79fb\u9664\u6389 pictureId \u8fd9\u4e2a key<\/span><br \/>\n        <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>sessionSet<span class=\"token punctuation\">.<\/span><span class=\"token function\">isEmpty<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span><br \/>\n            pictureSessions<span class=\"token punctuation\">.<\/span><span class=\"token function\">remove<\/span><span class=\"token punctuation\">(<\/span>pictureId<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token comment\">\/\/ 6. \u901a\u77e5\u5176\u4ed6\u7528\u6237, \u8be5\u7528\u6237\u5df2\u79bb\u5f00\u7f16\u8f91<\/span><br \/>\n    <span class=\"token class-name\">PictureEditResponseMessage<\/span> pictureEditResponseMessage <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token class-name\">PictureEditResponseMessage<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ INFO \u7c7b\u578b\u8868\u793a\u53d1\u9001\u901a\u77e5<\/span><br \/>\n    pictureEditResponseMessage<span class=\"token punctuation\">.<\/span><span class=\"token function\">setType<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">PictureEditMessageTypeEnum<\/span><span class=\"token punctuation\">.<\/span><span class=\"token constant\">INFO<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">getValue<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token class-name\">String<\/span> message <span class=\"token operator\">&#061;<\/span> <span class=\"token class-name\">String<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">format<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\u7528\u6237 %s \u9000\u51fa\u7f16\u8f91&#034;<\/span><span class=\"token punctuation\">,<\/span> user<span class=\"token punctuation\">.<\/span><span class=\"token function\">getUserName<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    pictureEditResponseMessage<span class=\"token punctuation\">.<\/span><span class=\"token function\">setMessage<\/span><span class=\"token punctuation\">(<\/span>message<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    pictureEditResponseMessage<span class=\"token punctuation\">.<\/span><span class=\"token function\">setUser<\/span><span class=\"token punctuation\">(<\/span>userService<span class=\"token punctuation\">.<\/span><span class=\"token function\">getUserVO<\/span><span class=\"token punctuation\">(<\/span>user<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 7. \u5e7f\u64ad\u9000\u51fa\u6d88\u606f\u7ed9\u6240\u6709\u7528\u6237<\/span><br \/>\n    <span class=\"token function\">broadcastToPicture<\/span><span class=\"token punctuation\">(<\/span>pictureId<span class=\"token punctuation\">,<\/span> pictureEditResponseMessage<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>&#x1f4a1; \u7531\u4e8e\u5904\u7406\u5668\u7684\u4ee3\u7801\u5e76\u4e0d\u590d\u6742&#xff0c;\u800c\u4e14\u5904\u7406\u903b\u8f91\u4e2d\u4f7f\u7528\u5230\u4e86\u5f53\u524d\u7c7b\u7684\u5168\u5c40\u53d8\u91cf&#xff0c;\u6240\u4ee5\u6ca1\u6709\u9009\u62e9\u5c06\u6bcf\u4e2a\u5904\u7406\u5668\u5c01\u88c5\u4e3a\u5355\u72ec\u7684\u7c7b\u3002<\/p>\n<p>\u5927\u5bb6\u4e5f\u53ef\u4ee5\u5c06\u6bcf\u4e2a\u5904\u7406\u5668\u5c01\u88c5\u4e3a\u5355\u72ec\u7684\u7c7b&#xff08;\u76f8\u5f53\u4e8e\u8bbe\u8ba1\u6a21\u5f0f\u4e2d\u7684\u7b56\u7565\u6a21\u5f0f&#xff09;&#xff0c;\u5e76\u4e14\u6839\u636e\u6d88\u606f\u7c7b\u522b\u8c03\u7528\u4e0d\u540c\u7684\u5904\u7406\u5668\u7c7b\u3002<\/p>\n<hr \/>\n<h3><font color=\"red\"><font face=\"\u534e\u6587\u6977\u4f53\"><font size=\"6\">5\u3001WebSocket <\/font><\/font><\/font><font color=\"red\"><font face=\"\u534e\u6587\u884c\u6977\"><font size=\"6\">\u914d\u7f6e<\/font><\/font><\/font><\/h3>\n<hr \/>\n<p>\u7c7b\u4f3c\u4e8e\u7f16\u5199 Spring MVC \u7684 Controller \u63a5\u53e3&#xff0c;\u53ef\u4ee5\u4e3a\u6307\u5b9a\u7684\u8def\u5f84\u914d\u7f6e\u5904\u7406\u5668\u548c\u62e6\u622a\u5668&#xff1a;<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/08\/20250812082027-689af94b05e7d.png\" alt=\"image-20250809152610039\" \/><\/p>\n<p><span class=\"token annotation punctuation\">&#064;Configuration<\/span><br \/>\n<span class=\"token annotation punctuation\">&#064;EnableWebSocket<\/span><br \/>\n<span class=\"token keyword\">public<\/span> <span class=\"token keyword\">class<\/span> <span class=\"token class-name\">WebSocketConfig<\/span> <span class=\"token keyword\">implements<\/span> <span class=\"token class-name\">WebSocketConfigurer<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token annotation punctuation\">&#064;Resource<\/span><br \/>\n    <span class=\"token keyword\">private<\/span> <span class=\"token class-name\">PictureEditHandler<\/span> pictureEditHandler<span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u521a\u521a\u5f00\u53d1\u7684\u56fe\u7247\u6d88\u606f\u5904\u7406\u5668\u7c7b, \u5df2\u7ecf\u8bbe\u7f6e\u4e3a bean<\/span><\/p>\n<p>    <span class=\"token annotation punctuation\">&#064;Resource<\/span><br \/>\n    <span class=\"token keyword\">private<\/span> <span class=\"token class-name\">WsHandshakeInterceptor<\/span> wsHandshakeInterceptor<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token annotation punctuation\">&#064;Override<\/span><br \/>\n    <span class=\"token keyword\">public<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token function\">registerWebSocketHandlers<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">WebSocketHandlerRegistry<\/span> registry<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ websocket<\/span><br \/>\n        registry<span class=\"token punctuation\">.<\/span><span class=\"token function\">addHandler<\/span><span class=\"token punctuation\">(<\/span>pictureEditHandler<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;\/ws\/picture\/edit&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n                <span class=\"token punctuation\">.<\/span><span class=\"token function\">addInterceptors<\/span><span class=\"token punctuation\">(<\/span>wsHandshakeInterceptor<span class=\"token punctuation\">)<\/span><br \/>\n                <span class=\"token punctuation\">.<\/span><span class=\"token function\">setAllowedOrigins<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;*&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u4e4b\u540e&#xff0c;\u524d\u7aef\u5c31\u53ef\u4ee5\u901a\u8fc7 WebSocket \u8fde\u63a5\u9879\u76ee\u542f\u52a8\u7aef\u53e3\u7684 \/ws\/picture\/edit \u8def\u5f84\u4e86\u3002<\/p>\n<hr \/>\n<h3><font color=\"red\"><font face=\"\u534e\u6587\u6977\u4f53\"><font size=\"6\">6\u3001Disruptor <\/font><\/font><\/font><font color=\"red\"><font face=\"\u534e\u6587\u884c\u6977\"><font size=\"6\">\u4f18\u5316 <\/font><\/font><\/font><font color=\"red\"><font face=\"\u534e\u6587\u6977\u4f53\"><font size=\"6\">WebSocket <\/font><\/font><\/font><font color=\"red\"><font face=\"\u534e\u6587\u884c\u6977\"><font size=\"6\">\u957f\u8fde\u63a5\u9ad8\u5e76\u53d1\u573a\u666f\u4e0b\u7684\u963b\u585e\u3001\u987a\u5e8f\u4fdd\u8bc1\u4e0e\u4f4e\u5ef6\u8fdf\u95ee\u9898<\/font><\/font><\/font><\/h3>\n<hr \/>\n<h4><font color=\"gree\"><font face=\"\u534e\u6587\u884c\u6977\"><font size=\"6\">1\u3001\u73b0\u5b58\u7684\u7cfb\u7edf\u95ee\u9898<\/font><\/font><\/font><\/h4>\n<hr \/>\n<p>WebSocket \u901a\u5e38\u662f\u957f\u8fde\u63a5&#xff0c;\u6bcf\u4e2a\u5ba2\u6237\u7aef\u90fd\u9700\u8981\u5360\u7528\u670d\u52a1\u5668\u8d44\u6e90\u3002<\/p>\n<p>\u5728 Spring WebSocket \u4e2d&#xff0c;\u6bcf\u4e2a WebSocket \u8fde\u63a5&#xff08;\u5ba2\u6237\u7aef&#xff09;\u5bf9\u5e94\u4e00\u4e2a\u72ec\u7acb\u7684 WebSocketSession&#xff0c;\u6d88\u606f\u7684\u5904\u7406\u662f\u5728\u8be5 WebSocketSession \u6240\u5c5e\u7684\u7ebf\u7a0b\u4e2d\u6267\u884c\u3002<\/p>\n<p>\u5982\u679c \u540c\u4e00\u4e2a WebSocket \u8fde\u63a5&#xff08;\u5ba2\u6237\u7aef&#xff09;\u8fde\u7eed\u53d1\u9001\u591a\u6761\u6d88\u606f&#xff0c;\u670d\u52a1\u5668\u4f1a \u6309\u7167\u63a5\u6536\u7684\u987a\u5e8f\u4f9d\u6b21\u540c\u6b65\u5904\u7406&#xff0c;\u800c\u4e0d\u662f\u5e76\u53d1\u6267\u884c\u3002\u8fd9\u662f\u4e3a\u4e86\u4fdd\u8bc1\u6bcf\u4e2a\u5ba2\u6237\u7aef\u7684\u6d88\u606f\u5904\u7406\u662f\u7ebf\u7a0b\u5b89\u5168\u7684\u3002<\/p>\n<p>\u53ef\u4ee5\u5728 handleTextMessage \u65b9\u6cd5\u4e2d\u589e\u52a0 Thread.sleep \u6765\u6d4b\u8bd5\u4e00\u4e0b\u3002\u8fde\u7eed\u70b9\u51fb\u591a\u6b21\u7f16\u8f91\u64cd\u4f5c&#xff0c;\u4f1a\u53d1\u73b0\u6bcf\u9694\u4e00\u6bb5\u65f6\u95f4\u65b9\u6cd5\u624d\u4f1a\u6267\u884c\u4e00\u6b21\u3002<\/p>\n<hr \/>\n<p>\u867d\u7136\u591a\u4e2a\u5ba2\u6237\u7aef\u7684\u6d88\u606f\u5904\u7406\u662f\u53ef\u4ee5\u5e76\u53d1\u6267\u884c\u7684&#xff0c;\u4f46\u662f\u63a5\u53d7\u6d88\u606f\u548c\u5177\u4f53\u5904\u7406\u67d0\u4e2a\u6d88\u606f&#xff0c;\u4f7f\u7528\u7684\u662f \u540c\u4e00\u4e2a\u7ebf\u7a0b\u3002<\/p>\n<p>\u5982\u679c\u5904\u7406\u6d88\u606f\u7684\u8017\u65f6\u6bd4\u8f83\u957f&#xff0c;\u5e76\u53d1\u91cf\u53c8\u6bd4\u8f83\u9ad8&#xff0c;\u53ef\u80fd\u4f1a\u5bfc\u81f4\u7cfb\u7edf\u54cd\u5e94\u65f6\u95f4\u53d8\u957f&#xff0c;\u751a\u81f3\u56e0\u4e3a\u8d44\u6e90\u8017\u5c3d\u800c\u670d\u52a1\u5d29\u6e83\u3002<\/p>\n<p>&#x1f4a1; \u4e3a\u4e86\u4fbf\u4e8e\u7406\u89e3&#xff0c;\u53ef\u4ee5\u7c7b\u6bd4\u4e00\u4e0b\u8c03\u7528 Spring MVC \u7684\u67d0\u4e2a\u63a5\u53e3\u65f6&#xff0c;\u5982\u679c\u8be5\u63a5\u53e3\u5185\u90e8\u7684\u8017\u65f6\u8f83\u957f&#xff0c;\u8bf7\u6c42\u7ebf\u7a0b\u5c31\u4f1a\u4e00\u76f4\u963b\u585e&#xff0c;\u6700\u7ec8\u5bfc\u81f4 Tomcat \u8bf7\u6c42\u8fde\u63a5\u6570(\u9ed8\u8ba4\u503c\u662f 200 \u4e2a\u8fde\u63a5)\u8017\u5c3d\u3002<\/p>\n<p>\u600e\u4e48\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u5462&#xff1f;\u6700\u7b80\u5355\u7684\u65b9\u6cd5\u5c31\u662f\u5f00\u4e00\u4e2a\u7ebf\u7a0b\u4e13\u95e8\u6765\u5f02\u6b65\u5904\u7406\u6d88\u606f\u3002<\/p>\n<p>\u4f46\u662f\u6211\u4eec\u8fd8\u8981\u4fdd\u8bc1\u64cd\u4f5c\u662f\u6309\u7167\u987a\u5e8f\u540c\u6b65\u7ed9\u5176\u4ed6\u5ba2\u6237\u7aef\u7684&#xff0c;\u56e0\u6b64\u8fd8\u9700\u8981\u5f15\u5165\u4e00\u4e2a\u961f\u5217&#xff0c;\u5c06\u4efb\u52a1\u6309\u7167\u987a\u5e8f\u653e\u5230\u961f\u5217\u4e2d&#xff0c;\u4ea4\u7ed9\u7ebf\u7a0b\u53bb\u5904\u7406\u3002<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/08\/20250812082028-689af94c1a860.png\" alt=\"image-20250806151135949\" \/><\/p>\n<p>\u5176\u5b9e\u4e0a\u8ff0\u7684\u5f02\u6b65\u64cd\u4f5c &#043; \u4ece\u4efb\u52a1\u961f\u5217\u53d6\u4efb\u52a1\u6267\u884c&#xff0c;\u4f7f\u7528\u7ebf\u7a0b\u6c60\u5c31\u53ef\u4ee5\u5b9e\u73b0\u4e86\u3002<\/p>\n<p>\u4f46\u5bf9\u4e8e\u534f\u540c\u7f16\u8f91\u573a\u666f&#xff0c;\u9700\u8981\u5c3d\u53ef\u80fd\u5730\u4fdd\u8bc1\u4f4e\u5ef6\u8fdf&#xff0c;\u56e0\u6b64\u6211\u4eec\u9009\u7528\u4e00\u79cd\u9ad8\u7ea7\u6280\u672f Disruptor \u65e0\u9501\u961f\u5217\u6765\u51cf\u5c11\u7ebf\u7a0b\u4e0a\u4e0b\u6587\u7684\u5207\u6362&#xff0c;\u80fd\u591f\u5728\u9ad8\u5e76\u53d1\u573a\u666f\u4e0b\u4fdd\u6301\u4f4e\u5ef6\u8fdf\u548c\u9ad8\u541e\u5410\u91cf\u3002<\/p>\n<p>\u6b64\u5916&#xff0c;\u4f7f\u7528 Disruptor \u8fd8\u6709\u4e00\u4e2a\u4f18\u70b9&#xff0c;\u53ef\u4ee5\u5c06\u4efb\u52a1\u653e\u5230\u961f\u5217\u4e2d&#xff0c;\u901a\u8fc7\u4f18\u96c5\u505c\u673a\u673a\u5236&#xff0c;\u5728\u670d\u52a1\u505c\u6b62\u524d\u6267\u884c\u5b8c\u6240\u6709\u7684\u4efb\u52a1&#xff0c;\u518d\u9000\u51fa\u670d\u52a1&#xff0c;\u9632\u6b62\u6d88\u606f\u4e22\u5931\u3002<\/p>\n<hr \/>\n<h4><font color=\"gree\"><font face=\"\u534e\u6587\u6977\u4f53\"><font size=\"6\">2\u3001Disruptor <\/font><\/font><\/font><font color=\"gree\"><font face=\"\u534e\u6587\u884c\u6977\"><font size=\"6\">\u4ecb\u7ecd<\/font><\/font><\/font><\/h4>\n<hr \/>\n<p>Disruptor \u662f\u4e00\u79cd\u9ad8\u6027\u80fd\u7684\u5e76\u53d1\u6846\u67b6&#xff0c;\u7531 LMAX&#xff08;\u4e00\u4e2a\u91d1\u878d\u4ea4\u6613\u7cfb\u7edf\u516c\u53f8&#xff09;\u5f00\u53d1&#xff0c;\u5b83\u662f\u4e00\u79cd \u65e0\u9501\u7684\u73af\u5f62\u961f\u5217 \u6570\u636e\u7ed3\u6784&#xff0c;\u7528\u4e8e\u89e3\u51b3\u9ad8\u541e\u5410\u91cf\u548c\u4f4e\u5ef6\u8fdf\u573a\u666f\u4e2d\u7684\u5e76\u53d1\u95ee\u9898\u3002<\/p>\n<p>\u652f\u6301\u751f\u4ea7\u8005 &#8211; \u6d88\u8d39\u8005\u6a21\u5f0f&#xff0c;\u53ef\u4f5c\u4e3a\u6d88\u606f\u961f\u5217\u4f7f\u7528&#xff0c;\u9002\u7528\u4e8e\u91d1\u878d\u4ea4\u6613\u3001\u5b9e\u65f6\u6570\u636e\u5904\u7406\u3001\u6e38\u620f\u4e8b\u4ef6\u7b49\u5bf9\u5e76\u53d1\u548c\u5b9e\u65f6\u6027\u8981\u6c42\u8f83\u9ad8\u7684\u573a\u666f\u3002<\/p>\n<p>\u5b83\u6700\u5927\u7684\u7279\u70b9\u5c31\u662f\u5feb\u3001\u5ef6\u8fdf\u4f4e&#xff0c;\u975e\u5e38\u4f4e&#xff01;<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/08\/20250812082029-689af94de8311.png\" alt=\"image-20250809154857901\" \/><\/p>\n<p>Disruptor \u7684\u6838\u5fc3\u601d\u60f3\u662f\u57fa\u4e8e\u56fa\u5b9a\u5927\u5c0f\u7684 \u73af\u5f62\u7f13\u51b2\u533a&#xff08;Ring Buffer&#xff09;&#xff0c;\u5e76\u901a\u8fc7\u5e8f\u5217\u5316\u63a7\u5236\u8bbf\u95ee&#xff0c;\u4ee5\u907f\u514d\u4f20\u7edf\u961f\u5217\u4e2d\u5e38\u89c1\u7684\u9501\u7ade\u4e89\u95ee\u9898\u3002<\/p>\n<hr \/>\n<p>\u5b83\u4e3b\u8981\u901a\u8fc7\u4ee5\u4e0b\u51e0\u70b9\u5b9e\u73b0\u9ad8\u6027\u80fd\u7684\u6d88\u606f\u4f20\u9012\u673a\u5236&#xff1a;<\/p>\n<ul>\n<li>\u73af\u5f62\u7f13\u51b2\u533a &#xff1a;\u4f7f\u7528\u56fa\u5b9a\u5927\u5c0f\u7684\u6570\u7ec4&#xff0c;\u53ef\u4ee5\u590d\u7528\u5185\u5b58&#xff0c;\u907f\u514d\u4e86\u9891\u7e41\u7684\u5185\u5b58\u5206\u914d\u548c\u5783\u573e\u56de\u6536\u3002<\/li>\n<li>\u65e0\u9501\u8bbe\u8ba1 &#xff1a;\u4f9d\u8d56 CAS&#xff08;Compare &#8211; And &#8211; Swap&#xff09;\u548c\u5185\u5b58\u5c4f\u969c&#xff0c;\u800c\u4e0d\u662f\u4f20\u7edf\u7684\u9501&#xff0c;\u964d\u4f4e\u4e86\u7ebf\u7a0b\u5207\u6362\u7684\u5f00\u9500\u3002<\/li>\n<li>\u7f13\u5b58\u53cb\u597d &#xff1a;\u6700\u5927\u5316\u5229\u7528 CPU \u7684\u7f13\u5b58\u5c40\u90e8\u6027&#xff0c;\u63d0\u9ad8\u8bbf\u95ee\u901f\u5ea6\u3002<\/li>\n<li>\u5e8f\u5217\u53f7\u673a\u5236 &#xff1a;\u901a\u8fc7\u5e8f\u5217\u53f7\u7ba1\u7406\u751f\u4ea7\u8005\u548c\u6d88\u8d39\u8005\u7684\u8bbf\u95ee&#xff0c;\u4fdd\u8bc1\u6570\u636e\u4e00\u81f4\u6027\u3002<\/li>\n<li>\u591a\u6d88\u8d39\u8005\u6a21\u5f0f &#xff1a;\u652f\u6301\u591a\u6d88\u8d39\u8005\u5171\u4eab\u540c\u4e00\u73af\u5f62\u7f13\u51b2\u533a&#xff0c;\u5e76\u80fd\u914d\u7f6e\u4e0d\u540c\u7684\u6d88\u8d39\u7b56\u7565&#xff08;\u5982\u4f9d\u8d56\u5173\u7cfb\u3001\u5e76\u884c\u6d88\u8d39\u7b49&#xff09;\u3002<\/li>\n<\/ul>\n<hr \/>\n<p>Disruptor \u4e0e\u4f20\u7edf\u961f\u5217\u5bf9\u6bd4&#xff1a;<\/p>\n<table>\n<tr>\u7279\u6027DisruptorBlockingQueue<\/tr>\n<tbody>\n<tr>\n<td>\u5e76\u53d1\u63a7\u5236<\/td>\n<td>\u65e0\u9501&#xff08;CAS &#043; \u5185\u5b58\u5c4f\u969c&#xff09;<\/td>\n<td>\u57fa\u4e8e\u9501&#xff08;ReentrantLock&#xff09;<\/td>\n<\/tr>\n<tr>\n<td>\u5185\u5b58\u7ba1\u7406<\/td>\n<td>\u56fa\u5b9a\u957f\u5ea6\u7684\u73af\u5f62\u6570\u7ec4<\/td>\n<td>\u52a8\u6001\u6570\u7ec4\u6216\u94fe\u8868<\/td>\n<\/tr>\n<tr>\n<td>\u6027\u80fd<\/td>\n<td>\u6781\u9ad8&#xff08;\u767e\u4e07\u7ea7\u522b\u6d88\u606f \/ \u79d2&#xff09;<\/td>\n<td>\u8f83\u4f4e&#xff08;\u6570\u4e07\u6d88\u606f \/ \u79d2&#xff09;<\/td>\n<\/tr>\n<tr>\n<td>\u5ef6\u8fdf<\/td>\n<td>\u7eb3\u79d2\u7ea7\u522b<\/td>\n<td>\u6beb\u79d2\u7ea7\u522b<\/td>\n<\/tr>\n<tr>\n<td>GC \u538b\u529b<\/td>\n<td>\u6781\u4f4e&#xff08;\u6570\u636e\u590d\u7528&#xff09;<\/td>\n<td>\u8f83\u9ad8&#xff08;\u9891\u7e41\u521b\u5efa\u65b0\u5bf9\u8c61&#xff09;<\/td>\n<\/tr>\n<tr>\n<td>\u9002\u7528\u573a\u666f<\/td>\n<td>\u9ad8\u9891\u5b9e\u65f6\u6d88\u606f\u5904\u7406\u3001\u91d1\u878d\u7cfb\u7edf<\/td>\n<td>\u4e00\u822c\u751f\u4ea7\u8005\u6d88\u8d39\u8005\u6a21\u578b<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<hr \/>\n<h4><font color=\"gree\"><font face=\"\u534e\u6587\u6977\u4f53\"><font size=\"6\">3\u3001Disruptor <\/font><\/font><\/font><font color=\"gree\"><font face=\"\u534e\u6587\u884c\u6977\"><font size=\"6\">\u6838\u5fc3\u6982\u5ff5\u4e0e\u5de5\u4f5c\u6d41\u7a0b<\/font><\/font><\/font><\/h4>\n<hr \/>\n<p>\u5148\u4e86\u89e3 Disruptor \u7684\u6838\u5fc3\u6982\u5ff5&#xff1a;<\/p>\n<ul>\n<li>RingBuffer&#xff08;\u73af\u5f62\u7f13\u51b2\u533a&#xff09; &#xff1a;\u56fa\u5b9a\u5927\u5c0f\u7684\u5faa\u73af\u6570\u7ec4&#xff0c;\u7528\u4e8e\u5b58\u50a8\u6570\u636e\u9879&#xff0c;\u751f\u4ea7\u8005\u548c\u6d88\u8d39\u8005\u5171\u4eab\u8be5\u6570\u636e\u7ed3\u6784\u3002<\/li>\n<li>Event&#xff08;\u4e8b\u4ef6&#xff09; &#xff1a;\u5b58\u50a8\u5728 RingBuffer \u4e2d\u7684\u6570\u636e\u5bf9\u8c61&#xff0c;\u7528\u4e8e\u8868\u793a\u8981\u4f20\u9012\u7684\u6d88\u606f\u6216\u6570\u636e\u3002<\/li>\n<li>Producer&#xff08;\u751f\u4ea7\u8005&#xff09; &#xff1a;\u8d1f\u8d23\u5411 RingBuffer \u5199\u5165\u6570\u636e\u7684\u89d2\u8272\u3002<\/li>\n<li>Consumer&#xff08;\u6d88\u8d39\u8005&#xff09; &#xff1a;\u4ece RingBuffer \u4e2d\u8bfb\u53d6\u5e76\u5904\u7406\u6570\u636e\u7684\u89d2\u8272\u3002<\/li>\n<li>Sequencer&#xff08;\u5e8f\u5217\u5668&#xff09; &#xff1a;\u7ba1\u7406\u751f\u4ea7\u8005\u4e0e\u6d88\u8d39\u8005\u7684\u7d22\u5f15&#xff0c;\u786e\u4fdd\u5e76\u53d1\u5b89\u5168\u7684\u5e8f\u5217\u7ba1\u7406\u3002<\/li>\n<li>SequenceBarrier&#xff08;\u5e8f\u5217\u5c4f\u969c&#xff09; &#xff1a;\u63a7\u5236\u6d88\u8d39\u8005\u7b49\u5f85\u6570\u636e\u53ef\u7528\u7684\u673a\u5236&#xff0c;\u786e\u4fdd\u6570\u636e\u5b8c\u6574\u6027\u3002<\/li>\n<li>WaitStrategy&#xff08;\u7b49\u5f85\u7b56\u7565&#xff09; &#xff1a;\u5b9a\u4e49\u6d88\u8d39\u8005\u5982\u4f55\u7b49\u5f85\u65b0\u7684\u6570\u636e&#xff08;\u5982\u81ea\u65cb\u3001\u81ea\u9002\u5e94\u7b49\u5f85\u7b49&#xff09;\u3002<\/li>\n<li>EventProcessor&#xff08;\u4e8b\u4ef6\u5904\u7406\u5668&#xff09; &#xff1a;\u96c6\u6210\u4e86 Consumer \u548c SequenceBarrier&#xff0c;\u7528\u4e8e\u66f4\u9ad8\u7ea7\u7684\u6d88\u8d39\u63a7\u5236\u3002<\/li>\n<\/ul>\n<p>\u800c Disruptor \u662f\u5c01\u88c5\u4e86 RingBuffer\u3001Producer \u548c Consumer \u7684\u6838\u5fc3\u7ba1\u7406\u7c7b&#xff0c;\u7528\u4e8e\u534f\u8c03\u6240\u6709\u7ec4\u4ef6\u7684\u8fd0\u884c\u3002<\/p>\n<hr \/>\n<p>\u4e0b\u9762\u6211\u4e3e\u4f8b\u6765\u8bf4\u660e Disruptor \u7684\u5de5\u4f5c\u6d41\u7a0b&#xff1a;<\/p>\n<li>\u73af\u5f62\u961f\u5217\u521d\u59cb\u5316 &#xff1a;\u521b\u5efa\u4e00\u4e2a\u56fa\u5b9a\u5927\u5c0f\u4e3a 8 \u7684 RingBuffer&#xff08;\u7d22\u5f15\u8303\u56f4 0 &#8211; 7&#xff09;&#xff0c;\u6bcf\u4e2a\u683c\u5b50\u5b58\u50a8\u4e00\u4e2a\u53ef\u590d\u7528\u7684\u4e8b\u4ef6\u5bf9\u8c61&#xff0c;\u5e8f\u53f7\u521d\u59cb\u4e3a 0\u3002<\/li>\n<li>\u751f\u4ea7\u8005\u5199\u5165\u6570\u636e &#xff1a;\u751f\u4ea7\u8005\u901a\u8fc7\u53d6\u6a21&#xff0c;\u7533\u8bf7\u7d22\u5f15 0&#xff08;\u5e8f\u53f7 0&#xff09;&#xff0c;\u5c06\u6570\u636e \u201cA\u201d \u5199\u5165\u4e8b\u4ef6\u5bf9\u8c61&#xff0c;\u63d0\u4ea4\u540e\u5e8f\u53f7\u9012\u589e\u4e3a 1&#xff0c;\u4e0b\u4e00\u4e2a\u5199\u5165\u7d22\u5f15\u53d8\u4e3a 1\u3002<\/li>\n<li>\u6d88\u8d39\u8005\u8bfb\u53d6\u6570\u636e &#xff1a;\u6d88\u8d39\u8005\u68c0\u67e5\u7d22\u5f15 0&#xff08;\u5e8f\u53f7 0&#xff09;&#xff0c;\u8bfb\u53d6\u6570\u636e \u201cA\u201d&#xff0c;\u5904\u7406\u540e\u63d0\u4ea4&#xff0c;\u5e8f\u53f7\u9012\u589e\u4e3a 1&#xff0c;\u4e0b\u4e00\u4e2a\u8bfb\u53d6\u7d22\u5f15\u53d8\u4e3a 1\u3002<\/li>\n<li>\u73af\u5f62\u961f\u5217\u5faa\u73af\u4f7f\u7528 &#xff1a;\u5f53\u751f\u4ea7\u8005\u5199\u5165\u5230\u7d22\u5f15 7&#xff08;\u5e8f\u53f7 7&#xff09;\u540e&#xff0c;\u7d22\u5f15\u56de\u5230 0&#xff08;\u5e8f\u53f7 8&#xff09;&#xff0c;\u5f62\u6210\u5faa\u73af\u5b58\u50a8&#xff0c;\u4f46\u5e8f\u53f7\u4f1a\u6301\u7eed\u81ea\u589e\u4ee5\u533a\u5206\u6570\u636e\u7684\u5148\u540e\u987a\u5e8f\u3002<\/li>\n<li>\u9632\u6b62\u6570\u636e\u8986\u76d6 &#xff1a;\u5982\u679c\u751f\u4ea7\u8005\u8ffd\u4e0a\u6d88\u8d39\u8005&#xff0c;\u6d88\u8d39\u8005\u5c1a\u672a\u5904\u7406\u5b8c\u6570\u636e&#xff0c;\u751f\u4ea7\u8005\u4f1a\u7b49\u5f85(\u7b56\u7565\u662f\u4e0d\u7ee7\u7eed\u751f\u4ea7&#xff0c;\u800c\u4e0d\u662f\u6269\u5bb9)&#xff0c;\u786e\u4fdd\u6570\u636e\u4e0d\u88ab\u8986\u76d6\u3002<\/li>\n<p>\u4e0b\u56fe\u662f\u4e00\u4e2a Disruptor \u751f\u4ea7\u8005\u7684\u6a21\u578b&#xff0c;\u4ec5\u4f9b\u53c2\u8003&#xff0c;\u4e86\u89e3\u4e00\u4e0b\u5373\u53ef&#xff1a;<\/p>\n<p><img decoding=\"async\" src=\"2025-08-12fgw3oxx0r5i.png\" alt=\"image-20250809160444829\" \/><\/p>\n<p>\u5176\u5b9e\u5bf9\u5927\u5bb6\u6765\u8bf4&#xff0c;\u5148\u5c06 Disruptor \u5f53\u505a\u4e00\u4e2a\u9ad8\u6027\u80fd\u7684\u961f\u5217\u6765\u4f7f\u7528\u5c31\u53ef\u4ee5\u4e86&#xff0c;\u53ef\u4ee5\u5411\u961f\u5217\u4e2d\u6dfb\u52a0\u4e8b\u4ef6\u5e76\u5b9a\u4e49\u5904\u7406\u65b9\u5f0f\u3002<\/p>\n<ul>\n<li>\u4e0a\u9762\u7684\u5185\u5bb9\u91cd\u70b9\u8bb0\u5fc6 Disruptor \u7684\u65e0\u9501&#xff0c;CAS&#xff0c;\u73af\u5f62\u961f\u5217&#xff0c;\u6d88\u606f\u751f\u4ea7\u65f6\u5e8f\u53f7\u7684\u63a7\u5236&#xff0c;\u4ee5\u53ca\u9632\u6b62\u6570\u636e\u8986\u76d6\u7684\u673a\u5236&#xff1b;<\/li>\n<li>\u611f\u5174\u8da3\u7684\u540c\u5b66\u53ef\u4ee5\u9605\u8bfb \u8fd9\u7bc7\u6587\u7ae0 \u6df1\u5165\u4e86\u89e3 Disruptor \u6027\u80fd\u9ad8\u7684\u539f\u56e0\u3002<\/li>\n<\/ul>\n<p>\u4e0b\u9762\u6211\u4eec\u6765\u5f15\u5165 Disruptor \u6765\u4f18\u5316\u4ee3\u7801\u3002<\/p>\n<hr \/>\n<h4><font color=\"gree\"><font face=\"\u534e\u6587\u6977\u4f53\"><font size=\"6\">4\u3001Disruptor<\/font><\/font><\/font><font color=\"gree\"><font face=\"\u534e\u6587\u884c\u6977\"><font size=\"6\"> \u5b9e\u6218<\/font><\/font><\/font><\/h4>\n<hr \/>\n<h5><font color=\"blue\"><font face=\"\u534e\u6587\u884c\u6977\"><font size=\"6\">(1) \u5f15\u5165 <\/font><\/font><\/font><font color=\"blue\"><font face=\"\u534e\u6587\u6977\u4f53\"><font size=\"6\">Disruptor <\/font><\/font><\/font><font color=\"blue\"><font face=\"\u534e\u6587\u884c\u6977\"><font size=\"6\">\u4f9d\u8d56<\/font><\/font><\/font><\/h5>\n<hr \/>\n<p><span class=\"token comment\">&lt;!&#8211; \u9ad8\u6027\u80fd\u65e0\u9501\u961f\u5217 &#8211;&gt;<\/span><br \/>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>dependency<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>groupId<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>com.lmax<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>groupId<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>artifactId<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>disruptor<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>artifactId<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>version<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>3.4.2<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>version<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><br \/>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>dependency<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><\/p>\n<hr \/>\n<h5><font color=\"blue\"><font face=\"\u534e\u6587\u884c\u6977\"><font size=\"6\">(2) \u5b9a\u4e49\u56fe\u7247\u7f16\u8f91\u4e8b\u4ef6<\/font><\/font><\/font><\/h5>\n<hr \/>\n<p>\u5f15\u5165 Disruptor \u540e&#xff0c;\u7b2c\u4e00\u4ef6\u4e8b\u662f\u628a\u201c\u6536\u5230\u6d88\u606f \u2192 \u5904\u7406\u6d88\u606f\u201d\u8fd9\u4e00\u6574\u6761\u94fe\u8def\u62c6\u6210\u300c\u4e8b\u4ef6\u300d\u3002<\/p>\n<p><img decoding=\"async\" src=\"2025-08-12rudaw4af4ah.png\" alt=\"image-20250809163419929\" \/><\/p>\n<hr \/>\n<p>Disruptor \u53ea\u8ba4\u8bc6\u4e8b\u4ef6&#xff08;Event&#xff09;&#xff0c;\u6240\u4ee5\u5fc5\u987b\u628a\u539f\u6765\u7684\u540c\u6b65\u5904\u7406\u903b\u8f91&#xff08;handleTextMessage \u53ca 3 \u4e2a handleXxx \u65b9\u6cd5&#xff09;\u6539\u9020\u6210\u300c\u751f\u4ea7\u4e8b\u4ef6 \u2192 \u6d88\u8d39\u4e8b\u4ef6\u300d\u6a21\u578b&#xff1a;<\/p>\n<p><img decoding=\"async\" src=\"2025-08-12cknfnu2w50w.png\" alt=\"image-20250809170839928\" \/><\/p>\n<hr \/>\n<p>\u5728 websocket.disruptor \u5305\u4e2d\u65b0\u5efa PictureEditEvent \u7c7b&#xff0c;\u5145\u5f53\u4e86\u4e0a\u4e0b\u6587\u5bb9\u5668&#xff0c;\u6240\u6709\u5904\u7406\u6d88\u606f\u6240\u9700\u7684\u6570\u636e\u90fd\u88ab\u5c01\u88c5\u5728\u5176\u4e2d\u3002<\/p>\n<p>\u4e5f\u5c31\u662f&#xff0c;\u8fd9\u4e09\u4e2a\u6d88\u606f\u5904\u7406\u65b9\u6cd5\u7684\u53c2\u6570&#xff0c;\u5355\u72ec\u63d0\u53d6\u51fa\u6765\u4f5c\u4e3a\u4e8b\u4ef6\u7c7b\u7684\u5c5e\u6027&#xff1a;<\/p>\n<p><img decoding=\"async\" src=\"2025-08-12eghevanhtpz.png\" alt=\"image-20250809162621163\" \/><\/p>\n<p><span class=\"token annotation punctuation\">&#064;Data<\/span><br \/>\n<span class=\"token keyword\">public<\/span> <span class=\"token keyword\">class<\/span> <span class=\"token class-name\">PictureEditEvent<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/**<br \/>\n     * \u6d88\u606f<br \/>\n     *\/<\/span><br \/>\n    <span class=\"token keyword\">private<\/span> <span class=\"token class-name\">PictureEditRequestMessage<\/span> pictureEditRequestMessage<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/**<br \/>\n     * \u5f53\u524d\u7528\u6237\u7684 session<br \/>\n     *\/<\/span><br \/>\n    <span class=\"token keyword\">private<\/span> <span class=\"token class-name\">WebSocketSession<\/span> session<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/**<br \/>\n     * \u5f53\u524d\u7528\u6237<br \/>\n     *\/<\/span><br \/>\n    <span class=\"token keyword\">private<\/span> <span class=\"token class-name\">User<\/span> user<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/**<br \/>\n     * \u56fe\u7247 id<br \/>\n     *\/<\/span><br \/>\n    <span class=\"token keyword\">private<\/span> <span class=\"token class-name\">Long<\/span> pictureId<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<hr \/>\n<h5><font color=\"blue\"><font face=\"\u534e\u6587\u884c\u6977\"><font size=\"6\">(3) \u5b9a\u4e49\u4e8b\u4ef6\u5904\u7406\u5668&#xff08;\u6d88\u8d39\u8005&#xff09;<\/font><\/font><\/font><\/h5>\n<hr \/>\n<p>\u8fd9\u91cc\u57fa\u672c\u4e0a\u662f\u628a PictureEditHandler \u5206\u53d1\u6d88\u606f\u7684\u903b\u8f91\u642c\u4e86\u8fc7\u6765&#xff0c;\u5b83\u7684\u4f5c\u7528\u5c31\u662f\u5c06\u4e0d\u540c\u7c7b\u578b\u7684\u6d88\u606f\u5206\u53d1\u5230\u5bf9\u5e94\u7684\u5904\u7406\u5668\u4e2d\u3002<\/p>\n<p><img decoding=\"async\" src=\"2025-08-12xj4qdjjlznd.png\" alt=\"image-20250809171108170\" \/><\/p>\n<p><span class=\"token comment\">\/**<br \/>\n * \u56fe\u7247\u7f16\u8f91\u4e8b\u4ef6\u5904\u7406\u5668(\u6d88\u8d39\u8005)<br \/>\n *\/<\/span><br \/>\n<span class=\"token annotation punctuation\">&#064;Component<\/span><br \/>\n<span class=\"token annotation punctuation\">&#064;Slf4j<\/span><br \/>\n<span class=\"token keyword\">public<\/span> <span class=\"token keyword\">class<\/span> <span class=\"token class-name\">PictureEditEventWorkHandler<\/span> <span class=\"token keyword\">implements<\/span> <span class=\"token class-name\">WorkHandler<\/span><span class=\"token generics\"><span class=\"token punctuation\">&lt;<\/span><span class=\"token class-name\">PictureEditEvent<\/span><span class=\"token punctuation\">&gt;<\/span><\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ 1. \u5b9a\u4e49\u4e8b\u4ef6\u5904\u7406\u5668(\u6d88\u8d39\u8005), \u5b9e\u73b0 WorkHandler&lt;T&gt; \u63a5\u53e3, T \u8868\u793a\u751f\u4ea7\u8005\u4e8b\u4ef6<\/span><\/p>\n<p>    <span class=\"token annotation punctuation\">&#064;Resource<\/span><br \/>\n    <span class=\"token keyword\">private<\/span> <span class=\"token class-name\">PictureEditHandler<\/span> pictureEditHandler<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token annotation punctuation\">&#064;Resource<\/span><br \/>\n    <span class=\"token keyword\">private<\/span> <span class=\"token class-name\">UserService<\/span> userService<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 2. \u5b9e\u73b0 WorkHandler \u63a5\u53e3\u7684\u65b9\u6cd5, \u53c2\u6570\u5c31\u662f\u63a5\u53e3\u7684\u6cdb\u578b, \u4e5f\u5c31\u662f\u5904\u7406\u751f\u4ea7\u8005\u4e8b\u4ef6\u7684\u65b9\u6cd5 <\/span><br \/>\n    <span class=\"token comment\">\/\/ 3. \u6d88\u8d39\u8005\u4e8b\u4ef6\u7684\u903b\u8f91, \u5c31\u662f\u521a\u521a\u7f16\u5199\u7684\u5904\u7406\u56fe\u7247\u7684\u903b\u8f91, \u590d\u5236\u8fc7\u6765\u6539\u9020\u4e3a\u6d88\u8d39\u8005\u4e8b\u4ef6\u5373\u53ef<\/span><br \/>\n    <span class=\"token annotation punctuation\">&#064;Override<\/span><br \/>\n    <span class=\"token keyword\">public<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token function\">onEvent<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">PictureEditEvent<\/span> pictureEditEvent<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">throws<\/span> <span class=\"token class-name\">Exception<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ 4. user, pictureId \u4e0d\u9700\u8981\u4ece session \u4e2d\u83b7\u53d6, \u76f4\u63a5\u4ece\u53c2\u6570(\u751f\u4ea7\u8005\u4e8b\u4ef6)\u4e2d\u83b7\u53d6<\/span><br \/>\n        <span class=\"token class-name\">PictureEditRequestMessage<\/span> pictureEditRequestMessage <span class=\"token operator\">&#061;<\/span> pictureEditEvent<span class=\"token punctuation\">.<\/span><span class=\"token function\">getPictureEditRequestMessage<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token class-name\">WebSocketSession<\/span> session <span class=\"token operator\">&#061;<\/span> pictureEditEvent<span class=\"token punctuation\">.<\/span><span class=\"token function\">getSession<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token class-name\">User<\/span> user <span class=\"token operator\">&#061;<\/span> pictureEditEvent<span class=\"token punctuation\">.<\/span><span class=\"token function\">getUser<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token class-name\">Long<\/span> pictureId <span class=\"token operator\">&#061;<\/span> pictureEditEvent<span class=\"token punctuation\">.<\/span><span class=\"token function\">getPictureId<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ 5. \u4ece\u56fe\u7247\u7f16\u8f91\u8bf7\u6c42\u7684 message \u5c5e\u6027\u4e2d\u83b7\u53d6\u5230\u7c7b\u522b<\/span><br \/>\n        <span class=\"token class-name\">String<\/span> type <span class=\"token operator\">&#061;<\/span> pictureEditRequestMessage<span class=\"token punctuation\">.<\/span><span class=\"token function\">getType<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ 6. \u4ece\u7c7b\u522b\u83b7\u53d6\u679a\u4e3e<\/span><br \/>\n        <span class=\"token class-name\">PictureEditMessageTypeEnum<\/span> pictureEditMessageTypeEnum <span class=\"token operator\">&#061;<\/span> <span class=\"token class-name\">PictureEditMessageTypeEnum<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">getEnumByValue<\/span><span class=\"token punctuation\">(<\/span>type<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token comment\">\/\/ 7. \u6839\u636e\u6d88\u606f\u7c7b\u578b\u7684\u679a\u4e3e, \u8fdb\u884c\u5bf9\u5e94\u7684\u5904\u7406(\u9700\u8981\u5f15\u5165\u56fe\u7247\u5904\u7406\u7684 Bean: PictureEditHandler)<\/span><br \/>\n        <span class=\"token keyword\">switch<\/span> <span class=\"token punctuation\">(<\/span>pictureEditMessageTypeEnum<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">case<\/span> <span class=\"token constant\">ENTER_EDIT<\/span><span class=\"token operator\">:<\/span><br \/>\n                pictureEditHandler<span class=\"token punctuation\">.<\/span><span class=\"token function\">handleEnterEditMessage<\/span><span class=\"token punctuation\">(<\/span>pictureEditRequestMessage<span class=\"token punctuation\">,<\/span> session<span class=\"token punctuation\">,<\/span> user<span class=\"token punctuation\">,<\/span> pictureId<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">case<\/span> <span class=\"token constant\">EXIT_EDIT<\/span><span class=\"token operator\">:<\/span><br \/>\n                pictureEditHandler<span class=\"token punctuation\">.<\/span><span class=\"token function\">handleEditActionMessage<\/span><span class=\"token punctuation\">(<\/span>pictureEditRequestMessage<span class=\"token punctuation\">,<\/span> session<span class=\"token punctuation\">,<\/span> user<span class=\"token punctuation\">,<\/span> pictureId<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">case<\/span> <span class=\"token constant\">EDIT_ACTION<\/span><span class=\"token operator\">:<\/span><br \/>\n                pictureEditHandler<span class=\"token punctuation\">.<\/span><span class=\"token function\">handleExitEditMessage<\/span><span class=\"token punctuation\">(<\/span>pictureEditRequestMessage<span class=\"token punctuation\">,<\/span> session<span class=\"token punctuation\">,<\/span> user<span class=\"token punctuation\">,<\/span> pictureId<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">default<\/span><span class=\"token operator\">:<\/span><br \/>\n                <span class=\"token comment\">\/\/ \u6536\u5230 info \u3001error \u7c7b\u578b\u7684\u6d88\u606f, \u5982\u679c\u662f error, \u8bf4\u660e\u7528\u6237\u53c2\u6570\u4f20\u9012\u9519\u8bef, \u53ea\u7ed9\u5f53\u524d\u7528\u6237\u53d1\u9001\u4fe1\u606f<\/span><br \/>\n                <span class=\"token class-name\">PictureEditResponseMessage<\/span> pictureEditResponseMessage <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token class-name\">PictureEditResponseMessage<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                pictureEditResponseMessage<span class=\"token punctuation\">.<\/span><span class=\"token function\">setType<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">PictureEditMessageTypeEnum<\/span><span class=\"token punctuation\">.<\/span><span class=\"token constant\">ERROR<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">getValue<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                pictureEditResponseMessage<span class=\"token punctuation\">.<\/span><span class=\"token function\">setMessage<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;\u6d88\u606f\u7c7b\u578b\u9519\u8bef&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                pictureEditResponseMessage<span class=\"token punctuation\">.<\/span><span class=\"token function\">setUser<\/span><span class=\"token punctuation\">(<\/span>userService<span class=\"token punctuation\">.<\/span><span class=\"token function\">getUserVO<\/span><span class=\"token punctuation\">(<\/span>user<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token comment\">\/\/ \u8fd9\u91cc\u4e25\u683c\u6765\u8bf4\u4e5f\u9700\u8981\u5904\u7406 Long \u7cbe\u5ea6\u4e22\u5931, \u4f46\u662f\u8fd9\u4e2a switch \u60c5\u51b5\u53ea\u662f\u4e00\u4e2a\u9519\u8bef\u6d88\u606f, \u5c31\u4e0d\u8f6c\u4e86<\/span><br \/>\n                session<span class=\"token punctuation\">.<\/span><span class=\"token function\">sendMessage<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">new<\/span> <span class=\"token class-name\">TextMessage<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">JSONUtil<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">toJsonStr<\/span><span class=\"token punctuation\">(<\/span>pictureEditRequestMessage<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<hr \/>\n<h5><font color=\"blue\"><font face=\"\u534e\u6587\u884c\u6977\"><font size=\"6\">(4) \u6dfb\u52a0 <\/font><\/font><\/font><font color=\"blue\"><font face=\"\u534e\u6587\u6977\u4f53\"><font size=\"6\">Disruptor <\/font><\/font><\/font><font color=\"blue\"><font face=\"\u534e\u6587\u884c\u6977\"><font size=\"6\">\u914d\u7f6e\u7c7b<\/font><\/font><\/font><\/h5>\n<hr \/>\n<p>\u5c06\u6211\u4eec\u521a\u5b9a\u4e49\u7684\u4e8b\u4ef6\u53ca\u5904\u7406\u5668\u5173\u8054\u5230 Disruptor \u5b9e\u4f8b\u4e2d&#xff1a;<\/p>\n<p><img decoding=\"async\" src=\"2025-08-120en3kqkvnyx.png\" alt=\"image-20250809172636495\" \/><\/p>\n<p><span class=\"token comment\">\/**<br \/>\n * \u56fe\u7247\u7f16\u8f91\u4e8b\u4ef6 Disruptor \u914d\u7f6e<br \/>\n *\/<\/span><br \/>\n<span class=\"token annotation punctuation\">&#064;Configuration<\/span><br \/>\n<span class=\"token keyword\">public<\/span> <span class=\"token keyword\">class<\/span> <span class=\"token class-name\">PictureEditEventDisruptorConfig<\/span> <span class=\"token punctuation\">{<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 1. \u6ce8\u518c\u6d88\u8d39\u8005<\/span><br \/>\n    <span class=\"token annotation punctuation\">&#064;Resource<\/span><br \/>\n    <span class=\"token keyword\">private<\/span> <span class=\"token class-name\">PictureEditEventWorkHandler<\/span> pictureEditEventWorkHandler<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 2. \u521d\u59cb\u5316 Disruptor \u5bf9\u8c61, \u5c06\u8be5\u5bf9\u8c61\u4ea4\u7ed9 spring \u7ba1\u7406, \u5e76\u4e14\u547d\u540d\u4e3a PictureEditEventDisruptor<\/span><br \/>\n    <span class=\"token annotation punctuation\">&#064;Bean<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;PictureEditEventDisruptor&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token keyword\">public<\/span> <span class=\"token class-name\">Disruptor<\/span><span class=\"token generics\"><span class=\"token punctuation\">&lt;<\/span><span class=\"token class-name\">PictureEditEvent<\/span><span class=\"token punctuation\">&gt;<\/span><\/span> <span class=\"token function\">messageModelRingBuffer<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ 3. \u5b9a\u4e49\u73af\u5f62\u7f13\u51b2\u533a ringBuffer \u5927\u5c0f(\u7c7b\u4f3c\u4e8e\u6211\u4eec\u5b9a\u4e49\u4e00\u4e2a\u6d88\u606f\u961f\u5217\u5927\u5c0f)<\/span><br \/>\n        <span class=\"token keyword\">int<\/span> bufferSize <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1024<\/span> <span class=\"token operator\">*<\/span> <span class=\"token number\">256<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token comment\">\/\/ Disruptor \u961f\u5217\u5728\u9ad8\u5e76\u53d1, \u5927\u541e\u5410\u91cf\u4e0b\u7684\u5ef6\u8fdf\u4f18\u5316\u6548\u679c\u6700\u660e\u663e, \u6240\u4ee5\u6211\u4eec\u5b9a\u4e49\u767e\u4e07\u7ea7\u522b\u7684 ringBuffer \u5927\u5c0f<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u5982\u679c\u5b9a\u4e49\u5f97\u592a\u5c0f, \u4efb\u52a1\u53c8\u4e0d\u80fd\u88ab\u8986\u76d6, \u4f1a\u9020\u6210\u4e25\u91cd\u7684\u963b\u585e, \u751f\u4ea7\u8005\u65e0\u6cd5\u7ee7\u7eed\u6dfb\u52a0\u4efb\u52a1<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ 4. \u5b9e\u4f8b Disruptor<\/span><br \/>\n        <span class=\"token class-name\">Disruptor<\/span><span class=\"token generics\"><span class=\"token punctuation\">&lt;<\/span><span class=\"token class-name\">PictureEditEvent<\/span><span class=\"token punctuation\">&gt;<\/span><\/span> disruptor <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">new<\/span> <span class=\"token class-name\">Disruptor<\/span><span class=\"token generics\"><span class=\"token punctuation\">&lt;<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><span class=\"token punctuation\">(<\/span><br \/>\n                <span class=\"token class-name\">PictureEditEvent<\/span><span class=\"token operator\">::<\/span><span class=\"token keyword\">new<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                bufferSize<span class=\"token punctuation\">,<\/span><br \/>\n                <span class=\"token class-name\">ThreadFactoryBuilder<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">create<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n                        <span class=\"token punctuation\">.<\/span><span class=\"token function\">setNamePrefix<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;pictureEditEventDisruptor&#034;<\/span><span class=\"token punctuation\">)<\/span><br \/>\n                        <span class=\"token punctuation\">.<\/span><span class=\"token function\">build<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u7b2c\u4e00\u4e2a\u53c2\u6570\u8868\u793a\u4e8b\u4ef6\u5de5\u5382,  PictureEditEvent::new \u4f1a\u521b\u5efa\u4e00\u4e2a\u4e8b\u4ef6\u5bf9\u8c61, \u7528\u4e8e\u6307\u5b9a\u6bcf\u6b21\u653e\u5165\u7f13\u51b2\u533a\u7684\u4e8b\u4ef6\u7c7b\u578b <\/span><br \/>\n        <span class=\"token comment\">\/\/ \u7b2c\u4e8c\u4e2a\u53c2\u6570\u4e3a\u961f\u5217\u7684\u7f13\u51b2\u533a\u5927\u5c0f<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u7b2c\u4e09\u4e2a\u53c2\u6570\u4e3a\u7ebf\u7a0b\u5de5\u5382, \u5f15\u5165\u7684\u5305\u4e3a Hutool, \u901a\u8fc7\u7ebf\u7a0b\u5de5\u5382\u521b\u5efa\u4e00\u4e2a\u7ebf\u7a0b, \u5e76\u6307\u5b9a\u7ebf\u7a0b\u540d\u7684\u524d\u7f00<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ 5. \u4e3a Disruptor \u7ed1\u5b9a\u6d88\u8d39\u8005<\/span><br \/>\n        disruptor<span class=\"token punctuation\">.<\/span><span class=\"token function\">handleEventsWithWorkerPool<\/span><span class=\"token punctuation\">(<\/span>pictureEditEventWorkHandler<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u4f7f\u7528 disruptor \u7684\u5de5\u4f5c\u7ebf\u7a0b, \u6765\u6267\u884c\u6211\u4eec\u7684\u6d88\u8d39\u8005\u4e8b\u4ef6<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ 5. \u5f00\u542f Disruptor<\/span><br \/>\n        disruptor<span class=\"token punctuation\">.<\/span><span class=\"token function\">start<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ 6. \u8fd4\u56de\u5f53\u524d\u7684 Disruptor \u5bf9\u8c61, \u4fbf\u4e8e\u540e\u7eed\u8c03\u7528<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> disruptor<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u540e\u7eed\u5728\u6d88\u606f\u751f\u4ea7\u8005\u4e2d, \u4f7f\u7528\u8fd9\u4e2a\u65b9\u6cd5\u8fd4\u56de\u7684 disruptor \u5bf9\u8c61, \u5f80\u8be5\u5bf9\u8c61\u7684\u7f13\u51b2\u533a\u585e\u4efb\u52a1 <\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<hr \/>\n<h5><font color=\"blue\"><font face=\"\u534e\u6587\u884c\u6977\"><font size=\"6\">(5) \u5b9a\u4e49\u4e8b\u4ef6\u751f\u4ea7\u8005<\/font><\/font><\/font><\/h5>\n<hr \/>\n<p>\u751f\u4ea7\u8005\u8d1f\u8d23\u5c06\u6570\u636e&#xff08;\u4e8b\u4ef6&#xff09;\u53d1\u5230 Disruptor \u7684\u73af\u5f62\u7f13\u51b2\u533a\u4e2d\u3002<\/p>\n<p><img decoding=\"async\" src=\"2025-08-12vsduwtivkyn.png\" alt=\"image-20250809174918839\" \/><\/p>\n<p>\u4e3a\u4e86\u4fdd\u8bc1\u5728\u505c\u673a\u65f6\u6240\u6709\u7684\u6d88\u606f\u90fd\u80fd\u591f\u88ab\u5904\u7406&#xff0c;\u6211\u4eec\u901a\u8fc7 shutdown \u65b9\u6cd5\u5b8c\u6210 Disruptor \u7684\u4f18\u96c5\u505c\u673a\u3002<\/p>\n<p><span class=\"token annotation punctuation\">&#064;Component<\/span>  <span class=\"token comment\">\/\/ 1. \u5b9a\u4e49\u4e3a\u4e00\u4e2a bean<\/span><br \/>\n<span class=\"token annotation punctuation\">&#064;Slf4j<\/span><br \/>\n<span class=\"token keyword\">public<\/span> <span class=\"token keyword\">class<\/span> <span class=\"token class-name\">PictureEditEventProducer<\/span> <span class=\"token punctuation\">{<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 2. \u5f15\u5165 Disruptor \u961f\u5217 bean<\/span><br \/>\n    <span class=\"token annotation punctuation\">&#064;Resource<\/span><br \/>\n    <span class=\"token keyword\">private<\/span> <span class=\"token class-name\">Disruptor<\/span><span class=\"token generics\"><span class=\"token punctuation\">&lt;<\/span><span class=\"token class-name\">PictureEditEvent<\/span><span class=\"token punctuation\">&gt;<\/span><\/span> pictureEditEventDisruptor<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 3. \u7f16\u5199\u53d1\u5e03\u4e8b\u4ef6\u7684\u65b9\u6cd5, \u53c2\u6570\u4e3a\u751f\u4ea7\u8005\u4e8b\u4ef6\u7c7b\u7684\u5c5e\u6027<\/span><br \/>\n    <span class=\"token keyword\">public<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token function\">publishEvent<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">PictureEditRequestMessage<\/span> pictureEditRequestMessage<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">WebSocketSession<\/span> session<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">User<\/span> user<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">Long<\/span> pictureId<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ 4. \u83b7\u53d6\u7f13\u51b2\u533a\u5bf9\u8c61<\/span><br \/>\n        <span class=\"token class-name\">RingBuffer<\/span><span class=\"token generics\"><span class=\"token punctuation\">&lt;<\/span><span class=\"token class-name\">PictureEditEvent<\/span><span class=\"token punctuation\">&gt;<\/span><\/span> ringBuffer <span class=\"token operator\">&#061;<\/span> pictureEditEventDisruptor<span class=\"token punctuation\">.<\/span><span class=\"token function\">getRingBuffer<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ 5. \u83b7\u53d6\u73af\u5f62\u7f13\u51b2\u533a\u4e0b\u4e00\u4e2a\u53ef\u4ee5\u653e\u7f6e\u4e8b\u4ef6\u7684\u4f4d\u7f6e<\/span><br \/>\n        <span class=\"token keyword\">long<\/span> next <span class=\"token operator\">&#061;<\/span> ringBuffer<span class=\"token punctuation\">.<\/span><span class=\"token function\">next<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ 6. \u6839\u636e\u4e0b\u4e00\u4e2a\u653e\u7f6e\u4e8b\u4ef6\u7684\u4f4d\u7f6e, \u83b7\u53d6\u8fd9\u4e2a\u4f4d\u7f6e\u7684\u4e8b\u4ef6\u5bf9\u8c61<\/span><br \/>\n        <span class=\"token class-name\">PictureEditEvent<\/span> pictureEditEvent <span class=\"token operator\">&#061;<\/span> ringBuffer<span class=\"token punctuation\">.<\/span><span class=\"token function\">get<\/span><span class=\"token punctuation\">(<\/span>next<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ 7. \u5c06\u5916\u5c42\u4f20\u5165\u7684\u53c2\u6570, \u8bbe\u7f6e\u5230\u73af\u5f62\u7f13\u51b2\u533a\u4e0b\u4e00\u4e2a\u4f4d\u7f6e\u7684\u4e8b\u4ef6\u5bf9\u8c61\u662f\u5c5e\u6027\u4e2d<\/span><br \/>\n        pictureEditEvent<span class=\"token punctuation\">.<\/span><span class=\"token function\">setPictureEditRequestMessage<\/span><span class=\"token punctuation\">(<\/span>pictureEditRequestMessage<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        pictureEditEvent<span class=\"token punctuation\">.<\/span><span class=\"token function\">setSession<\/span><span class=\"token punctuation\">(<\/span>session<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        pictureEditEvent<span class=\"token punctuation\">.<\/span><span class=\"token function\">setUser<\/span><span class=\"token punctuation\">(<\/span>user<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        pictureEditEvent<span class=\"token punctuation\">.<\/span><span class=\"token function\">setPictureId<\/span><span class=\"token punctuation\">(<\/span>pictureId<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ 8. \u53d1\u5e03\u4e8b\u4ef6<\/span><br \/>\n        ringBuffer<span class=\"token punctuation\">.<\/span><span class=\"token function\">publish<\/span><span class=\"token punctuation\">(<\/span>next<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ 9. \u4e8b\u4ef6\u672a\u5904\u7406\u5b8c, \u961f\u5217\u8fdb\u884c\u4f18\u96c5\u505c\u673a<\/span><br \/>\n    <span class=\"token annotation punctuation\">&#064;PreDestroy<\/span><br \/>\n    <span class=\"token keyword\">public<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token function\">destroy<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span><br \/>\n        pictureEditEventDisruptor<span class=\"token punctuation\">.<\/span><span class=\"token function\">shutdown<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token comment\">\/\/ shutdown() \u662f Disruptor \u63d0\u4f9b\u7684\u73b0\u6210\u7684\u65b9\u6cd5, \u8ba9\u961f\u5217\u9ed8\u8ba4\u5904\u7406\u5b8c\u6240\u6709\u7684\u8ba9\u4efb\u52a1\u540e, \u518d\u5173\u95ed<\/span><br \/>\n        <span class=\"token comment\">\/\/ shutdown() \u53ef\u4ee5\u4f20\u9012\u4e8b\u4ef6\u53c2\u6570, \u8868\u793a\u9ed8\u8ba4\u591a\u5c11\u79d2\u540e\u5173\u95ed<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u6ce8\u610f: \u5173\u95ed\u53ef\u4ee5\u7c7b\u4f3c\u4e8e\u7ec8\u6b62\u670d\u52a1, \u5173\u95ed\u7a0b\u5e8f<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<hr \/>\n<h5><font color=\"blue\"><font face=\"\u534e\u6587\u884c\u6977\"><font size=\"6\">(6) \u4fee\u6539 <\/font><\/font><\/font><font color=\"blue\"><font face=\"\u534e\u6587\u6977\u4f53\"><font size=\"6\">PictureEditHandler <\/font><\/font><\/font><font color=\"blue\"><font face=\"\u534e\u6587\u884c\u6977\"><font size=\"6\">\u7684\u539f\u6709\u903b\u8f91<\/font><\/font><\/font><\/h5>\n<hr \/>\n<p>\u4fee\u6539 PictureEditHandler \u7684\u539f\u6709\u903b\u8f91&#xff08;\u53bb\u6389 switch&#xff09;&#xff0c;\u6539\u4e3a\u4f7f\u7528\u4e8b\u4ef6\u751f\u4ea7\u8005&#xff1a;<\/p>\n<p><img decoding=\"async\" src=\"2025-08-12umliypambrb.png\" alt=\"image-20250809180704982\" \/><\/p>\n<p><span class=\"token annotation punctuation\">&#064;Resource<\/span><br \/>\n<span class=\"token annotation punctuation\">&#064;Lazy<\/span><br \/>\n<span class=\"token keyword\">private<\/span> <span class=\"token class-name\">PictureEditEventProducer<\/span> pictureEditEventProducer<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token annotation punctuation\">&#064;Override<\/span><br \/>\n<span class=\"token keyword\">protected<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token function\">handleTextMessage<\/span><span class=\"token punctuation\">(<\/span><span class=\"token class-name\">WebSocketSession<\/span> session<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">TextMessage<\/span> message<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">throws<\/span> <span class=\"token class-name\">Exception<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u5c06\u6d88\u606f\u89e3\u6790\u4e3a PictureEditMessage<\/span><br \/>\n    <span class=\"token class-name\">PictureEditRequestMessage<\/span> pictureEditRequestMessage <span class=\"token operator\">&#061;<\/span> <span class=\"token class-name\">JSONUtil<\/span><span class=\"token punctuation\">.<\/span><span class=\"token function\">toBean<\/span><span class=\"token punctuation\">(<\/span>message<span class=\"token punctuation\">.<\/span><span class=\"token function\">getPayload<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">PictureEditRequestMessage<\/span><span class=\"token punctuation\">.<\/span><span class=\"token keyword\">class<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u4ece Session \u5c5e\u6027\u4e2d\u83b7\u53d6\u516c\u5171\u53c2\u6570<\/span><br \/>\n    <span class=\"token class-name\">Map<\/span><span class=\"token generics\"><span class=\"token punctuation\">&lt;<\/span><span class=\"token class-name\">String<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">Object<\/span><span class=\"token punctuation\">&gt;<\/span><\/span> attributes <span class=\"token operator\">&#061;<\/span> session<span class=\"token punctuation\">.<\/span><span class=\"token function\">getAttributes<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token class-name\">User<\/span> user <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token class-name\">User<\/span><span class=\"token punctuation\">)<\/span> attributes<span class=\"token punctuation\">.<\/span><span class=\"token function\">get<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;user&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token class-name\">Long<\/span> pictureId <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token class-name\">Long<\/span><span class=\"token punctuation\">)<\/span> attributes<span class=\"token punctuation\">.<\/span><span class=\"token function\">get<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;pictureId&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u6839\u636e\u6d88\u606f\u7c7b\u578b\u5904\u7406\u6d88\u606f(\u751f\u4ea7\u6d88\u606f\u5230 Disruptor \u73af\u5f62\u961f\u5217\u4e2d)<\/span><br \/>\n    pictureEditEventProducer<span class=\"token punctuation\">.<\/span><span class=\"token function\">publishEvent<\/span><span class=\"token punctuation\">(<\/span>pictureEditRequestMessage<span class=\"token punctuation\">,<\/span> session<span class=\"token punctuation\">,<\/span> user<span class=\"token punctuation\">,<\/span> pictureId<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u8fd9\u6837&#xff0c;\u6211\u4eec\u5c31\u5b9e\u73b0\u4e86\u57fa\u4e8e Disruptor \u7684\u5f02\u6b65\u6d88\u606f\u5904\u7406\u673a\u5236&#xff0c;\u5c06\u539f\u6709\u7684\u540c\u6b65\u6d88\u606f\u5206\u53d1\u903b\u8f91&#xff0c;\u6539\u9020\u4e3a\u9ad8\u6548\u89e3\u8026\u7684\u5f02\u6b65\u5904\u7406\u6a21\u578b&#xff0c;\u4e5f\u66f4\u6709\u5229\u4e8e\u4ee3\u7801\u7684\u6269\u5c55\u3002<\/p>\n<hr \/>\n<h3><font color=\"red\"><font face=\"\u534e\u6587\u884c\u6977\"><font size=\"6\">7\u3001\u6269\u5c55<\/font><\/font><\/font><\/h3>\n<hr \/>\n<li>\u4e3a\u9632\u6b62\u6d88\u606f\u4e22\u5931&#xff0c;\u53ef\u4ee5\u4f7f\u7528 Redis \u7b49\u9ad8\u6027\u80fd\u5b58\u50a8\u4fdd\u5b58\u6267\u884c\u7684\u64cd\u4f5c\u8bb0\u5f55\u3002\u76ee\u524d\u5982\u679c\u56fe\u7247\u5df2\u7ecf\u88ab\u7f16\u8f91\u4e86&#xff0c;\u65b0\u7528\u6237\u52a0\u5165\u7f16\u8f91\u65f6\u6ca1\u529e\u6cd5\u67e5\u770b\u5230\u5df2\u7f16\u8f91\u7684\u72b6\u6001&#xff0c;\u8fd9\u4e00\u70b9\u4e5f\u53ef\u4ee5\u5229\u7528 Redis \u4fdd\u5b58\u64cd\u4f5c\u8bb0\u5f55\u6765\u89e3\u51b3&#xff0c;\u65b0\u7528\u6237\u52a0\u5165\u7f16\u8f91\u65f6\u8bfb\u53d6 Redis \u7684\u64cd\u4f5c\u8bb0\u5f55\u5373\u53ef\u3002<\/li>\n<li>\u6bcf\u79cd\u7c7b\u578b\u7684\u6d88\u606f\u5904\u7406\u53ef\u4ee5\u5c01\u88c5\u4e3a\u72ec\u7acb\u7684 Handler \u5904\u7406\u5668\u7c7b&#xff0c;\u4e5f\u5c31\u662f\u91c7\u7528\u7b56\u7565\u6a21\u5f0f\u3002<\/li>\n<li>\u652f\u6301\u5206\u5e03\u5f0f WebSocket\u3002\u5b9e\u73b0\u601d\u8def\u5f88\u7b80\u5355&#xff0c;\u53ea\u9700\u8981\u4fdd\u8bc1\u8981\u7f16\u8f91\u540c\u4e00\u56fe\u7247\u7684\u7528\u6237&#xff0c;\u8fde\u63a5\u7684\u662f\u76f8\u540c\u7684\u670d\u52a1\u5668\u5373\u53ef&#xff0c;\u548c\u6e38\u620f\u5206\u670d\u52a1\u5668\u5927\u533a\u3001\u804a\u5929\u5ba4\u5206\u623f\u95f4\u662f\u7c7b\u4f3c\u7684\u539f\u7406\u3002<\/li>\n<li>\u4e00\u4e9b\u5c0f\u95ee\u9898\u7684\u4f18\u5316&#xff1a;\u6bd4\u5982 WebSocket \u8fde\u63a5\u5efa\u7acb\u4e4b\u540e&#xff0c;\u5982\u679c\u7528\u6237\u9000\u51fa\u4e86\u767b\u5f55&#xff0c;\u8fd9\u65f6 WebSocket \u7684\u8fde\u63a5\u662f\u6ca1\u6709\u65ad\u5f00\u7684\u3002\u4e0d\u8fc7\u5f71\u54cd\u5e76\u4e0d\u5927&#xff0c;\u5927\u5bb6\u53ef\u4ee5\u601d\u8003\u4e0b\u600e\u4e48\u5904\u7406\u3002<\/li>\n<hr \/>\n<p><img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/08\/20250812082007-689af93773c60.gif\" alt=\"\u5728\u8fd9\u91cc\u63d2\u5165\u56fe\u7247\u63cf\u8ff0\" \/><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/08\/20250812082011-689af93bdc7be.gif\" alt=\"\u5728\u8fd9\u91cc\u63d2\u5165\u56fe\u7247\u63cf\u8ff0\" \/><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u6587\u7ae0\u6d4f\u89c8\u9605\u8bfb116\u6b21\u3002\u667a\u80fd\u534f\u540c\u4e91\u56fe\u5e93\u7b2c\u5341\u4e00\u5f39\uff1a\u57fa\u4e8e WebSocket \u5b9e\u73b0\u534f\u540c\u7f16\u8f91\u529f\u80fd\u3001\u57fa\u4e8e Disruptor \u4f18\u5316 WebSocket \u957f\u8fde\u63a5\u3001\u9ad8\u5e76\u53d1\u573a\u666f\u4e0b\u7684\u963b\u585e\u3001\u987a\u5e8f\u4fdd\u8bc1\u4e0e\u4f4e\u5ef6\u8fdf\u95ee\u9898<\/p>\n","protected":false},"author":2,"featured_media":53715,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[5474,5475,374,393,98,947,1155,191],"topic":[],"class_list":["post-53735","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-server","tag-5474","tag-disruptor","tag-java-ee","tag-maven","tag-spring-boot","tag-websocket","tag-1155","tag-191"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u3010\u667a\u80fd\u534f\u540c\u4e91\u56fe\u5e93\u3011\u667a\u80fd\u534f\u540c\u4e91\u56fe\u5e93\u7b2c\u5341\u4e00\u5f39\uff1a\u57fa\u4e8e WebSocket \u5b9e\u73b0\u534f\u540c\u7f16\u8f91\u529f\u80fd\u3001\u57fa\u4e8e Disruptor \u4f18\u5316 WebSocket \u957f\u8fde\u63a5\u3001\u9ad8\u5e76\u53d1\u573a\u666f\u4e0b\u7684\u963b\u585e\u3001\u987a\u5e8f\u4fdd\u8bc1\u4e0e\u4f4e\u5ef6\u8fdf\u95ee\u9898 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.wsisp.com\/helps\/53735.html\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u3010\u667a\u80fd\u534f\u540c\u4e91\u56fe\u5e93\u3011\u667a\u80fd\u534f\u540c\u4e91\u56fe\u5e93\u7b2c\u5341\u4e00\u5f39\uff1a\u57fa\u4e8e WebSocket \u5b9e\u73b0\u534f\u540c\u7f16\u8f91\u529f\u80fd\u3001\u57fa\u4e8e Disruptor \u4f18\u5316 WebSocket \u957f\u8fde\u63a5\u3001\u9ad8\u5e76\u53d1\u573a\u666f\u4e0b\u7684\u963b\u585e\u3001\u987a\u5e8f\u4fdd\u8bc1\u4e0e\u4f4e\u5ef6\u8fdf\u95ee\u9898 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"og:description\" content=\"\u6587\u7ae0\u6d4f\u89c8\u9605\u8bfb116\u6b21\u3002\u667a\u80fd\u534f\u540c\u4e91\u56fe\u5e93\u7b2c\u5341\u4e00\u5f39\uff1a\u57fa\u4e8e WebSocket \u5b9e\u73b0\u534f\u540c\u7f16\u8f91\u529f\u80fd\u3001\u57fa\u4e8e Disruptor \u4f18\u5316 WebSocket \u957f\u8fde\u63a5\u3001\u9ad8\u5e76\u53d1\u573a\u666f\u4e0b\u7684\u963b\u585e\u3001\u987a\u5e8f\u4fdd\u8bc1\u4e0e\u4f4e\u5ef6\u8fdf\u95ee\u9898\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.wsisp.com\/helps\/53735.html\" \/>\n<meta property=\"og:site_name\" content=\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"article:published_time\" content=\"2025-08-12T08:20:32+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/08\/20250812082007-689af93773c60.gif\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"14 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/53735.html\",\"url\":\"https:\/\/www.wsisp.com\/helps\/53735.html\",\"name\":\"\u3010\u667a\u80fd\u534f\u540c\u4e91\u56fe\u5e93\u3011\u667a\u80fd\u534f\u540c\u4e91\u56fe\u5e93\u7b2c\u5341\u4e00\u5f39\uff1a\u57fa\u4e8e WebSocket \u5b9e\u73b0\u534f\u540c\u7f16\u8f91\u529f\u80fd\u3001\u57fa\u4e8e Disruptor \u4f18\u5316 WebSocket \u957f\u8fde\u63a5\u3001\u9ad8\u5e76\u53d1\u573a\u666f\u4e0b\u7684\u963b\u585e\u3001\u987a\u5e8f\u4fdd\u8bc1\u4e0e\u4f4e\u5ef6\u8fdf\u95ee\u9898 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"isPartOf\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\"},\"datePublished\":\"2025-08-12T08:20:32+00:00\",\"dateModified\":\"2025-08-12T08:20:32+00:00\",\"author\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/53735.html#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.wsisp.com\/helps\/53735.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/53735.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.wsisp.com\/helps\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u3010\u667a\u80fd\u534f\u540c\u4e91\u56fe\u5e93\u3011\u667a\u80fd\u534f\u540c\u4e91\u56fe\u5e93\u7b2c\u5341\u4e00\u5f39\uff1a\u57fa\u4e8e WebSocket \u5b9e\u73b0\u534f\u540c\u7f16\u8f91\u529f\u80fd\u3001\u57fa\u4e8e Disruptor \u4f18\u5316 WebSocket \u957f\u8fde\u63a5\u3001\u9ad8\u5e76\u53d1\u573a\u666f\u4e0b\u7684\u963b\u585e\u3001\u987a\u5e8f\u4fdd\u8bc1\u4e0e\u4f4e\u5ef6\u8fdf\u95ee\u9898\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\",\"url\":\"https:\/\/www.wsisp.com\/helps\/\",\"name\":\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"description\":\"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"contentUrl\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"caption\":\"admin\"},\"sameAs\":[\"http:\/\/wp.wsisp.com\"],\"url\":\"https:\/\/www.wsisp.com\/helps\/author\/admin\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"\u3010\u667a\u80fd\u534f\u540c\u4e91\u56fe\u5e93\u3011\u667a\u80fd\u534f\u540c\u4e91\u56fe\u5e93\u7b2c\u5341\u4e00\u5f39\uff1a\u57fa\u4e8e WebSocket \u5b9e\u73b0\u534f\u540c\u7f16\u8f91\u529f\u80fd\u3001\u57fa\u4e8e Disruptor \u4f18\u5316 WebSocket \u957f\u8fde\u63a5\u3001\u9ad8\u5e76\u53d1\u573a\u666f\u4e0b\u7684\u963b\u585e\u3001\u987a\u5e8f\u4fdd\u8bc1\u4e0e\u4f4e\u5ef6\u8fdf\u95ee\u9898 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.wsisp.com\/helps\/53735.html","og_locale":"zh_CN","og_type":"article","og_title":"\u3010\u667a\u80fd\u534f\u540c\u4e91\u56fe\u5e93\u3011\u667a\u80fd\u534f\u540c\u4e91\u56fe\u5e93\u7b2c\u5341\u4e00\u5f39\uff1a\u57fa\u4e8e WebSocket \u5b9e\u73b0\u534f\u540c\u7f16\u8f91\u529f\u80fd\u3001\u57fa\u4e8e Disruptor \u4f18\u5316 WebSocket \u957f\u8fde\u63a5\u3001\u9ad8\u5e76\u53d1\u573a\u666f\u4e0b\u7684\u963b\u585e\u3001\u987a\u5e8f\u4fdd\u8bc1\u4e0e\u4f4e\u5ef6\u8fdf\u95ee\u9898 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","og_description":"\u6587\u7ae0\u6d4f\u89c8\u9605\u8bfb116\u6b21\u3002\u667a\u80fd\u534f\u540c\u4e91\u56fe\u5e93\u7b2c\u5341\u4e00\u5f39\uff1a\u57fa\u4e8e WebSocket \u5b9e\u73b0\u534f\u540c\u7f16\u8f91\u529f\u80fd\u3001\u57fa\u4e8e Disruptor \u4f18\u5316 WebSocket \u957f\u8fde\u63a5\u3001\u9ad8\u5e76\u53d1\u573a\u666f\u4e0b\u7684\u963b\u585e\u3001\u987a\u5e8f\u4fdd\u8bc1\u4e0e\u4f4e\u5ef6\u8fdf\u95ee\u9898","og_url":"https:\/\/www.wsisp.com\/helps\/53735.html","og_site_name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","article_published_time":"2025-08-12T08:20:32+00:00","og_image":[{"url":"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2025\/08\/20250812082007-689af93773c60.gif"}],"author":"admin","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"admin","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"14 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.wsisp.com\/helps\/53735.html","url":"https:\/\/www.wsisp.com\/helps\/53735.html","name":"\u3010\u667a\u80fd\u534f\u540c\u4e91\u56fe\u5e93\u3011\u667a\u80fd\u534f\u540c\u4e91\u56fe\u5e93\u7b2c\u5341\u4e00\u5f39\uff1a\u57fa\u4e8e WebSocket \u5b9e\u73b0\u534f\u540c\u7f16\u8f91\u529f\u80fd\u3001\u57fa\u4e8e Disruptor \u4f18\u5316 WebSocket \u957f\u8fde\u63a5\u3001\u9ad8\u5e76\u53d1\u573a\u666f\u4e0b\u7684\u963b\u585e\u3001\u987a\u5e8f\u4fdd\u8bc1\u4e0e\u4f4e\u5ef6\u8fdf\u95ee\u9898 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","isPartOf":{"@id":"https:\/\/www.wsisp.com\/helps\/#website"},"datePublished":"2025-08-12T08:20:32+00:00","dateModified":"2025-08-12T08:20:32+00:00","author":{"@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41"},"breadcrumb":{"@id":"https:\/\/www.wsisp.com\/helps\/53735.html#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.wsisp.com\/helps\/53735.html"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.wsisp.com\/helps\/53735.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.wsisp.com\/helps"},{"@type":"ListItem","position":2,"name":"\u3010\u667a\u80fd\u534f\u540c\u4e91\u56fe\u5e93\u3011\u667a\u80fd\u534f\u540c\u4e91\u56fe\u5e93\u7b2c\u5341\u4e00\u5f39\uff1a\u57fa\u4e8e WebSocket \u5b9e\u73b0\u534f\u540c\u7f16\u8f91\u529f\u80fd\u3001\u57fa\u4e8e Disruptor \u4f18\u5316 WebSocket \u957f\u8fde\u63a5\u3001\u9ad8\u5e76\u53d1\u573a\u666f\u4e0b\u7684\u963b\u585e\u3001\u987a\u5e8f\u4fdd\u8bc1\u4e0e\u4f4e\u5ef6\u8fdf\u95ee\u9898"}]},{"@type":"WebSite","@id":"https:\/\/www.wsisp.com\/helps\/#website","url":"https:\/\/www.wsisp.com\/helps\/","name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","description":"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41","name":"admin","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/","url":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","contentUrl":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","caption":"admin"},"sameAs":["http:\/\/wp.wsisp.com"],"url":"https:\/\/www.wsisp.com\/helps\/author\/admin"}]}},"_links":{"self":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/53735","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/comments?post=53735"}],"version-history":[{"count":0,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/53735\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/media\/53715"}],"wp:attachment":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/media?parent=53735"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/categories?post=53735"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/tags?post=53735"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/topic?post=53735"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}