рд╡рд╕рдВрдд рдХреЗ рд╕рд╛рде рд╡реЗрдм рдХреЛрдбрд┐рдВрдЧ

рдореИрдВ рддреБрд░рдВрдд рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреА рдмрд╛рддрдЪреАрдд рдХрд╛ рдПрдХ рдорд╛рдирдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореМрдЬреВрдж рд╣реИ ред



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



рдкрд╣рд▓реЗ рд▓реЗрдЦ рдореЗрдВ, рдЕрдЬрд╛рдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реЗрд╡рд╛ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрдВрддреНрд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред



рдпрд╣ рдЖрд▓реЗрдЦ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдХреЛрдб рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рдмрд┐рдирд╛ рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдХреЗ рд╕рд╛рде AJAX рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд╕рд╛рде рдЗрд╕ рддрдВрддреНрд░ рдХреЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПред



рдРрд╕рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдПрдХ рддреЗрдЬрд╝ рдХрдиреЗрдХреНрд╢рди рджреЗрддрд╛ рд╣реИ (рдЕрдВрдд рдореЗрдВ рдкрд░реАрдХреНрд╖рдг), рд╕рд░реНрд╡рд░ рдореЗрдореЛрд░реА рдХреЛ рдмрдЪрд╛рддрд╛ рд╣реИ, рдФрд░ рд╕рд░реНрд╡рд░ рд╕реЗ рдХреНрд▓рд╛рдЗрдВрдЯ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝рддрд╛ рд╣реИред



рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдЪреИрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рдареБрдм рдкрд░ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рд╕рд╛рдеред

рдЬрд┐рд╕рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдореИрдВ рдпрд╣ рд╕рдордЭрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдЗрд╕ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рднрд╛рдЧреЛрдВ рдХреЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЖрд╡реЗрджрди рдЯреЙрдордХреИрдЯ 7.042 рд╕рд░реНрд╡рд░ рдкрд░ рдЪрд▓рддрд╛ рд╣реИред

Https рдФрд░ wss (рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХреА рдкреБрд╖реНрдЯрд┐ рдирд╣реАрдВ) рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╕рд░реНрд╡рд░ рдкрд░ рд▓реЙрдЧ рдХреЛ рдмрдирд╛рдП рдирд╣реАрдВ рд░рдЦрддрд╛ рд╣реИред



рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб



рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рд╛рде рд╡реЗрдм-рд╕реЙрдХреЗрдЯ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреЗ рд╕рдВрдЧрдарди рдХреЗ рджреМрд░рд╛рди рдЙрддреНрдкрдиреНрди рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рдореБрдЦреНрдп рдкреНрд░рд╢реНрди рдпрд╣ рд╕рд╡рд╛рд▓ рдерд╛ - рдпрд╣ рдХреИрд╕реЗ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд╕реНрдкреНрд░рд┐рдВрдЧ рдШрдЯрдХреЛрдВ рдХреЛ рдЕрдкрдиреЗ рджреГрд╢реНрдп рдХреНрд╖реЗрддреНрд░реЛрдВ рд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдХрд┐ WebInocketServlet рд╡рд░реНрдЧ рдХреА createWebSocketSbound рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рджрд┐рдП рдЧрдП рд╕реНрдЯреНрд░реАрдордЗрдирдмрд╛рдЙрдВрдб рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ HTTP рд╕рддреНрд░ рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рд╕рддреНрд░ рд╕реЗ рдЬреБрдбрд╝рд╛ рдирд╣реАрдВ рд╣реИ?



рд╕рд░реНрд╡рд░ рдШрдЯрдХреЛрдВ рдХреЗ рдХреЙрд▓рд┐рдВрдЧ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рд╕реНрдЯреНрд░реАрдордЗрдирдмрд╛рдЙрдВрдб рд╡рдВрд╢ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ ApplicationContext рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред



рдпрджрд┐ рд╣рдо ApplicationContext рдХреЛ рдЕрдзрд┐рдХреГрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╣рдо рдЙрди рдШрдЯрдХреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХреЗрдВ рдЬрд┐рдирдХреА рд╣рдореЗрдВ WebSocketServlet рдпрд╛ StreamInbound рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░реА рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдирд┐рд░рд╛рд╢рд╛ рд╣реЛрдЧреА, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрд░рдВрднрд┐рдХ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдЬреЛ рдХрд┐ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдиреВрдиреА рд╣реИред



