差異處
這裏顯示兩個版本的差異處。
java:web:wicket:websocket_disconn_handling [2018/11/02 15:23] tony |
java:web:wicket:websocket_disconn_handling [2023/06/25 09:48] |
||
---|---|---|---|
行 1: | 行 1: | ||
- | {{tag>wicket websocket}} | ||
- | ====== Wicket - Websocket disconnection handling ====== | ||
- | ===== Problem ===== | ||
- | 造成websocket突然斷線的原因很多,像是網路不穩定或是閒置過久遭server或是browser中斷連線等,都有可能導致接下來的工作不正常。因此我們需要方法去處理連線中斷的情況。 | ||
- | ===== How to? ===== | ||
- | 我們Web框架使用Apache Wicket(6.22),而Server是Jetty(9.3.9)。 | ||
- | ==== Handle On Server Side ==== | ||
- | 我們最早版本是在Server Side根據user request做處理,假如user request對應的websocket連線已中斷,那我們就會透過AjaxRequestTarget送一個reload給client: | ||
- | <code java> | ||
- | public class WebSocketCheckListener extends AbstractRequestCycleListener { | ||
- | |||
- | @Override | ||
- | public void onRequestHandlerScheduled(RequestCycle cycle, IRequestHandler handler) { | ||
- | if (!(handler instanceof AjaxRequestTarget)) | ||
- | return; | ||
- | AjaxRequestTarget target = (AjaxRequestTarget) handler; | ||
- | Page page = target.getPage(); | ||
- | |||
- | Application application = Application.get(); | ||
- | |||
- | IWebSocketSettings webSocketSettings = IWebSocketSettings.Holder.get(application); | ||
- | IWebSocketConnectionRegistry webSocketConnectionRegistry = webSocketSettings.getConnectionRegistry(); | ||
- | |||
- | IKey key = new PageIdKey(page.getPageId()); | ||
- | IWebSocketConnection conn = webSocketConnectionRegistry.getConnection(application, page.getSession().getId(), key); | ||
- | |||
- | if (conn == null || !conn.isOpen()) { | ||
- | target.appendJavaScript("location.reload()"); | ||
- | } | ||
- | } | ||
- | } | ||
- | </code> | ||
- | |||
- | ==== Handle On Client Side ==== |