這是本文件的舊版!


Wicket - Websocket disconnection handling

造成websocket突然斷線的原因很多,像是網路不穩定或是閒置過久遭server或是browser中斷連線等,都有可能導致接下來的工作不正常。因此我們需要方法去處理連線中斷的情況。

我們Web框架使用Apache Wicket(6.22),而Server是Jetty(9.3.9)。

Handle On Server Side

我們最早版本是在Server Side根據user request做處理,假如user request對應的websocket連線已中斷,那我們就會透過AjaxRequestTarget送一個reload給client:

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()");
		}
	}
}

Handle On Client Side