рд╡реЗрдм рд╕реЙрдХреЗрдЯ рд╣реИрдВрдбрд▓рд░ рд╕реЗ http рд╕рддреНрд░ рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝реЗ рд╕реНрдкреНрд░рд┐рдВрдЧ рд╕рдВрджрд░реНрднреЛрдВ рд╕реЗ рдШрдЯрдХреЛрдВ рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдПрдХ рд╕рддреНрд░ рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреАрди рд╣реЛрдЧрд╛, рдФрд░ рдЬрд┐рд╕реЗ рд╕реНрдЯреЛрд░реЗрдЬ рдХреНрд▓рд╛рд╕ рдХреЗ рдПрдХ рд╕реНрдерд┐рд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕рдХреЗ рдкрд╛рд╕ рдпрд╣ рдПрдХреНрд╕реЗрд╕ рдерд╛ рд╕реНрдЯреНрд░реАрдордЗрдирдмрд╛рдЙрдВрдб рдХрд╛ рд╡рд╛рд░рд┐рд╕ рд╣реЛрдЧрд╛ред



рдпрд╣ рд╕рддреНрд░ рдСрдмреНрдЬреЗрдХреНрдЯ (рдЗрд╕реЗ рдЧреНрд░рд╛рд╣рдХ рдкреНрд░рдмрдВрдзрдХ рдХрд╣рддреЗ рд╣реИрдВ) рдПрдХ http рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред



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



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



рдпрд╣ рдЕрдиреБрд░реЛрдз рд╕рддреНрд░ рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ initializeClientManager рд╡рд┐рдзрд┐ рдореЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:



@Controller @Scope("session") public class ClientManagerController { @Autowired private ClientManager clientManager; @RequestMapping(value = "/init", method = RequestMethod.POST) @ResponseBody private String initializeClientManager(HttpSession session) { JSONObject result = new JSONObject(); try{ boolean loged = ClientManagersStorage.checkClientManager(clientManager, session) ; result.put("loged", loged); result.put("clientManagerId", clientManager.getId()); }catch(Throwable th){ result.put("error", th.toString()); } return result.toString(); }
      
      







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



 public class ClientManagersStorage { final static private Map<String, ClientManager> clientManagers = new ConcurrentHashMap <String, ClientManager>(); public static boolean checkClientManager(ClientManager clientManager, HttpSession session) { ClientManager registeredClientManager = clientManagers.get(clientManager.getId()); if (registeredClientManager == null) { clientManager.setSession(session); addClientManager(clientManager); registeredClientManager = clientManager; } return registeredClientManager.getUser() != null; } ... }
      
      







(рд╕рддреНрд░ рдЬреАрд╡рдирдЪрдХреНрд░ рдкреНрд░рдмрдВрдзрди рдкрд░ рдереЛрдбрд╝рд╛ рдиреАрдЪреЗ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреА)



рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдкреНрд░рдмрдВрдзрдХреЛрдВ рдХреЛ рдПрдХ рд╕реНрдерд┐рд░ рдорд╛рдирдЪрд┐рддреНрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреБрдВрдЬреА рдЙрдирдХреЗ рд╣реИрд╢рдХреЛрдб рдХреЗ рд╕рд╛рде рд╣реЛрддреА рд╣реИ, рдФрд░ рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреГрд╖реНрда рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЙрд╕реА рдкреНрд░рдмрдВрдзрдХ рдХреЛ рдЙрд╕реЗ рд╕реМрдВрдкрд╛ рдЬрд╛рддрд╛ рд╣реИред



рдЗрд╕ рдкреНрд░рдмрдВрдзрдХ рдХреА рдЖрдИрдбреА рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреНрд▓рд╛рдЗрдВрдЯ рдкреЗрдЬ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдЪрд░ рдореЗрдВ рджреА рдЬрд╛рддреА рд╣реИред



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



рдЗрд╕ рдХрдиреЗрдХреНрд╢рди рдХреЛ рдЦреЛрд▓рдиреЗ рдХрд╛ рдЕрдиреБрд░реЛрдз WebSocketConnectorServlet рд╡рд░реНрдЧ рдХреЗ рдЕрдореВрд░реНрдд WebSocketServlet рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА CreateWebSocketInbound рд╡рд┐рдзрд┐ рдореЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред



 @Override protected StreamInbound createWebSocketInbound(String paramString, HttpServletRequest request) { String clientManagerId = request.getParameter("clientManagerId"); ClientManager clientManager = ClientManagersStorage.findClientManager(clientManagerId); if(clientManager == null){ return new WebSocketConnection(null); } log.debug("new connection"); return new WebSocketConnection(clientManager); }
      
      





рдЗрд╕рдореЗрдВ, clientManagerId рдЕрдиреБрд░реЛрдз рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЙрд╕ рдкрд░ ClientManager рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ WebSocketConnection рдСрдмреНрдЬреЗрдХреНрдЯ (рдЬреЛ StreamInbound рд╣реИ) рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП ClientManager рдмрд╛рдзреНрдп рд╣реИред



рдЪреВрдВрдХрд┐ ClientManager рдПрдХ рд╕рддреНрд░ рдПрдХ рд╣реИ, рдФрд░ рдЗрд╕реЗ рдПрдХ "рд╕рд╛рдорд╛рдиреНрдп" http рдЕрдиреБрд░реЛрдз рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рд╕рднреА рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреАрдиреНрд╕ рдЗрд╕рдореЗрдВ рд╕реЗ рдЕрдкреНрд▓реАрдХреЗрд╢рди рдХреЙрдиреНрдЯреЗрдХреНрд╕реНрдЯ рдСрдЯреЛ-рдЯреНрд░рд╕реНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реБрд▓рдн рд╣реЛрдВрдЧреЗ, рдЬреЛ рдпрд╣рд╛рдВ, рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЖрд░рдВрднреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛)ред



рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ рдХрдиреЗрдХреНрд╢рди рдЦреЛрд▓рддреЗ рд╕рдордп, WebSocketConnection рдХреНрд▓рд╛рд╕ рдХреА рдСрдирдСрди рд╡рд┐рдзрд┐ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЗрд╕рд╕реЗ рдЬреБрдбрд╝рд╛ ClientManager рдСрдмреНрдЬреЗрдХреНрдЯ рдЖрдИрдбреА (рд╣реИрдХреЛрдбрдХреЛрдб) рджреНрд╡рд╛рд░рд╛ рдЕрдкрдиреЗ рдХрдиреЗрдХреНрд╢рди рдореИрдк рдореЗрдВ рдЗрд╕ WebSocketConnection рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИред



  @Override protected void onOpen(WsOutbound outbound) { if(clientManager != null){ clientManager.addConnection(this); } }
      
      







(рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдХрдИ рд╡рд┐рдВрдбреЛ рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдЕрдкрдирд╛ рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдХрдиреЗрдХреНрд╢рди рдмрдирд╛рдПрдЧрд╛ред)



рдХрдиреЗрдХреНрд╢рди рдХреЛ рдЦреЛрд▓рдиреЗ рдХреЗ рдмрд╛рдж, рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд░реНрд╡рд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдкрд░ рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рднреЗрдЬ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдХрд┐ рд╡реЗрдмрд╕реЙрдлреНрдЯрдХреЙрдиреНрдиреЗрдХреНрд╢рди рд╡рд░реНрдЧ рдХреЗ рдУрд╡рд░рд░реЗрдЯреЗрдб рдСрдирдореЗрд╕реНрдЯреЗрдЬ рд╡рд┐рдзрд┐ рдореЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

  @Override protected void onTextMessage(CharBuffer message) throws IOException { try { String connectionId = String.valueOf(this.hashCode()); String request = message.toString(); clientManager.handleClientRequest(request, connectionId); } catch (Throwable th) { log.error("in onTextMessage: " + th); } }
      
      







рд╣реИрдВрдбрд▓ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреНрд▓рд╛рд╕ рдХреА рд╡рд┐рдзрд┐ - рдЕрдиреБрд░реЛрдз рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдгрд╛рдо рд▓рд┐рдЦрддрд╛ рд╣реИ:



 @Autowired private RequestHandler requestHandler; public void handleClientRequest(String request, String connectionId) { log.debug("handleClientRequest request=" + request); log.debug("handleClientRequest user=" + getUser()); /** handleRequest - never throws exceptions ! */ JSONObject response = requestHandler.handleRequest(request, this); String responseJson = response.toString(); CharBuffer buffer = CharBuffer.wrap(responseJson); WebSocketConnection connection = connections.get(connectionId); try { connection.getWsOutbound().writeTextMessage(buffer); } catch (IOException ioe) { log.error("in handleClientRequest: in writeTextMessage: " + ioe); } }
      
      







