Author: solomax
Date: Tue Nov 22 18:02:19 2016
New Revision: 1770865

URL: http://svn.apache.org/viewvc?rev=1770865&view=rev
Log:
[OPENMEETINGS-1488] recording reminder/clean-up is improved

Added:
    
openmeetings/application/branches/3.1.x/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/AbstractJob.java
    
openmeetings/application/branches/3.2.x/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/AbstractJob.java
    
openmeetings/application/trunk/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/AbstractJob.java
Modified:
    
openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/record/RecordingDao.java
    
openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/record/Recording.java
    
openmeetings/application/branches/3.1.x/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/CleanupJob.java
    
openmeetings/application/branches/3.1.x/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/ReminderJob.java
    
openmeetings/application/branches/3.1.x/openmeetings-web/src/main/webapp/WEB-INF/classes/openmeetings-applicationContext.xml
    
openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/record/RecordingDao.java
    
openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/record/Recording.java
    
openmeetings/application/branches/3.2.x/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/CleanupJob.java
    
openmeetings/application/branches/3.2.x/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/ReminderJob.java
    
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/WEB-INF/classes/openmeetings-applicationContext.xml
    
openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/record/RecordingDao.java
    
openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/record/Recording.java
    
openmeetings/application/trunk/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/CleanupJob.java
    
openmeetings/application/trunk/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/ReminderJob.java
    
openmeetings/application/trunk/openmeetings-web/src/main/webapp/WEB-INF/classes/openmeetings-applicationContext.xml

Modified: 
openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/record/RecordingDao.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/record/RecordingDao.java?rev=1770865&r1=1770864&r2=1770865&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/record/RecordingDao.java
 (original)
+++ 
openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/record/RecordingDao.java
 Tue Nov 22 18:02:19 2016
@@ -176,11 +176,12 @@ public class RecordingDao {
                return null;
        }
 
-       public List<Recording> getExpiring(Long groupId, int reminderDays) {
+       public List<Recording> getExpiring(Long groupId, int reminderDays, 
boolean notified) {
                Instant date = 
Instant.now().minus(Duration.ofDays(reminderDays));
                return em.createNamedQuery("getExpiringRecordings", 
Recording.class)
                                .setParameter("groupId", groupId)
                                .setParameter("date", Date.from(date))
+                               .setParameter("notified", notified)
                                .getResultList();
        }
 

Modified: 
openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/record/Recording.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/record/Recording.java?rev=1770865&r1=1770864&r2=1770865&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/record/Recording.java
 (original)
+++ 
openmeetings/application/branches/3.1.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/record/Recording.java
 Tue Nov 22 18:02:19 2016
@@ -97,7 +97,7 @@ import org.simpleframework.xml.Root;
                        + "WHERE rec.deleted = false AND rec.roomId = r.id AND 
rec.insertedBy = u.id "
                        + "AND (r.externalType = :externalType OR 
u.externalType = :externalType)")
        , @NamedQuery(name = "getExpiringRecordings", query = "SELECT DISTINCT 
rec FROM Recording rec "
-                       + "WHERE rec.deleted = false AND rec.notified = false 
AND rec.inserted < :date "
+                       + "WHERE rec.deleted = false AND rec.notified = 
:notified AND rec.inserted < :date "
                        + "  AND (rec.groupId = :groupId "
                        + "    OR rec.ownerId IN (SELECT gu.user.id FROM 
GroupUser gu WHERE gu.group.id = :groupId)"
                        + "    OR rec.roomId IN (SELECT rg.room.id FROM 
RoomGroup rg WHERE rg.group.id = :groupId)"

Added: 
openmeetings/application/branches/3.1.x/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/AbstractJob.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/AbstractJob.java?rev=1770865&view=auto
==============================================================================
--- 
openmeetings/application/branches/3.1.x/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/AbstractJob.java
 (added)
