WebSockets, STOMP, SockJS рдФрд░ рд╕реНрдкреНрд░рд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ 4.0 рдХреЗ рд╕рд╛рде рд╕рд░рд▓ рдФрд░ рд╕реНрдХреЗрд▓реЗрдмрд▓ рдЗрд╡реЗрдВрдЯ рд╕рджрд╕реНрдпрддрд╛

рд╕реНрдкреНрд░рд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ 4.0 рдПрдо 1 рдХреЗ рдкрд╣рд▓реЗ рдЕрдВрддрд░рд┐рдо рд░рд┐рд▓реАрдЬ рдиреЗ рд╡реЗрдмрдХрд╛рд╕реНрдЯ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдФрд░ рд╕рдмрд╕реЗ рд╡реНрдпрд╛рдкрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди SockJS рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рд╕рдорд░реНрдерди рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ред рдЖрдкрдХреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЗрд╕ рдлрд╝реЙрд▓рдмреИрдХ рд╡рд┐рдХрд▓реНрдк рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдЬреЛ WebSocket рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдЬрд╣рд╛рдВ рдкреНрд░реЙрдХреНрд╕реА рдЙрдирдХреЗ рдЙрдкрдпреЛрдЧ рдореЗрдВ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХрд░рддрд╛ рд╣реИ ред рд╕реАрдзреЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдХрд╣реЗрдВ рддреЛ, SockJS рдЖрдЬ рдЖрдкрдХреЛ WebSocket рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдЕрдиреНрдп рдмрд╛рддреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкрд╛рд░рджрд░реНрд╢реА рд░реВрдк рд╕реЗ рдмреИрдХрдЕрдк рдХреНрд╖рдорддрд╛рдУрдВ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд▓реЗрдХрд┐рди рдмреИрдХрдЕрдк рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд╕рд╛рде рднреА, рд╕рдорд╕реНрдпрд╛рдПрдВ рдмрдиреА рд╣реБрдИ рд╣реИрдВред рдПрдХ рд╕реЙрдХреЗрдЯ рдПрдХ рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рдЕрдореВрд░реНрддрддрд╛ рд╣реИ рдФрд░ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдЖрдЬ рд╕реЙрдХреЗрдЯ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдирд╣реАрдВ рд╣реИрдВред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ WebSocket рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдПрдХ рдЙрдк-рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рддрдВрддреНрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЖрд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ WebSocket рдкрд░ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ (рдФрд░ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реИ), рдЗрд╕реА рддрд░рд╣ рд╣рдо рдЯреАрд╕реАрдкреА рдкрд░ HTTP рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рд╕реНрдкреНрд░рд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ 4.0 рдПрдо 2 рдХрд╛ рджреВрд╕рд░рд╛ рдЕрдВрддрд░рд┐рдо рд░рд┐рд▓реАрдЬ рдЖрдкрдХреЛ рд╡реЗрдмрд╕реЛрдХреЗрдЯ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рдореИрд╕реЗрдЬрд┐рдВрдЧ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЗрд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗред

рд╕реНрдЯреЙрдХ рдкреЛрд░реНрдЯрдлреЛрд▓рд┐рдпреЛ рдРрдк


рдЬреАрдердм рдкрд░ рдЙрдкрд▓рдмреНрдз рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдПрдкреНрд▓рд┐рдХреЗрд╢рди, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╕реНрдЯреЙрдХ рдЦрд░реАрджрдиреЗ, рдмреЗрдЪрдиреЗ рдФрд░ рдмреЗрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдкреЛрд░реНрдЯрдлреЛрд▓рд┐рдпреЛ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ; рдореВрд▓реНрдп рдЙрджреНрдзрд░рдг рднреЗрдЬрддрд╛ рд╣реИ рдФрд░ рд╕реНрдерд┐рддрд┐ рдЕрдкрдбреЗрдЯ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдХрд╛рдлреА рд╕рд░рд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдХрдИ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░-рдЖрдзрд╛рд░рд┐рдд рд╕рдВрджреЗрд╢ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдЙрддреНрдкрдиреНрди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред


рд╣рдо рдЗрд╕ рддрд░рд╣ рд╕реЗ рдПрдХ рдЖрд╡реЗрджрди рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ? HTTP рдФрд░ REST рдореЗрдВ, рд╣рдореЗрдВ рдпрд╣ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП URL рдФрд░ HTTP рддрд░реАрдХреЛрдВ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдПрдХ рд╕реЙрдХреЗрдЯ рдФрд░ рд╕рдВрджреЗрд╢реЛрдВ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рд╣реИред рдХреИрд╕реЗ рдмрддрд╛рдПрдВ рдХрд┐ рд╕рдВрджреЗрд╢ рдХрд┐рд╕рдХреЗ рд▓рд┐рдП рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ?


рдЗрд╕ рд╢рдмреНрджрд╛рд░реНрде рдХреЛ рд╡реНрдпрдХреНрдд рдХрд┐рдП рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдФрд░ рд╕рд░реНрд╡рд░ рдХреЛ рдПрдХ рдЖрдо рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рд░реВрдк рдкрд░ рд╕рд╣рдордд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдХрдИ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╣реИрдВ рдЬреЛ рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдордиреЗ рдЕрдкрдиреА рд╕рд░рд▓рддрд╛ рдФрд░ рд╡реНрдпрд╛рдкрдХ рд╕рдорд░реНрдерди рдХреЗ рдХрд╛рд░рдг рдЗрд╕ рд░рд┐рд▓реАрдЬрд╝ рдореЗрдВ STOMP рдХреЛ рдЪреБрдирд╛ред

рд╕рд░рд▓ / рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдЯреЗрдХреНрд╕реНрдЯ-рдУрд░рд┐рдПрдВрдЯреЗрдб рдореИрд╕реЗрдЬрд┐рдВрдЧ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ (STOMP)


STOMP рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдореИрд╕реЗрдЬрд┐рдВрдЧ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╣реИред HTTP рдкрд░ рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рдлрд╝реНрд░реЗрдо рдХреЗ рдЖрдзрд╛рд░ рдкрд░ред рдПрдХ рдлреНрд░реЗрдо рдореЗрдВ рдПрдХ рдХрдорд╛рдВрдб, рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реЗрдбрд░ рдФрд░ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдмреЙрдбреА рд╣реЛрддреА рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реНрдЯреЙрдХ рдкреЛрд░реНрдЯрдлреЛрд▓рд┐рдпреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЙрджреНрдзрд░рдг рднреЗрдЬ рд╕рдХрддрд╛ рд╣реИ, рдЧреНрд░рд╛рд╣рдХ рдПрдХ SUBSCRIBE рдлреНрд░реЗрдо рднреЗрдЬреЗрдЧрд╛, рдЬрд╣рд╛рдВ "рдЧрдВрддрд╡реНрдп" рд╢реАрд░реНрд╖рдХ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдХреНрдпрд╛ рд╕рджрд╕реНрдпрддрд╛ рд▓реЗ рд░рд╣рд╛ рд╣реИ:
SUBSCRIBE id:sub-1 destination:/topic/price.stock.* 