рдЕрдиреБрд░реЛрдзрд╣реИрдВрдбрд▓рд░ рдПрдХ рдСрдЯреЛ-рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдШрдЯрдХ рд╣реИ рдЬреЛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред

ApllicationContext рдХреЛ рдЗрд╕рдореЗрдВ рд╡реЗрд▓реНрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рдХреА рдорджрдж рд╕реЗ рдпрд╣ рд╕рд░реНрд╡рд┐рд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдвреВрдВрдврддрд╛ рд╣реИред



рдЗрд╕рдХрд╛ рд╣реИрдВрдбрд▓ рд░реАрд╕реЗрдВрдЯ рдореЗрдердб рдПрдХ рд╕рд░реНрд╡рд┐рд╕ рдХрдВрдкреЛрдиреЗрдВрдЯ рдХреЛ рдЦреЛрдЬрддрд╛ рд╣реИ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдЙрд╕ рдкрд░ рдЬрд░реВрд░рдд рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕ рддрд░рд╣ рдкрд┐рдЫрд▓реЗ рдЖрд░реНрдЯрд┐рдХрд▓ рд╕реЗ рдХреЙрдордирд╕реЗрд╡ рдХреЙрдиреНрд╕рдЯреНрд░реЙрд▓рд░ рдХреНрд▓рд╛рд╕ рд╕реЗ рдкреНрд░реЛрд╕реЗрд╕рдПрдЬреИрдХреНрд╕ рд░реАрдкреЗрд╕реНрдЯ рд╡рд┐рдзрд┐ред





рдпрд╣ рдмрд╛рддрдЪреАрдд рдХреА рд╕рд╛рдорд╛рдиреНрдп рдпреЛрдЬрдирд╛ рд╣реИред



рдЕрдм рдЬрдм рдЧреНрд░рд╛рд╣рдХ рдкреНрд░рдмрдВрдзрдХ рдПрдХ http рд╕рддреНрд░ рдХреЗ рд╕рд╛рде рдЖрд░рдВрднреАрдХреГрдд рд╣реЛрддрд╛ рд╣реИ, рдЙрд╕ рдкрд░ рдХрд░реАрдм рд╕реЗ рдирдЬрд╝рд░ рдбрд╛рд▓рддреЗ рд╣реИрдВред



рдПрдХ рд╕рддреНрд░ рдореЗрдВ рдЯрд╛рдЗрдордЖрдЙрдЯ рд╕реЗ рдЧрд┐рд░рдиреЗ рдХреА рд╕рдВрдкрддреНрддрд┐ рд╣реИ, рдЬреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ 30 рдорд┐рдирдЯ рд╣реИред

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