+++ 
openmeetings/application/branches/3.1.x/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/AbstractJob.java
 Tue Nov 22 18:02:19 2016
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License") +  you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openmeetings.service.quartz.scheduler;
+
+import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
+
+import java.time.Instant;
+import java.time.temporal.ChronoUnit;
+import java.util.function.BiConsumer;
+
+import org.apache.openmeetings.db.dao.record.RecordingDao;
+import org.apache.openmeetings.db.dao.user.GroupDao;
+import org.apache.openmeetings.db.entity.record.Recording;
+import org.apache.openmeetings.db.entity.user.Group;
+import org.apache.openmeetings.util.InitializationContainer;
+import org.red5.logging.Red5LoggerFactory;
+import org.slf4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+
+public abstract class AbstractJob {
+       private static Logger log = 
Red5LoggerFactory.getLogger(AbstractJob.class, webAppRootKey);
+       @Autowired
+       private GroupDao groupDao;
+       @Autowired
+       RecordingDao recordingDao;
+
+       void processExpiringRecordings(boolean notified, BiConsumer<Recording, 
Long> consumer) {
+               if (!InitializationContainer.initComplete) {
+                       return;
+               }
+               for (Group g : groupDao.getLimited()) {
+                       for (Recording rec : 
recordingDao.getExpiring(g.getId(), g.getReminderDays(), notified)) {
+                               try {
+                                       long days = g.getRecordingTtl() - 
ChronoUnit.DAYS.between(rec.getInserted().toInstant(), Instant.now());
+                                       consumer.accept(rec, days);
+                               } catch (Exception e) {
+                                       log.error("Uexpected exception while 
processing expiring recordings emails", e);
+                               }
+                       }
+               }
+       }
+}

Modified: 
openmeetings/application/branches/3.1.x/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/CleanupJob.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/CleanupJob.java?rev=1770865&r1=1770864&r2=1770865&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.1.x/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/CleanupJob.java
 (original)
+++ 
openmeetings/application/branches/3.1.x/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/CleanupJob.java
 Tue Nov 22 18:02:19 2016
@@ -18,7 +18,12 @@
  */
 package org.apache.openmeetings.service.quartz.scheduler;
 
+import static org.apache.openmeetings.util.OmFileHelper.EXTENSION_AVI;
+import static org.apache.openmeetings.util.OmFileHelper.EXTENSION_FLV;
+import static org.apache.openmeetings.util.OmFileHelper.EXTENSION_MP4;
+import static org.apache.openmeetings.util.OmFileHelper.EXTENSION_OGG;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
+
 import java.io.File;
 import java.io.FileFilter;
 
@@ -29,7 +34,7 @@ import org.red5.logging.Red5LoggerFactor
 import org.slf4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
 
-public class CleanupJob {
+public class CleanupJob extends AbstractJob {
        private static Logger log = 
Red5LoggerFactory.getLogger(CleanupJob.class, webAppRootKey);
        private long sessionTimeout = 30 * 60 * 1000L;
        private long testSetupTimeout = 60 * 60 * 1000L; // 1 hour
@@ -37,6 +42,22 @@ public class CleanupJob {
        @Autowired
        private SessiondataDao sessiondataDao;
 
+       public long getSessionTimeout() {
+               return sessionTimeout;
+       }
+
+       public void setSessionTimeout(long sessionTimeout) {
+               this.sessionTimeout = sessionTimeout;
+       }
+
+       public long getTestSetupTimeout() {
+               return testSetupTimeout;
+       }
+
+       public void setTestSetupTimeout(long testSetupTimeout) {
+               this.testSetupTimeout = testSetupTimeout;
+       }
+
        public void cleanTestSetup() {
                log.debug("CleanupJob.execute");
                if (!InitializationContainer.initComplete) {
@@ -72,7 +93,7 @@ public class CleanupJob {
        }
 
        public void cleanSessions() {
-               log.trace("SessionClearJob.execute");
+               log.trace("CleanupJob.cleanSessions");
                if (!InitializationContainer.initComplete) {
                        return;
                }
@@ -84,19 +105,17 @@ public class CleanupJob {
                }
        }
 
-       public long getSessionTimeout() {
-               return sessionTimeout;
-       }
-
-       public void setSessionTimeout(long sessionTimeout) {
-               this.sessionTimeout = sessionTimeout;
-       }
-
-       public long getTestSetupTimeout() {
-               return testSetupTimeout;
-       }
-
-       public void setTestSetupTimeout(long testSetupTimeout) {
-               this.testSetupTimeout = testSetupTimeout;
+       public void cleanExpiredRecordings() {
+               log.debug("CleanupJob.cleanExpiredRecordings");
+               processExpiringRecordings(true, (rec, days) -> {
+                       if (days < 0) {
+                               log.debug("cleanExpiredRecordings:: following 
recording will be deleted {}", rec);
+                               rec.getFile(EXTENSION_MP4).delete();
+                               rec.getFile(EXTENSION_FLV).delete();
+                               rec.getFile(EXTENSION_AVI).delete();
+                               rec.getFile(EXTENSION_OGG).delete();
+                               recordingDao.delete(rec);
+                       }
+               });
        }
 }

Modified: 
openmeetings/application/branches/3.1.x/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/ReminderJob.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/ReminderJob.java?rev=1770865&r1=1770864&r2=1770865&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.1.x/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/ReminderJob.java
 (original)
+++ 
openmeetings/application/branches/3.1.x/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/ReminderJob.java
 Tue Nov 22 18:02:19 2016
@@ -20,15 +20,8 @@ package org.apache.openmeetings.service.
 
 import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
 
-import java.time.Instant;
-import java.time.temporal.ChronoUnit;
-
 import org.apache.openmeetings.core.mail.MailHandler;
-import org.apache.openmeetings.db.dao.record.RecordingDao;
-import org.apache.openmeetings.db.dao.user.GroupDao;
 import org.apache.openmeetings.db.dao.user.UserDao;
-import org.apache.openmeetings.db.entity.record.Recording;
-import org.apache.openmeetings.db.entity.user.Group;
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.service.calendar.AppointmentLogic;
 import 
org.apache.openmeetings.service.mail.template.subject.AbstractSubjectEmailTemplate;
@@ -38,15 +31,11 @@ import org.red5.logging.Red5LoggerFactor
 import org.slf4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
 
-public class ReminderJob {
+public class ReminderJob extends AbstractJob {
        private static Logger log = 
Red5LoggerFactory.getLogger(ReminderJob.class, webAppRootKey);
        @Autowired
        private AppointmentLogic appointmentLogic;
        @Autowired
-       private RecordingDao recordingDao;
-       @Autowired
-       private GroupDao groupDao;
-       @Autowired
        private UserDao userDao;
        @Autowired
        private MailHandler mailHandler;
@@ -65,31 +54,20 @@ public class ReminderJob {
 
        public void remindExpiringRecordings() {
                log.debug("ReminderJob.remindExpiringRecordings");
-               if (!InitializationContainer.initComplete) {
-                       return;
-               }
-               for (Group g : groupDao.getLimited()) {
-                       for (Recording rec : 
recordingDao.getExpiring(g.getId(), g.getReminderDays())) {
-                               try {
-                                       long days = g.getRecordingTtl() - 
ChronoUnit.DAYS.between(rec.getInserted().toInstant(), Instant.now());
-                                       if (days > 0) {
-                                               User u = 
userDao.get(rec.getOwnerId());
-                                               if (u == null) {
-                                                       log.debug("Unable to 
send expiration email due to recording owner is NULL, {}", rec);
-                                                       continue;
-                                               } else {
-                                                       
AbstractSubjectEmailTemplate templ = RecordingExpiringTemplate.get(u, rec, 
days);
-                                                       
mailHandler.send(u.getAddress().getEmail(), templ.getSubject(), 
templ.getEmail());
-                                               }
-                                       } else {
-                                               log.debug("Recording is too old 
to send notification, {} days", days);
-                                       }
-                                       rec.setNotified(true);
-                                       recordingDao.update(rec);
-                               } catch (Exception e) {
-                                       log.error("Uexpected exception while 
sending expiring recordings emails", e);
+               processExpiringRecordings(false, (rec, days) -> {
+                       if (days > 0) {
+                               User u = userDao.get(rec.getOwnerId());
+                               if (u == null) {
+                                       log.debug("Unable to send expiration 
email due to recording owner is NULL, {}", rec);
+                               } else {
+                                       AbstractSubjectEmailTemplate templ = 
RecordingExpiringTemplate.get(u, rec, days);
+                                       
mailHandler.send(u.getAddress().getEmail(), templ.getSubject(), 
templ.getEmail());
                                }
+                       } else {
+                               log.debug("Recording is too old to send 
notification, {} days", days);
                        }
-               }
+                       rec.setNotified(true);
+                       recordingDao.update(rec);
+               });
        }
 }

Modified: 
openmeetings/application/branches/3.1.x/openmeetings-web/src/main/webapp/WEB-INF/classes/openmeetings-applicationContext.xml
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.1.x/openmeetings-web/src/main/webapp/WEB-INF/classes/openmeetings-applicationContext.xml?rev=1770865&r1=1770864&r2=1770865&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.1.x/openmeetings-web/src/main/webapp/WEB-INF/classes/openmeetings-applicationContext.xml
 (original)
+++ 
openmeetings/application/branches/3.1.x/openmeetings-web/src/main/webapp/WEB-INF/classes/openmeetings-applicationContext.xml
 Tue Nov 22 18:02:19 2016
@@ -119,6 +119,16 @@
                <property name="startDelay" value="1800000"/><!-- 30 minutes 
--> 
                <property name="repeatInterval" value="1800000"/> <!-- 30 
minutes -->
        </bean>
+       <bean id="cleanExpiredRecJobDetails" 
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
+               <property name="targetObject" ref="cleanupJob" />
+               <property name="targetMethod" value="cleanExpiredRecordings" />
+               <property name="concurrent" value="false" />
+       </bean>
+       <bean id="triggerCleanExpiredRec" 
class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
+               <property name="jobDetail" ref="cleanExpiredRecJobDetails" />
+               <property name="startDelay" value="5000"/><!-- 5 seconds -->
+               <property name="repeatInterval" value="3600000" /><!-- 1 hour 
-->
+       </bean>
 
        <bean id="reminderJob" 
class="org.apache.openmeetings.service.quartz.scheduler.ReminderJob"/>
        <bean id="meetingReminderJobDetail" 
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
@@ -170,6 +180,7 @@
                        <list>
                                <ref bean="triggerCleanSessions" />
                                <ref bean="triggerCleanTestSetup" />
+                               <ref bean="triggerCleanExpiredRec" />
                                <ref bean="triggerMeetingReminder" />
                                <ref bean="triggerExpiringRecording" />
                                <ref bean="triggerResetSendingMailStatus" />

Modified: 
openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/record/RecordingDao.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/record/RecordingDao.java?rev=1770865&r1=1770864&r2=1770865&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/record/RecordingDao.java
 (original)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/record/RecordingDao.java
 Tue Nov 22 18:02:19 2016
@@ -176,11 +176,12 @@ public class RecordingDao {
                return null;
        }
 
-       public List<Recording> getExpiring(Long groupId, int reminderDays) {
+       public List<Recording> getExpiring(Long groupId, int reminderDays, 
boolean notified) {
                Instant date = 
Instant.now().minus(Duration.ofDays(reminderDays));
                return em.createNamedQuery("getExpiringRecordings", 
Recording.class)
                                .setParameter("groupId", groupId)
                                .setParameter("date", Date.from(date))
+                               .setParameter("notified", notified)
                                .getResultList();
        }
 

Modified: 
openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/record/Recording.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/record/Recording.java?rev=1770865&r1=1770864&r2=1770865&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/record/Recording.java
 (original)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/record/Recording.java
 Tue Nov 22 18:02:19 2016
@@ -91,7 +91,7 @@ import org.simpleframework.xml.Root;
                        + "WHERE rec.deleted = false AND rec.roomId = r.id AND 
rec.insertedBy = u.id "
                        + "AND (r.externalType = :externalType OR 
u.externalType = :externalType)")
        , @NamedQuery(name = "getExpiringRecordings", query = "SELECT DISTINCT 
rec FROM Recording rec "
-                       + "WHERE rec.deleted = false AND rec.notified = false 
AND rec.inserted < :date "
+                       + "WHERE rec.deleted = false AND rec.notified = 
:notified AND rec.inserted < :date "
                        + "  AND (rec.groupId = :groupId "
                        + "    OR rec.ownerId IN (SELECT gu.user.id FROM 
GroupUser gu WHERE gu.group.id = :groupId)"
                        + "    OR rec.roomId IN (SELECT rg.room.id FROM 
RoomGroup rg WHERE rg.group.id = :groupId)"

Added: 
openmeetings/application/branches/3.2.x/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/AbstractJob.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/AbstractJob.java?rev=1770865&view=auto
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/AbstractJob.java
 (added)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/AbstractJob.java
 Tue Nov 22 18:02:19 2016
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License") +  you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openmeetings.service.quartz.scheduler;
+
+import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
+
+import java.time.Instant;
+import java.time.temporal.ChronoUnit;
+import java.util.function.BiConsumer;
+
+import org.apache.openmeetings.db.dao.record.RecordingDao;
+import org.apache.openmeetings.db.dao.user.GroupDao;
+import org.apache.openmeetings.db.entity.record.Recording;
+import org.apache.openmeetings.db.entity.user.Group;
+import org.apache.openmeetings.util.InitializationContainer;
+import org.red5.logging.Red5LoggerFactory;
+import org.slf4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+
+public abstract class AbstractJob {
+       private static Logger log = 
Red5LoggerFactory.getLogger(AbstractJob.class, webAppRootKey);
+       @Autowired
+       private GroupDao groupDao;
+       @Autowired
+       RecordingDao recordingDao;
+
+       void processExpiringRecordings(boolean notified, BiConsumer<Recording, 
Long> consumer) {
+               if (!InitializationContainer.initComplete) {
+                       return;
+               }
+               for (Group g : groupDao.getLimited()) {
+                       for (Recording rec : 
recordingDao.getExpiring(g.getId(), g.getReminderDays(), notified)) {
+                               try {
+                                       long days = g.getRecordingTtl() - 
ChronoUnit.DAYS.between(rec.getInserted().toInstant(), Instant.now());
+                                       consumer.accept(rec, days);
+                               } catch (Exception e) {
+                                       log.error("Uexpected exception while 
processing expiring recordings emails", e);
+                               }
+                       }
+               }
+       }
+}

Modified: 
openmeetings/application/branches/3.2.x/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/CleanupJob.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/CleanupJob.java?rev=1770865&r1=1770864&r2=1770865&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/CleanupJob.java
 (original)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/CleanupJob.java
 Tue Nov 22 18:02:19 2016
@@ -18,7 +18,12 @@
  */
 package org.apache.openmeetings.service.quartz.scheduler;
 
+import static org.apache.openmeetings.util.OmFileHelper.EXTENSION_AVI;
+import static org.apache.openmeetings.util.OmFileHelper.EXTENSION_FLV;
+import static org.apache.openmeetings.util.OmFileHelper.EXTENSION_MP4;
+import static org.apache.openmeetings.util.OmFileHelper.EXTENSION_OGG;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
+
 import java.io.File;
 import java.io.FileFilter;
 
@@ -29,7 +34,7 @@ import org.red5.logging.Red5LoggerFactor
 import org.slf4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
 
-public class CleanupJob {
+public class CleanupJob extends AbstractJob {
        private static Logger log = 
Red5LoggerFactory.getLogger(CleanupJob.class, webAppRootKey);
        private long sessionTimeout = 30 * 60 * 1000L;
        private long testSetupTimeout = 60 * 60 * 1000L; // 1 hour
@@ -37,6 +42,22 @@ public class CleanupJob {
        @Autowired
        private SessiondataDao sessiondataDao;
 
+       public long getSessionTimeout() {
+               return sessionTimeout;
+       }
+
+       public void setSessionTimeout(long sessionTimeout) {
+               this.sessionTimeout = sessionTimeout;
+       }
+
+       public long getTestSetupTimeout() {
+               return testSetupTimeout;
+       }
+
+       public void setTestSetupTimeout(long testSetupTimeout) {
+               this.testSetupTimeout = testSetupTimeout;
+       }
+
        public void cleanTestSetup() {
                log.debug("CleanupJob.execute");
                if (!InitializationContainer.initComplete) {
@@ -72,7 +93,7 @@ public class CleanupJob {
        }
 
        public void cleanSessions() {
-               log.trace("SessionClearJob.execute");
+               log.trace("CleanupJob.cleanSessions");
                if (!InitializationContainer.initComplete) {
                        return;
                }
@@ -84,19 +105,17 @@ public class CleanupJob {
                }
        }
 
-       public long getSessionTimeout() {
-               return sessionTimeout;
-       }
-
-       public void setSessionTimeout(long sessionTimeout) {
-               this.sessionTimeout = sessionTimeout;
-       }
-
-       public long getTestSetupTimeout() {
-               return testSetupTimeout;
-       }
-
-       public void setTestSetupTimeout(long testSetupTimeout) {
-               this.testSetupTimeout = testSetupTimeout;
+       public void cleanExpiredRecordings() {
+               log.debug("CleanupJob.cleanExpiredRecordings");
+               processExpiringRecordings(true, (rec, days) -> {
+                       if (days < 0) {
+                               log.debug("cleanExpiredRecordings:: following 
recording will be deleted {}", rec);
+                               rec.getFile(EXTENSION_MP4).delete();
+                               rec.getFile(EXTENSION_FLV).delete();
+                               rec.getFile(EXTENSION_AVI).delete();
+                               rec.getFile(EXTENSION_OGG).delete();
+                               recordingDao.delete(rec);
+                       }
+               });
        }
 }

Modified: 
openmeetings/application/branches/3.2.x/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/ReminderJob.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/ReminderJob.java?rev=1770865&r1=1770864&r2=1770865&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/ReminderJob.java
 (original)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/ReminderJob.java
 Tue Nov 22 18:02:19 2016
@@ -20,24 +20,25 @@ package org.apache.openmeetings.service.
 
 import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
 
-import org.apache.openmeetings.db.dao.record.RecordingDao;
-import org.apache.openmeetings.db.dao.user.GroupDao;
-import org.apache.openmeetings.db.entity.record.Recording;
-import org.apache.openmeetings.db.entity.user.Group;
+import org.apache.openmeetings.core.mail.MailHandler;
+import org.apache.openmeetings.db.dao.user.UserDao;
+import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.service.calendar.AppointmentLogic;
+import 
org.apache.openmeetings.service.mail.template.subject.AbstractSubjectEmailTemplate;
+import 
org.apache.openmeetings.service.mail.template.subject.RecordingExpiringTemplate;
 import org.apache.openmeetings.util.InitializationContainer;
 import org.red5.logging.Red5LoggerFactory;
 import org.slf4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
 
-public class ReminderJob {
+public class ReminderJob extends AbstractJob {
        private static Logger log = 
Red5LoggerFactory.getLogger(ReminderJob.class, webAppRootKey);
        @Autowired
        private AppointmentLogic appointmentLogic;
        @Autowired
-       private RecordingDao recordingDao;
+       private UserDao userDao;
        @Autowired
-       private GroupDao groupDao;
+       private MailHandler mailHandler;
 
        public void remindMeetings() {
                log.debug("ReminderJob.remindMeetings");
@@ -53,13 +54,20 @@ public class ReminderJob {
 
        public void remindExpiringRecordings() {
                log.debug("ReminderJob.remindExpiringRecordings");
-               if (!InitializationContainer.initComplete) {
-                       return;
-               }
-               for (Group g : groupDao.getLimited()) {
-                       for (Recording rec : 
recordingDao.getExpiring(g.getId(), g.getReminderDays())) {
-                               int i = 1;
+               processExpiringRecordings(false, (rec, days) -> {
+                       if (days > 0) {
+                               User u = userDao.get(rec.getOwnerId());
+                               if (u == null) {
+                                       log.debug("Unable to send expiration 
email due to recording owner is NULL, {}", rec);
+                               } else {
+                                       AbstractSubjectEmailTemplate templ = 
RecordingExpiringTemplate.get(u, rec, days);
+                                       
mailHandler.send(u.getAddress().getEmail(), templ.getSubject(), 
templ.getEmail());
+                               }
+                       } else {
+                               log.debug("Recording is too old to send 
notification, {} days", days);
                        }
-               }
+                       rec.setNotified(true);
+                       recordingDao.update(rec);
+               });
        }
 }

Modified: 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/WEB-INF/classes/openmeetings-applicationContext.xml
URL: 
http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/WEB-INF/classes/openmeetings-applicationContext.xml?rev=1770865&r1=1770864&r2=1770865&view=diff
==============================================================================
--- 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/WEB-INF/classes/openmeetings-applicationContext.xml
 (original)
+++ 
openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/WEB-INF/classes/openmeetings-applicationContext.xml
 Tue Nov 22 18:02:19 2016
@@ -115,6 +115,16 @@
                <property name="startDelay" value="1800000"/><!-- 30 minutes 
--> 
                <property name="repeatInterval" value="1800000"/> <!-- 30 
minutes -->
        </bean>
+       <bean id="cleanExpiredRecJobDetails" 
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
+               <property name="targetObject" ref="cleanupJob" />
+               <property name="targetMethod" value="cleanExpiredRecordings" />
+               <property name="concurrent" value="false" />
+       </bean>
+       <bean id="triggerCleanExpiredRec" 
class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
+               <property name="jobDetail" ref="cleanExpiredRecJobDetails" />
+               <property name="startDelay" value="5000"/><!-- 5 seconds -->
+               <property name="repeatInterval" value="3600000" /><!-- 1 hour 
-->
+       </bean>
 
        <bean id="reminderJob" 
class="org.apache.openmeetings.service.quartz.scheduler.ReminderJob"/>
        <bean id="meetingReminderJobDetail" 
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
@@ -166,6 +176,7 @@
                        <list>
                                <ref bean="triggerCleanSessions" />
                                <ref bean="triggerCleanTestSetup" />
+                               <ref bean="triggerCleanExpiredRec" />
                                <ref bean="triggerMeetingReminder" />
                                <ref bean="triggerExpiringRecording" />
                                <ref bean="triggerResetSendingMailStatus" />

Modified: 
openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/record/RecordingDao.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/record/RecordingDao.java?rev=1770865&r1=1770864&r2=1770865&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/record/RecordingDao.java
 (original)
+++ 
openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/record/RecordingDao.java
 Tue Nov 22 18:02:19 2016
@@ -176,11 +176,12 @@ public class RecordingDao {
                return null;
        }
 
-       public List<Recording> getExpiring(Long groupId, int reminderDays) {
+       public List<Recording> getExpiring(Long groupId, int reminderDays, 
boolean notified) {
                Instant date = 
Instant.now().minus(Duration.ofDays(reminderDays));
                return em.createNamedQuery("getExpiringRecordings", 
Recording.class)
                                .setParameter("groupId", groupId)
                                .setParameter("date", Date.from(date))
+                               .setParameter("notified", notified)
                                .getResultList();
        }
 

Modified: 
openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/record/Recording.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/record/Recording.java?rev=1770865&r1=1770864&r2=1770865&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/record/Recording.java
 (original)
+++ 
openmeetings/application/trunk/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/record/Recording.java
 Tue Nov 22 18:02:19 2016
@@ -91,7 +91,7 @@ import org.simpleframework.xml.Root;
                        + "WHERE rec.deleted = false AND rec.roomId = r.id AND 
rec.insertedBy = u.id "
                        + "AND (r.externalType = :externalType OR 
u.externalType = :externalType)")
        , @NamedQuery(name = "getExpiringRecordings", query = "SELECT DISTINCT 
rec FROM Recording rec "
-                       + "WHERE rec.deleted = false AND rec.notified = false 
AND rec.inserted < :date "
+                       + "WHERE rec.deleted = false AND rec.notified = 
:notified AND rec.inserted < :date "
                        + "  AND (rec.groupId = :groupId "
                        + "    OR rec.ownerId IN (SELECT gu.user.id FROM 
GroupUser gu WHERE gu.group.id = :groupId)"
                        + "    OR rec.roomId IN (SELECT rg.room.id FROM 
RoomGroup rg WHERE rg.group.id = :groupId)"

Added: 
openmeetings/application/trunk/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/AbstractJob.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/AbstractJob.java?rev=1770865&view=auto
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/AbstractJob.java
 (added)
+++ 
openmeetings/application/trunk/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/AbstractJob.java
 Tue Nov 22 18:02:19 2016
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License") +  you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openmeetings.service.quartz.scheduler;
+
+import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
+
+import java.time.Instant;
+import java.time.temporal.ChronoUnit;
+import java.util.function.BiConsumer;
+
+import org.apache.openmeetings.db.dao.record.RecordingDao;
+import org.apache.openmeetings.db.dao.user.GroupDao;
+import org.apache.openmeetings.db.entity.record.Recording;
+import org.apache.openmeetings.db.entity.user.Group;
+import org.apache.openmeetings.util.InitializationContainer;
+import org.red5.logging.Red5LoggerFactory;
+import org.slf4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+
+public abstract class AbstractJob {
+       private static Logger log = 
Red5LoggerFactory.getLogger(AbstractJob.class, webAppRootKey);
+       @Autowired
+       private GroupDao groupDao;
+       @Autowired
+       RecordingDao recordingDao;
+
+       void processExpiringRecordings(boolean notified, BiConsumer<Recording, 
Long> consumer) {
+               if (!InitializationContainer.initComplete) {
+                       return;
+               }
+               for (Group g : groupDao.getLimited()) {
+                       for (Recording rec : 
recordingDao.getExpiring(g.getId(), g.getReminderDays(), notified)) {
+                               try {
+                                       long days = g.getRecordingTtl() - 
ChronoUnit.DAYS.between(rec.getInserted().toInstant(), Instant.now());
+                                       consumer.accept(rec, days);
+                               } catch (Exception e) {
+                                       log.error("Uexpected exception while 
processing expiring recordings emails", e);
+                               }
+                       }
+               }
+       }
+}

Modified: 
openmeetings/application/trunk/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/CleanupJob.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/CleanupJob.java?rev=1770865&r1=1770864&r2=1770865&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/CleanupJob.java
 (original)
+++ 
openmeetings/application/trunk/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/CleanupJob.java
 Tue Nov 22 18:02:19 2016
@@ -18,7 +18,12 @@
  */
 package org.apache.openmeetings.service.quartz.scheduler;
 
+import static org.apache.openmeetings.util.OmFileHelper.EXTENSION_AVI;
+import static org.apache.openmeetings.util.OmFileHelper.EXTENSION_FLV;
+import static org.apache.openmeetings.util.OmFileHelper.EXTENSION_MP4;
+import static org.apache.openmeetings.util.OmFileHelper.EXTENSION_OGG;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
+
 import java.io.File;
 import java.io.FileFilter;
 
@@ -29,7 +34,7 @@ import org.red5.logging.Red5LoggerFactor
 import org.slf4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
 
-public class CleanupJob {
+public class CleanupJob extends AbstractJob {
        private static Logger log = 
Red5LoggerFactory.getLogger(CleanupJob.class, webAppRootKey);
        private long sessionTimeout = 30 * 60 * 1000L;
        private long testSetupTimeout = 60 * 60 * 1000L; // 1 hour
@@ -37,6 +42,22 @@ public class CleanupJob {
        @Autowired
        private SessiondataDao sessiondataDao;
 
+       public long getSessionTimeout() {
+               return sessionTimeout;
+       }
+
+       public void setSessionTimeout(long sessionTimeout) {
+               this.sessionTimeout = sessionTimeout;
+       }
+
+       public long getTestSetupTimeout() {
+               return testSetupTimeout;
+       }
+
+       public void setTestSetupTimeout(long testSetupTimeout) {
+               this.testSetupTimeout = testSetupTimeout;
+       }
+
        public void cleanTestSetup() {
                log.debug("CleanupJob.execute");
                if (!InitializationContainer.initComplete) {
@@ -72,7 +93,7 @@ public class CleanupJob {
        }
 
        public void cleanSessions() {
-               log.trace("SessionClearJob.execute");
+               log.trace("CleanupJob.cleanSessions");
                if (!InitializationContainer.initComplete) {
                        return;
                }
@@ -84,19 +105,17 @@ public class CleanupJob {
                }
        }
 
-       public long getSessionTimeout() {
-               return sessionTimeout;
-       }
-
-       public void setSessionTimeout(long sessionTimeout) {
-               this.sessionTimeout = sessionTimeout;
-       }
-
-       public long getTestSetupTimeout() {
-               return testSetupTimeout;
-       }
-
-       public void setTestSetupTimeout(long testSetupTimeout) {
-               this.testSetupTimeout = testSetupTimeout;
+       public void cleanExpiredRecordings() {
+               log.debug("CleanupJob.cleanExpiredRecordings");
+               processExpiringRecordings(true, (rec, days) -> {
+                       if (days < 0) {
+                               log.debug("cleanExpiredRecordings:: following 
recording will be deleted {}", rec);
+                               rec.getFile(EXTENSION_MP4).delete();
+                               rec.getFile(EXTENSION_FLV).delete();
+                               rec.getFile(EXTENSION_AVI).delete();
+                               rec.getFile(EXTENSION_OGG).delete();
+                               recordingDao.delete(rec);
+                       }
+               });
        }
 }

Modified: 
openmeetings/application/trunk/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/ReminderJob.java
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/ReminderJob.java?rev=1770865&r1=1770864&r2=1770865&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/ReminderJob.java
 (original)
+++ 
openmeetings/application/trunk/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/ReminderJob.java
 Tue Nov 22 18:02:19 2016
@@ -20,24 +20,25 @@ package org.apache.openmeetings.service.
 
 import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
 
-import org.apache.openmeetings.db.dao.record.RecordingDao;
-import org.apache.openmeetings.db.dao.user.GroupDao;
-import org.apache.openmeetings.db.entity.record.Recording;
-import org.apache.openmeetings.db.entity.user.Group;
+import org.apache.openmeetings.core.mail.MailHandler;
+import org.apache.openmeetings.db.dao.user.UserDao;
+import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.service.calendar.AppointmentLogic;
+import 
org.apache.openmeetings.service.mail.template.subject.AbstractSubjectEmailTemplate;
+import 
org.apache.openmeetings.service.mail.template.subject.RecordingExpiringTemplate;
 import org.apache.openmeetings.util.InitializationContainer;
 import org.red5.logging.Red5LoggerFactory;
 import org.slf4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
 
-public class ReminderJob {
+public class ReminderJob extends AbstractJob {
        private static Logger log = 
Red5LoggerFactory.getLogger(ReminderJob.class, webAppRootKey);
        @Autowired
        private AppointmentLogic appointmentLogic;
        @Autowired
-       private RecordingDao recordingDao;
+       private UserDao userDao;
        @Autowired
-       private GroupDao groupDao;
+       private MailHandler mailHandler;
 
        public void remindMeetings() {
                log.debug("ReminderJob.remindMeetings");
@@ -53,13 +54,20 @@ public class ReminderJob {
 
        public void remindExpiringRecordings() {
                log.debug("ReminderJob.remindExpiringRecordings");
-               if (!InitializationContainer.initComplete) {
-                       return;
-               }
-               for (Group g : groupDao.getLimited()) {
-                       for (Recording rec : 
recordingDao.getExpiring(g.getId(), g.getReminderDays())) {
-                               int i = 1;
+               processExpiringRecordings(false, (rec, days) -> {
+                       if (days > 0) {
+                               User u = userDao.get(rec.getOwnerId());
+                               if (u == null) {
+                                       log.debug("Unable to send expiration 
email due to recording owner is NULL, {}", rec);
+                               } else {
+                                       AbstractSubjectEmailTemplate templ = 
RecordingExpiringTemplate.get(u, rec, days);
+                                       
mailHandler.send(u.getAddress().getEmail(), templ.getSubject(), 
templ.getEmail());
+                               }
+                       } else {
+                               log.debug("Recording is too old to send 
notification, {} days", days);
                        }
-               }
+                       rec.setNotified(true);
+                       recordingDao.update(rec);
+               });
        }
 }

Modified: 
openmeetings/application/trunk/openmeetings-web/src/main/webapp/WEB-INF/classes/openmeetings-applicationContext.xml
URL: 
http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/webapp/WEB-INF/classes/openmeetings-applicationContext.xml?rev=1770865&r1=1770864&r2=1770865&view=diff
==============================================================================
--- 
openmeetings/application/trunk/openmeetings-web/src/main/webapp/WEB-INF/classes/openmeetings-applicationContext.xml
 (original)
+++ 
openmeetings/application/trunk/openmeetings-web/src/main/webapp/WEB-INF/classes/openmeetings-applicationContext.xml
 Tue Nov 22 18:02:19 2016
@@ -113,6 +113,16 @@
                <property name="startDelay" value="1800000"/><!-- 30 minutes 
--> 
                <property name="repeatInterval" value="1800000"/> <!-- 30 
minutes -->
        </bean>
+       <bean id="cleanExpiredRecJobDetails" 
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
+               <property name="targetObject" ref="cleanupJob" />
+               <property name="targetMethod" value="cleanExpiredRecordings" />
+               <property name="concurrent" value="false" />
+       </bean>
+       <bean id="triggerCleanExpiredRec" 
class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
+               <property name="jobDetail" ref="cleanExpiredRecJobDetails" />
+               <property name="startDelay" value="5000"/><!-- 5 seconds -->
+               <property name="repeatInterval" value="3600000" /><!-- 1 hour 
-->
+       </bean>
 
        <bean id="reminderJob" 
class="org.apache.openmeetings.service.quartz.scheduler.ReminderJob"/>
        <bean id="meetingReminderJobDetail" 
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
@@ -164,6 +174,7 @@
                        <list>
                                <ref bean="triggerCleanSessions" />
                                <ref bean="triggerCleanTestSetup" />
+                               <ref bean="triggerCleanExpiredRec" />
                                <ref bean="triggerMeetingReminder" />
                                <ref bean="triggerExpiringRecording" />
                                <ref bean="triggerResetSendingMailStatus" />



Reply via email to