Index: lams_common/src/java/org/lamsfoundation/lams/events/EventNotificationService.java =================================================================== RCS file: /usr/local/cvsroot/lams_common/src/java/org/lamsfoundation/lams/events/EventNotificationService.java,v diff -u -r1.7.2.13 -r1.7.2.14 --- lams_common/src/java/org/lamsfoundation/lams/events/EventNotificationService.java 8 Jan 2017 15:48:01 -0000 1.7.2.13 +++ lams_common/src/java/org/lamsfoundation/lams/events/EventNotificationService.java 30 Jan 2017 04:13:23 -0000 1.7.2.14 @@ -219,22 +219,25 @@ } // create a new thread to send the messages as it can take some time new Thread(() -> { - HibernateSessionManager.openSession(); + try { + HibernateSessionManager.openSession(); - Event event = null; - for (Integer id : toUserIds) { - String result = deliveryMethod.send(fromUserId, id, subject, message, isHtmlFormat); - if (result != null) { - event = new Event(IEventNotificationService.SINGLE_MESSAGE_SCOPE, - String.valueOf(System.currentTimeMillis()), null, subject, message, isHtmlFormat); - subscribe(event, id, deliveryMethod); + Event event = null; + for (Integer id : toUserIds) { + String result = deliveryMethod.send(fromUserId, id, subject, message, isHtmlFormat); + if (result != null) { + event = new Event(IEventNotificationService.SINGLE_MESSAGE_SCOPE, + String.valueOf(System.currentTimeMillis()), null, subject, message, isHtmlFormat); + subscribe(event, id, deliveryMethod); + } } + if (event != null) { + event.setFailTime(new Date()); + eventDAO.insertOrUpdate(event); + } + } finally { + HibernateSessionManager.closeSession(); } - if (event != null) { - event.setFailTime(new Date()); - eventDAO.insertOrUpdate(event); - } - HibernateSessionManager.closeSession(); }).start(); } @@ -328,42 +331,44 @@ // create a new thread to send the messages as it can take some time new Thread(() -> { - HibernateSessionManager.openSession(); + try { + HibernateSessionManager.openSession(); - Event eventFailCopy = null; - Iterator subscriptionIterator = event.getSubscriptions().iterator(); - while (subscriptionIterator.hasNext()) { - Subscription subscription = subscriptionIterator.next(); - notifyUser(subscription, subjectToSend, messageToSend, event.isHtmlFormat()); - if (subscription.getDeliveryMethod().lastOperationFailed(subscription)) { - if (event.getFailTime() != null) { - subscriptionIterator.remove(); + Event eventFailCopy = null; + Iterator subscriptionIterator = event.getSubscriptions().iterator(); + while (subscriptionIterator.hasNext()) { + Subscription subscription = subscriptionIterator.next(); + notifyUser(subscription, subjectToSend, messageToSend, event.isHtmlFormat()); + if (subscription.getDeliveryMethod().lastOperationFailed(subscription)) { + if (event.getFailTime() != null) { + subscriptionIterator.remove(); + } + } else if (event.getFailTime() == null) { + if (eventFailCopy == null) { + eventFailCopy = (Event) event.clone(); + } + subscribe(eventFailCopy, subscription.getUserId(), subscription.getDeliveryMethod()); } - } else if (event.getFailTime() == null) { - if (eventFailCopy == null) { - eventFailCopy = (Event) event.clone(); - } - subscribe(eventFailCopy, subscription.getUserId(), subscription.getDeliveryMethod()); } - } - if (event.getSubscriptions().isEmpty()) { - eventDAO.delete(event); - } else { - eventDAO.insertOrUpdate(event); - } + if (event.getSubscriptions().isEmpty()) { + eventDAO.delete(event); + } else { + eventDAO.insertOrUpdate(event); + } - /* - * if any of the notifications failed, - * a copy of the event is created in order to repeat the attempt later - */ - if (eventFailCopy != null) { - eventFailCopy.setFailTime(new Date()); - eventFailCopy.setSubject(subjectToSend); - eventFailCopy.setMessage(messageToSend); - eventDAO.insertOrUpdate(eventFailCopy); + /* + * if any of the notifications failed, + * a copy of the event is created in order to repeat the attempt later + */ + if (eventFailCopy != null) { + eventFailCopy.setFailTime(new Date()); + eventFailCopy.setSubject(subjectToSend); + eventFailCopy.setMessage(messageToSend); + eventDAO.insertOrUpdate(eventFailCopy); + } + } finally { + HibernateSessionManager.closeSession(); } - - HibernateSessionManager.closeSession(); }).start(); } 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.4 -r1.1.2.5 --- lams_learning/src/java/org/lamsfoundation/lams/learning/command/CommandWebsocketServer.java 8 Jan 2017 16:42:59 -0000 1.1.2.4 +++ lams_learning/src/java/org/lamsfoundation/lams/learning/command/CommandWebsocketServer.java 30 Jan 2017 04:13:20 -0000 1.1.2.5 @@ -46,9 +46,9 @@ @Override public void run() { - // websocket communication bypasses standard HTTP filters, so Hibernate session needs to be initialised manually - HibernateSessionManager.openSession(); while (!stopFlag) { + // websocket communication bypasses standard HTTP filters, so Hibernate session needs to be initialised manually + HibernateSessionManager.openSession(); try { // synchronize websockets as a new Learner entering Learner interface could modify this collection Iterator>> entryIterator = null; @@ -83,15 +83,19 @@ } while (entry != null); Thread.sleep(SendWorker.CHECK_INTERVAL); - } catch (InterruptedException e) { - CommandWebsocketServer.log.warn("Stopping Command Websocket Server worker thread"); - stopFlag = true; } catch (Exception e) { // error caught, but carry on CommandWebsocketServer.log.error("Error in Command Websocket Server worker thread", e); + } finally { + HibernateSessionManager.closeSession(); + try { + Thread.sleep(SendWorker.CHECK_INTERVAL); + } catch (InterruptedException e) { + log.warn("Stopping Command Websocket worker thread"); + stopFlag = true; + } } } - 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.8 -r1.1.2.9 --- lams_learning/src/java/org/lamsfoundation/lams/learning/presence/PresenceWebsocketServer.java 17 Jan 2017 13:19:37 -0000 1.1.2.8 +++ lams_learning/src/java/org/lamsfoundation/lams/learning/presence/PresenceWebsocketServer.java 30 Jan 2017 04:13:20 -0000 1.1.2.9 @@ -248,10 +248,13 @@ } 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(); + try { + // websocket communication bypasses standard HTTP filters, so Hibernate session needs to be initialised manually + HibernateSessionManager.openSession(); + PresenceWebsocketServer.sendWorker.send(lessonId, websocket.nickName); + } finally { + HibernateSessionManager.closeSession(); + } }).start(); if (PresenceWebsocketServer.log.isDebugEnabled()) { @@ -330,10 +333,13 @@ final String finalTo = to; new Thread(() -> { - HibernateSessionManager.openSession(); - PresenceWebsocketServer.getPresenceChatService().createPresenceChatMessage(lessonId, from, finalTo, - new Date(), message); - HibernateSessionManager.closeSession(); + try { + HibernateSessionManager.openSession(); + PresenceWebsocketServer.getPresenceChatService().createPresenceChatMessage(lessonId, from, finalTo, + new Date(), message); + } finally { + HibernateSessionManager.closeSession(); + } }).start(); } @@ -348,12 +354,12 @@ // 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(); - try { + 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); @@ -365,8 +371,9 @@ session.getBasicRemote().sendText(responseJSON.toString()); } catch (Exception e) { log.error("Error while seding conversation", e); + } finally { + HibernateSessionManager.closeSession(); } - HibernateSessionManager.closeSession(); }).start(); } Index: lams_learning/src/java/org/lamsfoundation/lams/learning/service/LearnerService.java =================================================================== RCS file: /usr/local/cvsroot/lams_learning/src/java/org/lamsfoundation/lams/learning/service/LearnerService.java,v diff -u -r1.112.2.18 -r1.112.2.19 --- lams_learning/src/java/org/lamsfoundation/lams/learning/service/LearnerService.java 11 Jan 2017 09:00:06 -0000 1.112.2.18 +++ lams_learning/src/java/org/lamsfoundation/lams/learning/service/LearnerService.java 30 Jan 2017 04:13:20 -0000 1.112.2.19 @@ -609,6 +609,10 @@ */ @Override public synchronized void completeActivity(Integer learnerId, Activity activity, LearnerProgress progress) { + if (LearnerService.log.isDebugEnabled()) { + LearnerService.log + .debug("Completing activity ID " + activity.getActivityId() + " for learner " + learnerId); + } // load the progress again from DB // progress = learnerProgressDAO.getLearnerProgress(progress.getLearnerProgressId()); if (progress.getCompletedActivities().keySet().contains(activity)) { @@ -1419,35 +1423,37 @@ } return true; } - + /* Added for RepopulateProgressMarksServlet - can be removed later */ private static final String TOOL_SIGNATURE_ASSESSMENT = "laasse10"; private static final String TOOL_SIGNATURE_SCRATCHIE = "lascrt11"; private static final String TOOL_SIGNATURE_MCQ = "lamc11"; - public String[] recalcProgressForLearner(Lesson lesson, ArrayList activityList, LearnerProgress learnerProgress, boolean updateGradebookForAll) { - + public String[] recalcProgressForLearner(Lesson lesson, ArrayList activityList, + LearnerProgress learnerProgress, boolean updateGradebookForAll) { + StringBuilder auditLogBuilder = new StringBuilder(""); StringBuilder errorBuilder = new StringBuilder(""); User learner = learnerProgress.getUser(); - Date lessonStartDate = learnerProgress.getStartDate(); - auditLogBuilder.append("\n\nUpdating ").append(learner.getLogin()).append(" ") - .append(learner.getFullName()).append("\n"); - - boolean updated = false; - for (Activity activity : activityList) { - - CompletedActivityProgress completedProgress = learnerProgress.getCompletedActivities().get(activity); - if (completedProgress == null || completedProgress.getStartDate() == null || completedProgress.getFinishDate() == null) { - updated = updateProgress(lesson.getLessonId(), auditLogBuilder, errorBuilder, learnerProgress, - learner, lessonStartDate, activity) || updated; - } + Date lessonStartDate = learnerProgress.getStartDate(); + auditLogBuilder.append("\n\nUpdating ").append(learner.getLogin()).append(" ").append(learner.getFullName()) + .append("\n"); + boolean updated = false; + for (Activity activity : activityList) { + + CompletedActivityProgress completedProgress = learnerProgress.getCompletedActivities().get(activity); + if (completedProgress == null || completedProgress.getStartDate() == null + || completedProgress.getFinishDate() == null) { + updated = updateProgress(lesson.getLessonId(), auditLogBuilder, errorBuilder, learnerProgress, learner, + lessonStartDate, activity) || updated; + } + // is completed (previously or just now?), in which case update gradebook. if (activity.isToolActivity()) { - CompletedActivityProgress updatedCompletedProgress = learnerProgress.getCompletedActivities().get( - activity); + CompletedActivityProgress updatedCompletedProgress = learnerProgress.getCompletedActivities() + .get(activity); if (updatedCompletedProgress != null) { ToolActivity toolActivity = (ToolActivity) activity; Tool tool = toolActivity.getTool(); @@ -1461,19 +1467,20 @@ } } - } + } - if ( updated ) - learnerProgressDAO.updateLearnerProgress(learnerProgress); + if (updated) + learnerProgressDAO.updateLearnerProgress(learnerProgress); return new String[] { auditLogBuilder.toString(), errorBuilder.toString() }; } - private boolean updateProgress(Long lessonId, StringBuilder auditLogBuilder, StringBuilder errorBuilder, + private boolean updateProgress(Long lessonId, StringBuilder auditLogBuilder, StringBuilder errorBuilder, LearnerProgress learnerProgress, User learner, Date lessonStartDate, Activity activity) { boolean updated = false; - ToolCompletionStatus results = recalcActivityProgress(activity, learner, lessonId, learnerProgress, auditLogBuilder, errorBuilder); + ToolCompletionStatus results = recalcActivityProgress(activity, learner, lessonId, learnerProgress, + auditLogBuilder, errorBuilder); // results == null ignore - won't harm anything if it is in attempted and nothing in the tool and // do not remove from completed in case it was force completed, or the tool doesn't support this @@ -1499,7 +1506,7 @@ startedDateFromAttempted != null ? startedDateFromAttempted : results.getStartDate(), results.getFinishDate()); } - if ( cap.getStartDate() == null ) { + if (cap.getStartDate() == null) { // must have something or it is not seen as completed cap.setStartDate(lessonStartDate); } @@ -1525,65 +1532,66 @@ } } - + return updated; } - private ToolCompletionStatus recalcActivityProgress(Activity activity, User learner, Long lessonId, LearnerProgress learnerProgress, StringBuilder auditLogEntry, StringBuilder errorBuilder) { + private ToolCompletionStatus recalcActivityProgress(Activity activity, User learner, Long lessonId, + LearnerProgress learnerProgress, StringBuilder auditLogEntry, StringBuilder errorBuilder) { ToolCompletionStatus status = null; - + if (activity.isToolActivity()) { ToolSession toolSession = lamsCoreToolService.getToolSessionByLearner(learner, activity); if (toolSession != null) { - status = lamsCoreToolService.getCompletionStatusFromTool(learner, activity); - if ( status.getStartDate() == null ) + status = lamsCoreToolService.getCompletionStatusFromTool(learner, activity); + if (status.getStartDate() == null) status.setStartDate(toolSession.getCreateDateTime()); } - } else if ( activity.isComplexActivity() ) { - ComplexActivity complexActivity = (ComplexActivity) activity; - boolean attempted = false; - boolean allComplete = true; - Date caStartDate = null; - Date caEndDate = null; - for (Iterator i = complexActivity.getActivities().iterator(); i.hasNext();) { - Activity childActivity = (Activity) i.next(); - Date childStartDate = learnerProgress.getAttemptedActivities().get(childActivity); - Date childEndDate = null; - if ( childStartDate != null ) { - attempted = true; - } - CompletedActivityProgress childCap = learnerProgress.getCompletedActivities().get(childActivity); - if ( childCap == null ) { - allComplete = false; - } else { - attempted = true; - if ( childStartDate == null ) - childStartDate = childCap.getStartDate(); - childEndDate = childCap.getFinishDate(); - } - if ( caStartDate == null || (childStartDate != null && childStartDate.before(caStartDate)) ) - caStartDate = childStartDate; - if ( caEndDate == null || (childEndDate != null && childEndDate.after(caStartDate)) ) - caEndDate = childEndDate; + } else if (activity.isComplexActivity()) { + ComplexActivity complexActivity = (ComplexActivity) activity; + boolean attempted = false; + boolean allComplete = true; + Date caStartDate = null; + Date caEndDate = null; + for (Iterator i = complexActivity.getActivities().iterator(); i.hasNext();) { + Activity childActivity = (Activity) i.next(); + Date childStartDate = learnerProgress.getAttemptedActivities().get(childActivity); + Date childEndDate = null; + if (childStartDate != null) { + attempted = true; } - - if ( attempted ) { - if ( allComplete ) - status = new ToolCompletionStatus(ToolCompletionStatus.ACTIVITY_COMPLETED, caStartDate, caEndDate); - else - status = new ToolCompletionStatus(ToolCompletionStatus.ACTIVITY_ATTEMPTED, caStartDate, null); + CompletedActivityProgress childCap = learnerProgress.getCompletedActivities().get(childActivity); + if (childCap == null) { + allComplete = false; + } else { + attempted = true; + if (childStartDate == null) + childStartDate = childCap.getStartDate(); + childEndDate = childCap.getFinishDate(); } - - } else if ( activity.isGateActivity() ){ + if (caStartDate == null || (childStartDate != null && childStartDate.before(caStartDate))) + caStartDate = childStartDate; + if (caEndDate == null || (childEndDate != null && childEndDate.after(caStartDate))) + caEndDate = childEndDate; + } + + if (attempted) { + if (allComplete) + status = new ToolCompletionStatus(ToolCompletionStatus.ACTIVITY_COMPLETED, caStartDate, caEndDate); + else + status = new ToolCompletionStatus(ToolCompletionStatus.ACTIVITY_ATTEMPTED, caStartDate, null); + } + + } else if (activity.isGateActivity()) { // do nothing ; - } else if ( activity.isGroupingActivity() ) { + } else if (activity.isGroupingActivity()) { GroupingActivity groupingActivity = (GroupingActivity) activity; Grouping grouping = groupingActivity.getCreateGrouping(); - if ( grouping.doesLearnerExist(learner) ) { - status = new ToolCompletionStatus(ToolCompletionStatus.ACTIVITY_COMPLETED, null, null); + if (grouping.doesLearnerExist(learner)) { + status = new ToolCompletionStatus(ToolCompletionStatus.ACTIVITY_COMPLETED, null, null); } } else { errorBuilder.append("Unable to update status for unexpected activity ").append(activity.getActivityId()) @@ -1598,5 +1606,4 @@ return activityDAO; } - } \ No newline at end of file Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/quartz/job/EmailScheduleMessageJob.java =================================================================== RCS file: /usr/local/cvsroot/lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/quartz/job/EmailScheduleMessageJob.java,v diff -u -r1.4.2.3 -r1.4.2.4 --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/quartz/job/EmailScheduleMessageJob.java 10 Jan 2017 05:15:34 -0000 1.4.2.3 +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/quartz/job/EmailScheduleMessageJob.java 30 Jan 2017 04:13:24 -0000 1.4.2.4 @@ -49,6 +49,7 @@ // --------------------------------------------------------------------- private static Logger log = Logger.getLogger(EmailScheduleMessageJob.class); + @SuppressWarnings("rawtypes") @Override protected void executeInternal(JobExecutionContext context) throws JobExecutionException { IMonitoringService monitoringService = getMonitoringService(context); @@ -64,20 +65,22 @@ Long activityId = (Long) properties.get(AttributeNames.PARAM_ACTIVITY_ID); Integer xDaystoFinish = (Integer) properties.get("daysToDeadline"); String[] lessonIds = (String[]) properties.get("lessonIDs"); - - HibernateSessionManager.openSession(); - Collection users = getMonitoringService(context).getUsersByEmailNotificationSearchType(searchType, - lessonId, lessonIds, activityId, xDaystoFinish, orgId); - for (User user : users) { - boolean isHtmlFormat = false; - int userId = user.getUserId(); - log.debug("Sending scheduled email to user [" + userId + "]."); - eventNotificationService.sendMessage(null, - userId, IEventNotificationService.DELIVERY_METHOD_MAIL, monitoringService.getMessageService() - .getMessage("event.emailnotifications.email.subject", new Object[] {}), - emailBody, isHtmlFormat); + try { + HibernateSessionManager.openSession(); + Collection users = getMonitoringService(context).getUsersByEmailNotificationSearchType(searchType, + lessonId, lessonIds, activityId, xDaystoFinish, orgId); + for (User user : users) { + boolean isHtmlFormat = false; + int userId = user.getUserId(); + log.debug("Sending scheduled email to user [" + userId + "]."); + eventNotificationService.sendMessage(null, userId, + IEventNotificationService.DELIVERY_METHOD_MAIL, monitoringService.getMessageService() + .getMessage("event.emailnotifications.email.subject", new Object[] {}), + emailBody, isHtmlFormat); + } + } finally { + HibernateSessionManager.closeSession(); } - HibernateSessionManager.closeSession(); } private IEventNotificationService getEventNotificationService(JobExecutionContext context) Index: lams_tool_chat/src/java/org/lamsfoundation/lams/tool/chat/web/actions/LearningWebsocketServer.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_chat/src/java/org/lamsfoundation/lams/tool/chat/web/actions/Attic/LearningWebsocketServer.java,v diff -u -r1.1.2.7 -r1.1.2.8 --- lams_tool_chat/src/java/org/lamsfoundation/lams/tool/chat/web/actions/LearningWebsocketServer.java 8 Jan 2017 15:48:27 -0000 1.1.2.7 +++ lams_tool_chat/src/java/org/lamsfoundation/lams/tool/chat/web/actions/LearningWebsocketServer.java 30 Jan 2017 04:13:19 -0000 1.1.2.8 @@ -75,10 +75,9 @@ @Override public void run() { while (!stopFlag) { - // websocket communication bypasses standard HTTP filters, so Hibernate session needs to be initialised manually - HibernateSessionManager.openSession(); - try { + // websocket communication bypasses standard HTTP filters, so Hibernate session needs to be initialised manually + HibernateSessionManager.openSession(); // synchronize websockets as a new Learner entering Chat could modify this collection synchronized (LearningWebsocketServer.websockets) { Iterator>> entryIterator = LearningWebsocketServer.websockets @@ -253,20 +252,23 @@ String userName = session.getUserPrincipal().getName(); new Thread(() -> { - // websocket communication bypasses standard HTTP filters, so Hibernate session needs to be initialised manually - HibernateSessionManager.openSession(); - ChatUser chatUser = LearningWebsocketServer.getChatService().getUserByLoginNameAndSessionId(userName, - toolSessionId); - Websocket websocket = new Websocket(session, chatUser.getNickname()); - finalSessionWebsockets.add(websocket); + try { + // websocket communication bypasses standard HTTP filters, so Hibernate session needs to be initialised manually + HibernateSessionManager.openSession(); + ChatUser chatUser = LearningWebsocketServer.getChatService().getUserByLoginNameAndSessionId(userName, + toolSessionId); + Websocket websocket = new Websocket(session, chatUser.getNickname()); + finalSessionWebsockets.add(websocket); - // update the chat window immediatelly - LearningWebsocketServer.sendWorker.send(toolSessionId); - HibernateSessionManager.closeSession(); + // update the chat window immediatelly + LearningWebsocketServer.sendWorker.send(toolSessionId); - if (LearningWebsocketServer.log.isDebugEnabled()) { - LearningWebsocketServer.log - .debug("User " + userName + " entered Chat with toolSessionId: " + toolSessionId); + if (LearningWebsocketServer.log.isDebugEnabled()) { + LearningWebsocketServer.log + .debug("User " + userName + " entered Chat with toolSessionId: " + toolSessionId); + } + } finally { + HibernateSessionManager.closeSession(); } }).start(); } @@ -347,10 +349,10 @@ chatMessage.setSendDate(new Date()); chatMessage.setHidden(Boolean.FALSE); LearningWebsocketServer.getChatService().saveOrUpdateChatMessage(chatMessage); - - HibernateSessionManager.closeSession(); } catch (Exception e) { log.error("Error in thread", e); + } finally { + HibernateSessionManager.closeSession(); } }).start(); } Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/action/LearningWebsocketServer.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/action/Attic/LearningWebsocketServer.java,v diff -u -r1.1.2.7 -r1.1.2.8 --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/action/LearningWebsocketServer.java 8 Jan 2017 15:48:26 -0000 1.1.2.7 +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/action/LearningWebsocketServer.java 30 Jan 2017 04:13:17 -0000 1.1.2.8 @@ -48,9 +48,9 @@ public void run() { while (!stopFlag) { - // websocket communication bypasses standard HTTP filters, so Hibernate session needs to be initialised manually - HibernateSessionManager.openSession(); try { + // websocket communication bypasses standard HTTP filters, so Hibernate session needs to be initialised manually + HibernateSessionManager.openSession(); // synchronize websockets as a new Learner entering the activity could modify this collection synchronized (LearningWebsocketServer.websockets) { Iterator>> entryIterator = LearningWebsocketServer.websockets Index: lams_tool_scribe/src/java/org/lamsfoundation/lams/tool/scribe/web/actions/LearningWebsocketServer.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_scribe/src/java/org/lamsfoundation/lams/tool/scribe/web/actions/Attic/LearningWebsocketServer.java,v diff -u -r1.1.2.5 -r1.1.2.6 --- lams_tool_scribe/src/java/org/lamsfoundation/lams/tool/scribe/web/actions/LearningWebsocketServer.java 8 Jan 2017 15:48:02 -0000 1.1.2.5 +++ lams_tool_scribe/src/java/org/lamsfoundation/lams/tool/scribe/web/actions/LearningWebsocketServer.java 30 Jan 2017 04:13:21 -0000 1.1.2.6 @@ -59,9 +59,9 @@ @Override public void run() { while (!stopFlag) { - // websocket communication bypasses standard HTTP filters, so Hibernate session needs to be initialised manually - HibernateSessionManager.openSession(); try { + // websocket communication bypasses standard HTTP filters, so Hibernate session needs to be initialised manually + HibernateSessionManager.openSession(); // synchronize websockets as a new Learner entering the activity could modify this collection synchronized (LearningWebsocketServer.websockets) { Iterator>> entryIterator = LearningWebsocketServer.websockets @@ -224,13 +224,14 @@ } new Thread(() -> { - HibernateSessionManager.openSession(); try { + HibernateSessionManager.openSession(); LearningWebsocketServer.sendWorker.send(toolSessionId, websocket); } catch (Exception e) { log.error("Error while sending messages", e); + } finally { + HibernateSessionManager.closeSession(); } - HibernateSessionManager.closeSession(); }).start(); }