Index: lams_learning/src/java/org/lamsfoundation/lams/learning/command/CommandWebsocketServer.java =================================================================== RCS file: /usr/local/cvsroot/lams_learning/src/java/org/lamsfoundation/lams/learning/command/Attic/CommandWebsocketServer.java,v diff -u -r1.1.2.3 -r1.1.2.4 --- lams_learning/src/java/org/lamsfoundation/lams/learning/command/CommandWebsocketServer.java 28 Dec 2016 10:33:40 -0000 1.1.2.3 +++ lams_learning/src/java/org/lamsfoundation/lams/learning/command/CommandWebsocketServer.java 8 Jan 2017 16:42:59 -0000 1.1.2.4 @@ -46,12 +46,10 @@ @Override public void run() { + // websocket communication bypasses standard HTTP filters, so Hibernate session needs to be initialised manually + HibernateSessionManager.openSession(); while (!stopFlag) { try { - // websocket communication bypasses standard HTTP filters, so Hibernate session needs to be initialised manually - // A new session needs to be created on each thread run as the session keeps stale Hibernate data (single transaction). - HibernateSessionManager.bindHibernateSessionToCurrentThread(true); - // synchronize websockets as a new Learner entering Learner interface could modify this collection Iterator>> entryIterator = null; synchronized (CommandWebsocketServer.websockets) { @@ -93,6 +91,7 @@ CommandWebsocketServer.log.error("Error in Command Websocket Server worker thread", e); } } + HibernateSessionManager.closeSession(); } /** Index: lams_learning/src/java/org/lamsfoundation/lams/learning/presence/PresenceWebsocketServer.java =================================================================== RCS file: /usr/local/cvsroot/lams_learning/src/java/org/lamsfoundation/lams/learning/presence/Attic/PresenceWebsocketServer.java,v diff -u -r1.1.2.6 -r1.1.2.7 --- lams_learning/src/java/org/lamsfoundation/lams/learning/presence/PresenceWebsocketServer.java 15 Dec 2016 11:30:59 -0000 1.1.2.6 +++ lams_learning/src/java/org/lamsfoundation/lams/learning/presence/PresenceWebsocketServer.java 8 Jan 2017 16:42:59 -0000 1.1.2.7 @@ -68,12 +68,10 @@ @Override public void run() { + // websocket communication bypasses standard HTTP filters, so Hibernate session needs to be initialised manually + HibernateSessionManager.openSession(); while (!stopFlag) { try { - // websocket communication bypasses standard HTTP filters, so Hibernate session needs to be initialised manually - // A new session needs to be created on each thread run as the session keeps stale Hibernate data (single transaction). - HibernateSessionManager.bindHibernateSessionToCurrentThread(true); - // synchronize websockets as a new Learner entering chat could modify this collection synchronized (PresenceWebsocketServer.websockets) { Iterator>> entryIterator = PresenceWebsocketServer.websockets @@ -97,7 +95,6 @@ } } } - Thread.sleep(SendWorker.CHECK_INTERVAL); } catch (InterruptedException e) { PresenceWebsocketServer.log.warn("Stopping Presence Chat worker thread"); @@ -107,6 +104,7 @@ PresenceWebsocketServer.log.error("Error in Presence Chat worker thread", e); } } + HibernateSessionManager.closeSession(); } /** @@ -246,10 +244,12 @@ PresenceWebsocketServer.rosters.put(lessonId, roster); } - // websocket communication bypasses standard HTTP filters, so Hibernate session needs to be initialised manually - HibernateSessionManager.bindHibernateSessionToCurrentThread(false); - // update the chat window immediatelly - PresenceWebsocketServer.sendWorker.send(lessonId, websocket.nickName); + new Thread(() -> { + // websocket communication bypasses standard HTTP filters, so Hibernate session needs to be initialised manually + HibernateSessionManager.openSession(); + PresenceWebsocketServer.sendWorker.send(lessonId, websocket.nickName); + HibernateSessionManager.closeSession(); + }).start(); if (PresenceWebsocketServer.log.isDebugEnabled()) { PresenceWebsocketServer.log @@ -318,16 +318,20 @@ Long lessonId = requestJSON.getLong("lessonID"); // websocket communication bypasses standard HTTP filters, so Hibernate session needs to be initialised manually - HibernateSessionManager.bindHibernateSessionToCurrentThread(false); String from = session.getRequestParameterMap().get("nickname").get(0); String to = requestJSON.getString("to"); if (StringUtils.isBlank(to)) { to = null; } - PresenceWebsocketServer.getPresenceChatService().createPresenceChatMessage(lessonId, from, to, new Date(), - message); + final String finalTo = to; + new Thread(() -> { + HibernateSessionManager.openSession(); + PresenceWebsocketServer.getPresenceChatService().createPresenceChatMessage(lessonId, from, finalTo, + new Date(), message); + HibernateSessionManager.closeSession(); + }).start(); } /** @@ -336,25 +340,31 @@ private static void sendConversation(JSONObject requestJSON, Session session) throws JSONException, IOException { Long lessonId = requestJSON.getLong("lessonID"); - // websocket communication bypasses standard HTTP filters, so Hibernate session needs to be initialised manually - HibernateSessionManager.bindHibernateSessionToCurrentThread(false); - String to = requestJSON.getString("to"); String from = session.getRequestParameterMap().get("nickname").get(0); - List messages = PresenceWebsocketServer.getPresenceChatService() - .getMessagesByConversation(lessonId, from, to); - JSONArray messagesJSON = new JSONArray(); + // websocket communication bypasses standard HTTP filters, so Hibernate session needs to be initialised manually + new Thread(() -> { + HibernateSessionManager.openSession(); + List messages = PresenceWebsocketServer.getPresenceChatService() + .getMessagesByConversation(lessonId, from, to); + JSONArray messagesJSON = new JSONArray(); - for (PresenceChatMessage message : messages) { - JSONObject messageJSON = PresenceWebsocketServer.buildMessageJSON(message); - messagesJSON.put(messageJSON); - } + try { + for (PresenceChatMessage message : messages) { + JSONObject messageJSON = PresenceWebsocketServer.buildMessageJSON(message); + messagesJSON.put(messageJSON); + } - JSONObject responseJSON = new JSONObject(); - responseJSON.put("messages", messagesJSON); - // send the payload to the Learner's browser - session.getBasicRemote().sendText(responseJSON.toString()); + JSONObject responseJSON = new JSONObject(); + responseJSON.put("messages", messagesJSON); + // send the payload to the Learner's browser + session.getBasicRemote().sendText(responseJSON.toString()); + } catch (Exception e) { + log.error("Error while seding conversation", e); + } + HibernateSessionManager.closeSession(); + }).start(); } /**