рдкрд╣рд▓рд╛ рдорд╛рдорд▓рд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╡рд┐рдзрд┐ рдореЗрдВ рд╕реАрдзреЗ рд╕рдВрднрд╛рд▓рд╛ рдЧрдпрд╛ рд╣реИ:



  public class ClientManager{ public void setSession(HttpSession session) { /** session will be invalidated at connection removing */ session.setMaxInactiveInterval(Integer.MAX_VALUE);//69.04204112011317 years this.session = session; new Thread(new Runnable() { @Override public void run() { /** Giving time to client, for establish websocket connection. */ try {Thread.sleep(60000);} catch (InterruptedException ignored) {} /** if client not connected via websocket until this time - it is bot */ if (connections.size() == 0) {removeMe();} } }).start(); } private void removeMe() {ClientManagersStorage.removeClientManager(this);} ... }
      
      







рдФрд░ WebSocketConnection рд╡рд░реНрдЧ рдХреЗ рдСрдирдХреНрд▓реЛ рд╡рд┐рдзрд┐ рдореЗрдВ рджреВрд╕рд░рд╛:



 public class WebSocketConnection{ @Override protected void onClose(int status) { if(clientManager != null){ clientManager.removeConnection(this); } } ... } public class ClientManager{ public void removeConnection(WebSocketConnection webSocketConnection) { String connectionId = getObjectHash(webSocketConnection); connections.remove(connectionId); if (connections.size() == 0) { log.debug("removeConnection before wait: connections.size()=" + connections.size()); /** may be client just reload page? */ try {Thread.sleep(waitForReloadTime);} catch (Throwable ignored) {} if (connections.size() == 0) { /** no, client leave us (page closed in browser)*/ ClientManagersStorage.removeClientManager(this); log.debug("client " + getId() + " disconnected"); } } } ... }
      
      







рд╕рддреНрд░ ClientManagersStorage рд╡рд░реНрдЧ рдХреЗ removeClientManager рд╡рд┐рдзрд┐ рдореЗрдВ рдЕрдХреНрд╖рдо рд╣реИ:



 public static void removeClientManager(ClientManager clientManager) { ClientManager removed = clientManagers.remove(clientManager.getId()); if(removed == null){return;} User user = removed.getUser(); if(user != null){ Broadcaster.broadcastCommand("userPanel.setLogedCount", UserService.logedCount.decrementAndGet()); } Broadcaster.broadcastCommand("userPanel.setOnlineCount", ClientManagersStorage.getClientManagersCount()); try { clientManager.getSession().invalidate(); clientManager.setSession(null); } catch (Throwable th) { log.error("at removeClientManager: " + th); } }
      
      





рдЙрд╕реА рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдкреЗрдЬ рд╡рд┐рдЬрд╝рд┐рдЯрд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрджрд▓ рдЧрдИ рд╣реИ (рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдЗрди рд╕реВрдЪрдирд╛рдУрдВ рдХрд╛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдиреАрдЪреЗ рд╡рд░реНрдгрд┐рдд рд╣реИ)ред



рд╕рд░реНрд╡рд░ рдкрд░ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдШрдЯрдирд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмреНрд░реЙрдбрдХрд╛рд╕реНрдЯрд░ рдХреНрд▓рд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рджреЛ рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реИрдВ: рдмреНрд░реЙрдбрдХрд╛рд╕реНрдЯрдорд╛рдВрдб рдФрд░ рд╕реЗрдВрдбрдХрдорд╛рдВрдбрдЯрд╛рдЙрдЬрд╝рд░:



 public class Broadcaster{ public static void broadcastCommand(String method, Object params) { for (ClientManager clientManager : ClientManagersStorage.getClientManagers().values()) { clientManager.sendCommandToClient(method, params); } } public static void sendCommandToUser(Long userId, String method, Object params) { List<ClientManager> userClientManagers = ClientManagersStorage.findUserClientManagers(userId); for(ClientManager clientManager: userClientManagers){ clientManager.sendCommandToClient(method, params); } } }
      
      







рдЧреНрд░рд╛рд╣рдХ рдкреНрд░рдмрдВрдзрдХ рд╡рд░реНрдЧ рдХрд╛ SendCommandToClient рд╡рд┐рдзрд┐ рдЗрд╕ рддрд░рд╣ рдХрд╛рдо рдХрд░рддреА рд╣реИ:



 public void sendCommandToClient(String method, Object params) { for(WebSocketConnection connection: connections.values()){ sendCommandToClientConnection(connection, method, params); } } private void sendCommandToClientConnection(WebSocketConnection connection, String method, Object params) { JSONObject commandBody = new JSONObject(); if(params == null){params = new JSONObject();} commandBody.put("method", method); commandBody.put("params", params); CharBuffer buffer = CharBuffer.wrap(commandBody.toString()); try { connection.getWsOutbound().writeTextMessage(buffer); } catch (IOException ioe) { log.error("in sendCommandToClient: in writeTextMessage: " + ioe); } }
      
      







рдЗрд╕ рдкрд░, рд╣рдо рд╕рд░реНрд╡рд░ рднрд╛рдЧ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдВрдЧреЗ, рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рднрд╛рдЧ рдкрд░ рдЖрдЧреЗ рдмрдврд╝реЗрдВрдЧреЗред



рдЧреНрд░рд╛рд╣рдХ рднрд╛рдЧ



рдЧреНрд░рд╛рд╣рдХ рднрд╛рдЧ рдХреЛ рддреАрди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:



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



рдкрд╣рд▓рд╛ рднрд╛рдЧ рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╣реИ:



рдЪреВрдБрдХрд┐ рд╣рдо Angular рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, $ http рдХрд╛ рдЙрдкрдпреЛрдЧ ajax рдЕрдиреБрд░реЛрдз рдХреЛ рдкреНрд░рд╛рд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ http рд╕рддреНрд░:



  var appName = "jrspc-ws"; var secured = document.location.protocol == "https:" ? "s" : ""; var HttpSessionInitializer = {url: "http"+secured+"://"+ document.location.host +"/"+appName+"/init"}; /** called from root-controller.js after its initialization */ HttpSessionInitializer.init = function($http) { $http.post(this.url, "").success(function(response){ if (response.error) { error(response.error); } else { loged = response.loged; Server.initialize("ws"+secured+"://"+ document.location.host +"/"+appName+"/ws?clientManagerId="+response.clientManagerId); if(loged){Listeners.notify("onLogin");} } }).error(function() {error("network error!");}); }
      
      







рд╕рд░реНрд╡рд░ рдкрд░, рдпрд╣ рдЕрдиреБрд░реЛрдз ClientManagerController рд╡рд░реНрдЧ рдХреЗ initializeClientManager рд╡рд┐рдзрд┐ рдореЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдХреЛрдб рдХреЛ рд╕рд░реНрд╡рд░ рднрд╛рдЧ рдХреЗ рд╡рд┐рд╡рд░рдг рдореЗрдВ рдКрдкрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред



рд╕реЙрдХреЗрдЯ рдХрдиреЗрдХреНрд╢рди рдХреЛ рдЖрд░рдВрдн рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ Server.initialize рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ:



  connector.initialize = function(url) { connector.url = url; try { connector.connect(url); return true; } catch (ex) { p("in connector.initialize: " + ex); return false; } }
      
      







рдХрдиреЗрдХреНрдЯрд░ - рдЖрдВрддрд░рд┐рдХ рд╕рд░реНрд╡рд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдЬреЛ рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ (рдЗрд╕рдХрд╛ рдкреВрд░рд╛ рдХреЛрдб ws-рдХрдиреЗрдХреНрдЯрд░ . js рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╣реИ)



Ws-рдХрдиреЗрдХреНрдЯрд░.js рд╕реЗ рдХреЛрдб, рдЬреЛ jrspc рдЕрдиреБрд░реЛрдз рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ:



  Server.socketRequests = {}; var requestId = 0; function sendSocket(service, method, params, successCallback, errorCallback, control) { if (!checkSocket()) {return;} requestId++; if(!params){params = [];} if(!isArray(params)){params = [params];} var data = { service : service, method : method, params : params, requestId : requestId }; Server.socketRequests["request_" + requestId] = { successCallback : successCallback, errorCallback : errorCallback, control : control }; if (control) {control.disabled = true;} var message = JSON.stringify(data); log("sendSocket: "+message); connector.socket.send(message); } ... Server.call = sendSocket;
      
      









Ws-рдХрдиреЗрдХреНрдЯрд░.js рд╕реЗ рдХреЛрдб, рдЬреЛ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдФрд░ рд╕рд░реНрд╡рд░ рдЖрджреЗрд╢реЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ:



  connector.socket.onmessage = function(message) { var data = message.data; var response = JSON.parse(data); var requestId = response.requestId; if (requestId) {/** server return response */ var control = Server.socketRequests["request_" + requestId].control; if (control) {control.disabled = false;} if (response.error) { var errorCallback = Server.socketRequests["request_" + requestId].errorCallback; if (errorCallback) { try { errorCallback(response.error); } catch (ex) { error("in connector.socket.onmessage errorCallback: " + ex + ", data=" + data); } }else{ error(response.error); } } else { var successCallback = Server.socketRequests["request_" + requestId].successCallback; if (successCallback) { try { successCallback(response.result); } catch (ex) { error("in connector.socket.onmessage successCallback: " + ex + ", data=" + data); } } } delete Server.socketRequests["request_" + requestId]; } else { /** server call client or broadcast */ var method = eval(response.method); var params = response.params; try { method(params); } catch (ex) { error("in connector.socket.onmessage call method: " + ex + ", data=" + data); } } };
      
      







рдЙрдкрд░реЛрдХреНрдд рдврд╛рдВрдЪреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЖрдк рд╕рднреА рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЪреИрдЯ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ - рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рджреЛ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ ( рдЪреИрдЯ-рдХрдВрдЯреНрд░реЛрд▓рд░.рдЬреЗрдПрд╕ ):



  self.sendMessage = function(command){ var message = {to: (self.sendPrivate ? self.privateTo : "all"), from: userPanel.user.login, text: self.newMessage, clientTime: new Date().getTime()}; Server.call("chatService", "dispatchMessage", message, function(){ self.newMessage = ""; self.$digest(); }, function(error){self.onError(error);}, command); } /** called from server */ self.onChatMessage = function (message){ message.isPrivate = (message.to != "all"); self.messages.push(message); self.$digest(); chatConsole.scrollTop = chatConsole.clientHeight + chatConsole.scrollHeight; }
      
      







рдФрд░ рдПрдХ рд╕рд░реНрд╡рд░ рд╡рд┐рдзрд┐:



  @Component public class ChatService extends AbstractService{ @Autowired private UserManager userManager; @Secured("User") @Remote public void dispatchMessage(ChatMessage message){ message.setServerTime(new Date().getTime()); String to = message.getTo(); if("ALL".equalsIgnoreCase(to)){ Broadcaster.broadcastCommand("chatPanel.onChatMessage", message); }else{ User fromUser = getUser(); message.setFrom(fromUser.getLogin()); User toUser = userManager.findByLogin(to); if(toUser == null){throw new RuntimeException("User "+to+" not found!");} Broadcaster.sendCommandToUser(toUser.getId(), "chatPanel.onChatMessage", message); Broadcaster.sendCommandToUser(fromUser.getId(), "chatPanel.onChatMessage", message); } } }
      
      





рдЧрддрд┐ рдкрд░реАрдХреНрд╖рдг, рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдФрд░ рд╕рдорд╛рдирд╛рдВрддрд░ рднреЗрдЬрдиреЗ рдХреЗ рд╕рд╛рде 1000 рдЕрдиреБрд░реЛрдз, рдЕрдЬрд╛рдХреНрд╕ рдФрд░ рд╡реЗрдмрд╕реНрдХреИрдЯ рдХреЗ рд▓рд┐рдП:



рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ: рдЕрдЬрд╛рдХреНрд╕ (3474, 3380, 3377) ws (1299, 1113, 1054)

рд╕рдорд╛рдирд╛рдВрддрд░: рдЕрдЬрд╛рдХреНрд╕ (1502, 1515, 1469) ws (616, 637, 632)



рдкрд░реАрдХреНрд╖рдг рдХреЛрдб




  function testController($scope){ var self = $scope; self.maxIterations = 1000; self.testIterations = self.maxIterations; self.testStart = 0; self.testEnd = 0; self.testForSpeedSerial = function(command){ if(self.testStart == 0){self.testStart = now();} if(--self.testIterations <= 0){ var duration = now() - self.testStart; alert("testForSpeedSerial duration="+duration); self.testStart = 0; self.testIterations = self.maxIterations; return; } Server.call("userService", "testForSpeed", "", function(){ self.testForSpeedSerial(command); }, error, command); } self.testForSpeedParallelResponses = 0; self.testForSpeedParallel = function(command){ self.testStart = now(); for(var i = 0; i < self.testIterations; i++){ Server.call("userService", "testForSpeed", "", function(){ self.testForSpeedParallelResponses++ ; if(self.testForSpeedParallelResponses >= self.maxIterations){ var duration = now() - self.testStart; alert("testForSpeedParallel duration="+duration); self.testForSpeedParallelResponses = 0; } }, error, command); } } }
      
      





рд╕рд░реНрд╡рд░ рд╡рд┐рдзрд┐ testForSpeed:



  @Remote public void testForSpeed(){}
      
      









рд╕рднреА рдЖрд▓реЛрдЪрдирд╛рдУрдВ рдФрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рдВрдХреЗрдд рдХреА рдмрд╣реБрдд рд╕рд░рд╛рд╣рдирд╛ рдХреА рдЬрд╛рдПрдЧреАред



All Articles