рдЬреИрд╕реЗ рд╣реА рд╕реНрдЯреЙрдХ рдЙрджреНрдзрд░рдг рдЙрдкрд▓рдмреНрдз рд╣реЛрддреЗ рд╣реИрдВ, рд╕рд░реНрд╡рд░ рд╕рдВрдмрдВрдзрд┐рдд "рдЧрдВрддрд╡реНрдп" рдФрд░ рд╕рджрд╕реНрдпрддрд╛ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрджреЗрд╢ рдлреНрд░реЗрдо рднреЗрдЬрддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА "рд╕рд╛рдордЧреНрд░реА-рдкреНрд░рдХрд╛рд░" рд╣реЗрдбрд░ рдФрд░ рдмреЙрдбреА:
 MESSAGE subscription:sub-1 message-id:wm2si1tj-4 content-type: application/json destination:/topic/stocks.PRICE.STOCK.NASDAQ.EMC {\"ticker\":\"EMC\",\"price\":24.19} 

рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдпрд╣ рд╕рдм рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо stomp.js рдФрд░ SockJS рдХреНрд▓рд╛рдЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:
 var socket = new SockJS('/spring-websocket-portfolio/portfolio'); var client = Stomp.over(socket); var onConnect = function() { client.subscribe("/topic/price.stock.*", function(message) { //   }); }; client.connect('guest', 'guest', onConnect); 

рдпрд╣ рдПрдХ рдЧрдВрднреАрд░ рдЕрдЧреНрд░рд┐рдо рд╣реИ! рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рдВрджреЗрд╢ рдкрд░ рдПрдХ рдорд╛рдирдХ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рд░реВрдк рдФрд░ рд╕рдорд░реНрдерди рд╣реИред

рдЕрдм рд╣рдо рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ - рд╕рд░реНрд╡рд░ рдХреА рддрд░рдлред

рд╕рдВрджреЗрд╢ рджрд▓рд╛рд▓


рд╕рдВрджреЗрд╢-рдмреНрд░реЛрдХрд░ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рд░реНрд╡рд░ рд╕рдорд╛рдзрд╛рди рд╣реИ рдЬрд╣рд╛рдВ рдкрд╛рд░рдВрдкрд░рд┐рдХ рдмреНрд░реЛрдХрд░реЛрдВ рдЬреИрд╕реЗ рдХрд┐ рд░реИрдмрд┐рдЯрдПрдордХреНрдпреВ, рдПрдХреНрдЯрд┐рд╡рдПрдордХреНрдпреВ, рдЖрджрд┐ рдХреЗ рдмреАрдЪ рд╕рдВрджреЗрд╢ рднреЗрдЬреЗ рдЬрд╛рддреЗ рд╣реИрдВред рдЕрдзрд┐рдХрд╛рдВрд╢, рдпрджрд┐ рд╕рднреА рдирд╣реАрдВ, рддреЛ TCP рдкрд░ STOMP, рдХреБрдЫ рд╕рдорд░реНрдерди WebSocket рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди RabbitMQ рд╕рдмрд╕реЗ рдЙрдиреНрдирдд рд╣реИ, рдФрд░ рдпрд╣ SockJS рдХреЗ рд╕рд╛рде рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рд╣рдорд╛рд░реА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА:


рдпрд╣ рдПрдХ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдФрд░ рд╕реНрдХреЗрд▓реЗрдмрд▓ рд╕рдорд╛рдзрд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рд╣рд╛рде рдореЗрдВ рдХрд╛рдо рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИред рд╕рдВрджреЗрд╢-рджрд▓рд╛рд▓ рдЖрдорддреМрд░ рдкрд░ рдПрдХ рдЙрджреНрдпрдо рдХреЗ рднреАрддрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕реЗ рд╕реАрдзреЗ рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрджрд░реНрд╢ рд╕рдорд╛рдзрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдЕрдЧрд░ рд╣рдордиреЗ REST рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдХреБрдЫ рд╕реАрдЦрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╣рдорд╛рд░реЗ рд╕рд┐рд╕реНрдЯрдо, рдбреЗрдЯрд╛рдмреЗрд╕ рдбрд┐рд╡рд╛рдЗрд╕ рдпрд╛ рдбреЛрдореЗрди рдореЙрдбрд▓ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЛ рдкреНрд░рдХрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рдЬрд╛рд╡рд╛ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдк рд╕рдВрднрд╡рддрдГ рдПрдХреНрд╕реЗрд╕ рдЕрдзрд┐рдХрд╛рд░реЛрдВ, рдорд╛рдиреНрдпрддрд╛рдУрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдЬрд┐рдХ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдВрджреЗрд╢-рдмреНрд░реЛрдХрд░ рдХреЗ рд╕рд╛рде рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рд░реНрд╡рд░ рдмреНрд░реЛрдХрд░ рдХреЗ рдкреАрдЫреЗ рд╣реИ, рдЬреЛ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╡реЗрдм рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕реЗ рдХрд╛рдлреА рдЕрд▓рдЧ рд╣реИред

рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╕реЙрдХреЗрдЯ.рдЖрдИрдУ рдЬреИрд╕реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реИрдВ ред рдпрд╣ рд╕рд░рд▓ рд╣реИ рдФрд░ рдпрд╣ рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреА рдЬрд░реВрд░рддреЛрдВ рдХреЛ рд▓рдХреНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рджреВрд╕рд░реА рдУрд░, рд╣рдореЗрдВ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдВрджреЗрд╢-рджрд▓рд╛рд▓ рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХреЛ рдирдЬрд░рдЕрдВрджрд╛рдЬ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рдЕрдЪреНрдЫреЗ рд╣реИрдВ - рдПрдХ рдХрдард┐рди рджреБрд╡рд┐рдзрд╛ред рджреЛрдиреЛрдВ рдХрд╛ рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рд▓реЗрдВред

рдЖрд╡реЗрджрди + рд╕рдВрджреЗрд╢-рджрд▓рд╛рд▓


рдПрдХ рдЕрдиреНрдп рджреГрд╖реНрдЯрд┐рдХреЛрдг рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдирд╛ рд╣реИ рдЬреЛ рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╡реЗрдм рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рдмреНрд░реЛрдХрд░ рдХреЗ рдмреАрдЪ рдордзреНрдпрд╕реНрде рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЗ рдмреНрд░реЛрдХрд░ рдХреЗ рд╕рдВрджреЗрд╢ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рднреЗрдЬреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд░рд┐рдЯрд░реНрди рдореИрд╕реЗрдЬ рднреА рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗ рд╣реЛрдХрд░ рдЧреБрдЬрд░реЗрдЧрд╛ред рдпрд╣ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╕рдВрджреЗрд╢ рдХреЗ рдкреНрд░рдХрд╛рд░ рдФрд░ рд╣реЗрдбрд░ "рдЧрдВрддрд╡реНрдп" рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдпрд╛ рдмреНрд░реЛрдХрд░ рдХреЛ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рд╣рдордиреЗ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдЪреБрдирд╛ рд╣реИред рдЗрд╕реЗ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рд╕рдордЭрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдХреБрдЫ рдкрд░рд┐рджреГрд╢реНрдп рд╣реИрдВред

рдкрджреЛрдВ рдХрд╛ рдПрдХ рдкреЛрд░реНрдЯрдлреЛрд▓рд┐рдпреЛ рд▓реЛрдб рд╣реЛ рд░рд╣рд╛ рд╣реИ

рд╕реНрдЯреЙрдХ рдХреЛрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рд╕рджрд╕реНрдпрддрд╛

рд╕реНрдЯреЙрдХ рднрд╛рд╡ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛

рд▓реЗрди-рджреЗрди рдХрд╛ рдЖрдпреЛрдЬрди

рдЕрджреНрдпрддрд┐рдд рдкрджреЛрдВ рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛

рд╕рдЦреНрддреА рд╕реЗ рдмреЛрд▓рдирд╛, рд╕рдВрджреЗрд╢ рдмреНрд░реЛрдХрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИред рд╣рдо рдПрдХ "рд╕рд░рд▓" рдмреЙрдХреНрд╕рд┐рдВрдЧ рд╡рд┐рдХрд▓реНрдк рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕реНрдХреЗрд▓реЗрдмрд┐рд▓рд┐рдЯреА рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрджреЗрд╢ рдмреНрд░реЛрдХрд░ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИ рдФрд░ рдЬрдм рдХрдИ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рддреИрдирд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ


рдЖрдЗрдП рд╕рд░реНрд╡рд░ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛрдб рдХреЗ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВред

рдпрд╣ рдкреЛрд░реНрдЯрдлреЛрд▓рд┐рдпреЛ рд╕реЗ рдкрджреЛрдВ рдХреЗ рдПрдХ рдкреЛрд░реНрдЯрдлреЛрд▓рд┐рдпреЛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреБрд░реЛрдз рд╣реИред рдЬреЗрдПрд╕ :
 stompClient.subscribe("/app/positions", function(message) { self.portfolio().loadPositions(JSON.parse(message.body)); }); 

рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдкрд░, PortContController рдЕрдиреБрд░реЛрдз рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддрд╛ рд╣реИ рдФрд░ рдЕрдиреБрд░реЛрдз-рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░рддреЗ рд╣реБрдП, рдкрджреЛрдВ рдХрд╛ рдПрдХ рдкреЛрд░реНрдЯрдлреЛрд▓рд┐рдпреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдмрд╣реБрдд рдмрд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рд╣рдо HTTP рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рд╕реНрдкреНрд░рд┐рдВрдЧ рд╕рд┐рдХреНрдпреЛрд░рд┐рдЯреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рдПрдХ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╡реЗрдмрд╕реЗрдХреЗрдЯ рдХреЗ рд╕рд╛рде рд╣реИрдВрдбрд╢реЗрдХ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╡рд┐рдзрд┐ рдХреЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ, HttpServletRequest рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдкреНрд░рд┐рдВрд╕рд┐рдкрд▓ рд╕реНрдкреНрд░рд┐рдВрдЧ рд╕рд┐рдХреНрдпреЛрд░рд┐рдЯреА рдпреВрдЬрд░ рдХреЛ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
 @Controller public class PortfolioController { // ... @SubscribeEvent("/app/positions") public List<PortfolioPosition> getPortfolios(Principal principal) { String user = principal.getName(); Portfolio portfolio = this.portfolioService.findPortfolio(user); return portfolio.getPositions(); } } 

рдпрд╣рд╛рдВ рдкреЛрд░реНрдЯрдлреЛрд▓рд┐рдпреЛ.рдЬреЗрдПрд╕ рд╡реНрдпрд╛рдкрд╛рд░ рдЕрдиреБрд░реЛрдз рднреЗрдЬрддрд╛ рд╣реИ:
 stompClient.send("/app/trade", {}, JSON.stringify(trade)); 

рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдкрд░, PortContController рдЗрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ:
 @Controller public class PortfolioController { // ... @MessageMapping(value="/app/trade") public void executeTrade(Trade trade, Principal principal) { trade.setUsername(principal.getName()); this.tradeService.executeTrade(trade); } } 

PortContController рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдПрдХ рд╕рдВрджреЗрд╢ рднреЗрдЬрдХрд░ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рднреА рд╕рдВрднрд╛рд▓ рд╕рдХрддрд╛ рд╣реИ:
 @Controller public class PortfolioController { // ... @MessageExceptionHandler @ReplyToUser(value="/queue/errors") public String handleException(Throwable exception) { return exception.getMessage(); } } 

рд╕рднреА рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рддреЛ QuoteService рднреЗрдЬрддрд╛ рдХреЛрдЯрд╛:
 @Service public class QuoteService { private final MessageSendingOperations<String> messagingTemplate; @Scheduled(fixedDelay=1000) public void sendQuotes() { for (Quote quote : this.quoteGenerator.generateQuotes()) { String destination = "/topic/price.stock." + quote.getTicker(); this.messagingTemplate.convertAndSend(destination, quote); } } } 

рдФрд░ рдЗрд╕рд▓рд┐рдП TradeService рдиреЗ рд╕реМрджрд╛ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдПрдХ рд╕реНрдерд┐рддрд┐ рдЕрдкрдбреЗрдЯ рднреЗрдЬрд╛:
 @Service public class TradeService { // ... @Scheduled(fixedDelay=1500) public void sendTradeNotifications() { for (TradeResult tr : this.tradeResults) { String queue = "/queue/position-updates"; this.messagingTemplate.convertAndSendToUser(tr.user, queue, tr.position); } } } 

рдФрд░ рдмрд╕ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрджрд┐ рдЖрдк рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ ... рд╣рд╛рдБ, PortCortController рдореЗрдВ рд╕реНрдкреНрд░рд┐рдВрдЧ MVC рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, @RequestMapping ), рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рдСрдирд▓рд╛рдЗрди рдЧреЗрдо рдмрдирд╛рдиреЗ рд╡рд╛рд▓реЗ рдбреЗрд╡рд▓рдкрд░ рджреНрд╡рд╛рд░рд╛ рдЗрд╕ рдЯрд┐рдХрдЯ рдореЗрдВ рд╕реБрдЭрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛:
рдЙрджреНрдзрд░рдг
рд╣рд╛рдВ, [рд╕рдВрджреЗрд╢] рдореИрдкрд┐рдВрдЧ рдФрд░ рд╕реНрдкреНрд░рд┐рдВрдЧ mvc рдореИрдкрд┐рдВрдЧ рд╕рдореЗрдХрд┐рдд рд╣реЛрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдПрдХреАрдХреГрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдФрд░ рдмрд╕ QuoteService рдФрд░ TradeService рдХреА рддрд░рд╣, рд╕реНрдкреНрд░рд┐рдВрдЧ MVC рдирд┐рдпрдВрддреНрд░рдХ рд╡рд┐рдзрд┐рдпрд╛рдБ рднреА рд╕рдВрджреЗрд╢ рдкреЛрд╕реНрдЯ рдХрд░ рд╕рдХрддреА рд╣реИрдВред

рд╡рд╕рдВрдд рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рд╕рдВрджреЗрд╢ рд╕рдорд░реНрдерди


рдПрдХ рд▓рдВрдмреЗ рд╕рдордп рдХреЗ рд▓рд┐рдП, рд╕реНрдкреНрд░рд┐рдВрдЧ рдЗрдВрдЯреАрдЧреНрд░реЗрд╢рди рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЬреНрдЮрд╛рдд рдПрдВрдЯрд░рдкреНрд░рд╛рдЗрдЬ рдЗрдВрдЯреАрдЧреНрд░реЗрд╢рди рдкреИрдЯрд░реНрди рдХреЗ рд╕рд╛рде-рд╕рд╛рде рд╣рд▓реНрдХреЗ рд╕рдВрджреЗрд╢ рдХреЗ рд▓рд┐рдП рдкреНрд░рдердо рд╢реНрд░реЗрдгреА рдХреЗ рд╕рд╛рд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рд░рд┐рд▓реАрдЬ рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реБрдП, рд╣рдореЗрдВ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдмрд╛рдж рдореЗрдВ рд╡рд╣реА рдерд╛, рдЬрд┐рд╕ рдкрд░ рд╣рдореЗрдВ рднрд░реЛрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рдереАред

рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдФрд░ рдореБрдЭреЗ рдпрд╣ рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реБрдП рдкреНрд░рд╕рдиреНрдирддрд╛ рд╣реЛ рд░рд╣реА рд╣реИ, рд╣рдордиреЗ рд╕реНрдкреНрд░рд┐рдВрдЧ рдЗрдВрдЯреАрдЧреНрд░реЗрд╢рди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕реЗрдЯ рдХреЛ рдирдП рд╕реНрдкреНрд░рд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╕реНрдкреНрд░рд┐рдВрдЧ-рдореИрд╕реЗрдЬрд┐рдВрдЧ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдореБрдЦреНрдп рдЕрдореВрд░реНрдд, рдЬреИрд╕реЗ рдХрд┐ рд╕рдВрджреЗрд╢, рд╕рдВрджреЗрд╢рдЪреИрди, рд╕рдВрджреЗрд╢рд╣реИрдВрдбрд▓рд░, рдЖрджрд┐ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдирдП рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдПрдиреЛрдЯреЗрд╢рди рдФрд░ рдХрдХреНрд╖рд╛рдПрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

рдЕрдм, рдЗрд╕реЗ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП, рд╣рдо рд╕реНрдЯреЙрдХ рдкреЛрд░реНрдЯрдлреЛрд▓рд┐рдпреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рдЖрдВрддрд░рд┐рдХ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдЖрд░реЗрдЦ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ:


StompWebSocketHandler рдкреНрд░реЗрд╖рдг рдЪреИрдирд▓ рдореЗрдВ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рд░рдЦрддрд╛ рд╣реИред рдЗрд╕ рдЪреИрдирд▓ рдХреЗ 3 рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░ рд╣реИрдВред рдкрд╣рд▓рд╛ рдПрдХ рдПрдиреЛрдЯреЗрдЯ рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ, рджреВрд╕рд░рд╛ рдПрдХ STOMP рдмреНрд░реЛрдХрд░ рдХреЛ рд╕рдВрджреЗрд╢ рднреЗрдЬрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рддреАрд╕рд░рд╛ рдПрдХ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдЧрдВрддрд╡реНрдп рдкрддреЗ рдХреЛ рдЕрджреНрд╡рд┐рддреАрдп рдирд╛рдореЛрдВ рдХреА рдПрдХ рдХрддрд╛рд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдХреЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЧреНрд░рд╛рд╣рдХ рдиреЗ рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм рдХрд┐рдпрд╛ рд╣реИред

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрд░рд┐рдЪрд┐рдд рдХреЗ рд▓рд┐рдП рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП "рд╕рд░рд▓" рдмреНрд░реЛрдХрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ README рдореЗрдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЖрдк рдкреНрд░реЛрдлрд╛рдЗрд▓ рдХреЛ рд╕рдХреНрд░рд┐рдп рдФрд░ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд░рдХреЗ рдПрдХ "рд╕рд░рд▓" рдФрд░ рдкреВрд░реНрдг рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рд╡рд╛рд▓реЗ рдмреНрд░реЛрдХрд░ рдХреЗ рдмреАрдЪ рдЪрдпрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рдПрдХ рдЕрдиреНрдп рд╕рдВрднрд╛рд╡рд┐рдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкрд░рд┐рд╡рд░реНрддрди рдПрдХреНрдЬрд╝реАрдХреНрдпреВрдЯрд░ рд╕реЗ рд░рд┐рдПрдХреНрдЯрд░-рдЖрдзрд╛рд░рд┐рдд рд╕рдВрджреЗрд╢рдЪреИрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рд▓реЗ рдЬрд╛рдирд╛ рд╣реИред рд░рд┐рдПрдХреНрдЯрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЕрдкрдиреА рдкрд╣рд▓реА рдЕрдВрддрд░рд┐рдо рд░рд┐рд▓реАрдЬ рдЬрд╛рд░реА рдХреА рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдФрд░ рд╕рдВрджреЗрд╢-рдмреНрд░реЛрдХрд░ рдХреЗ рдмреАрдЪ рдЯреАрд╕реАрдкреА рдХрдиреЗрдХреНрд╢рди рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдпрд╣рд╛рдВ рдЖрдк рдкреВрд░реНрдг рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдирдпрд╛ рд╕реНрдкреНрд░рд┐рдВрдЧ рд╕рд┐рдХреНрдпреЛрд░рд┐рдЯреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рднреА рд╢рд╛рдорд┐рд▓ рд╣реИред рдЖрдк рдПрд╕рдЯреАрдПрд╕ рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╕рдорд░реНрдерди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдЗрдЪреНрдЫреБрдХ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╕рдВрджреЗрд╢ рднреЗрдЬрдирд╛


рдпрд╣ рд╕рдордЭрдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ рд╕рднреА рд╕рд╛рдЗрди рдЕрдк рдХрд┐рдП рдЧрдП рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рд╕рдВрджреЗрд╢ рдХреИрд╕реЗ рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ - рдмрд╕ рдЪреИрдирд▓ рдХреЛ рдПрдХ рд╕рдВрджреЗрд╢ рднреЗрдЬреЗрдВред рдХреБрдЫ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЧреНрд░рд╛рд╣рдХ рдХреЛ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рддрд┐ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдиреЗ рдПрдХ рдЕрдкрд╡рд╛рдж рдкрдХрдбрд╝рд╛ рдФрд░ рдПрдХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рднреЗрдЬрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдпрд╛ рдЖрдкрдХреЛ рд▓реЗрдирджреЗрди рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреА рдкреБрд╖реНрдЯрд┐ рдорд┐рд▓реА рд╣реИ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЦреБрд╢ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдкрд╛рд░рдВрдкрд░рд┐рдХ рдореИрд╕реЗрдЬрд┐рдВрдЧ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ, рдпрд╣ рдХрд╛рд░реНрдп рдЖрдорддреМрд░ рдкрд░ рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдХрддрд╛рд░ рдмрдирд╛рдХрд░ рдФрд░ рд╕рднреА рд╕рдВрджреЗрд╢реЛрдВ рдореЗрдВ "рд░рд┐рдкреНрд▓рд╛рдИ-рдЯреВ" рд╣реЗрдбрд░ рд╕реЗрдЯ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рднрд╛рд░реА рджрд┐рдЦрддрд╛ рд╣реИред рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рд╕рднреА рд▓рд╛рдЧреВ рд╕рдВрджреЗрд╢реЛрдВ рдкрд░ рдЖрд╡рд╢реНрдпрдХ рд╣реЗрдбрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рднреВрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рд╕рд░реНрд╡рд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЙрдирдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рдХрднреА-рдХрднреА рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╕рдВрджреЗрд╢ рдХреЗ рдмрдЬрд╛рдп HTTP POST рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред

рдЗрд╕ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдЬреБрдбрд╝реЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдХрддрд╛рд░ рдкреНрд░рддреНрдпрдп рднреЗрдЬрддреЗ рд╣реИрдВред рдкреНрд░рддреНрдпрдп рдХреЛ рдЕрджреНрд╡рд┐рддреАрдп рдХрддрд╛рд░ рдирд╛рдо рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
 client.connect('guest', 'guest', function(frame) { var suffix = frame.headers['queue-suffix']; client.subscribe("/queue/error" + suffix, function(msg) { //   }); client.subscribe("/queue/position-updates" + suffix, function(msg) { //    }); }); 

рдлрд┐рд░ рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдкрд░, рдЖрдк @ReplyToUser рдПрдиреЛрдЯреЗрд╢рди рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рд╡рд┐рдзрд┐ @MessageExceptionHandler (рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕рдВрджреЗрд╢ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╡рд┐рдзрд┐) рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕рдВрджреЗрд╢ рдХреЗ рд░реВрдк рдореЗрдВ рд░рд┐рдЯрд░реНрди рдорд╛рди рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ:
 @MessageExceptionHandler @ReplyToUser(value="/queue/errors") public String handleException(Throwable exception) { // ... } 

TradeService рдЬреИрд╕реА рдЕрдиреНрдп рд╕рднреА рдХрдХреНрд╖рд╛рдПрдВ, рд╕рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрд╕реЗрдЬрд┐рдВрдЧ рдЯреЗрдордкреНрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреА рд╣реИрдВ:
 String user = "fabrice"; String queue = "/queue/position-updates"; this.messagingTemplate.convertAndSendToUser(user, queue, position); 

рджреЛрдиреЛрдВ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рд╕рд╣реА рдХрддрд╛рд░ рдирд╛рдо рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдЕрдВрджрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрддрд╛рд░ рдкреНрд░рддреНрдпрдп (рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдП рдЧрдП UserQueueSuffixResolver рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ) рд╣реИред рдлрд┐рд▓рд╣рд╛рд▓, рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд░рд┐рдЬрд╝реЙрд▓реНрд╡рд░ рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, Redis- рдЖрдзрд╛рд░рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рд░реНрд╡рд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд╡рдЬреВрдж рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдЧрд╛ред

рдирд┐рд╖реНрдХрд░реНрд╖


рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдирдИ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдпреЛрдЧреА рдкрд░рд┐рдЪрдп рд░рд╣рд╛ рд╣реИред рдкреЛрд╕реНрдЯ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рд▓рдВрдмрд╛ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдореИрдВ рдЖрдкрдХреЛ рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдЙрди рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдпрд╛ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рд░рдЦрддреЗ рд╣реИрдВред рдпрд╣ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрджрд░реНрд╢ рд╕рдордп рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рд╕рд┐рддрдВрдмрд░ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдПрдХ рд░рд┐рд▓реАрдЬ рдХреЗ рдЙрдореНрдореАрджрд╡рд╛рд░ рдХреА рдпреЛрдЬрдирд╛ рдХреИрд╕реЗ рдмрдирд╛рддреЗ рд╣реИрдВред

Source: https://habr.com/ru/post/In187822/


All Articles