Index: lams_common/src/java/org/lamsfoundation/lams/commonContext.xml =================================================================== RCS file: /usr/local/cvsroot/lams_common/src/java/org/lamsfoundation/lams/commonContext.xml,v diff -u -r1.100.2.8 -r1.100.2.9 --- lams_common/src/java/org/lamsfoundation/lams/commonContext.xml 21 Oct 2014 12:24:13 -0000 1.100.2.8 +++ lams_common/src/java/org/lamsfoundation/lams/commonContext.xml 21 Oct 2014 21:25:09 -0000 1.100.2.9 @@ -234,17 +234,25 @@ lams_qtz_ - + + + + + + + + + + + + - - - @@ -261,11 +269,28 @@ PROPAGATION_REQUIRED PROPAGATION_REQUIRED PROPAGATION_REQUIRED + PROPAGATION_REQUIRED PROPAGATION_SUPPORTS + + + + + + + + + + + + + + + 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.1 -r1.7.2.2 --- lams_common/src/java/org/lamsfoundation/lams/events/EventNotificationService.java 15 Oct 2014 20:49:48 -0000 1.7.2.1 +++ lams_common/src/java/org/lamsfoundation/lams/events/EventNotificationService.java 21 Oct 2014 21:25:09 -0000 1.7.2.2 @@ -19,11 +19,6 @@ import org.lamsfoundation.lams.util.Configuration; import org.lamsfoundation.lams.util.ConfigurationKeys; import org.lamsfoundation.lams.util.MessageService; -import org.quartz.JobDetail; -import org.quartz.Scheduler; -import org.quartz.SchedulerException; -import org.quartz.SimpleTrigger; -import org.quartz.Trigger; /** * Provides tools for managing events and notifing users. @@ -50,17 +45,6 @@ protected static final Logger log = Logger.getLogger(EventNotificationService.class); /** - * How often the attempts to resend messages should be taken (in miliseconds). Currently - every hour. - */ - private static final long RESEND_FREQUENCY = 60 * 60 * 1000; - - /** - * When the first resend is to be triggered (starting from class instantiation time). - */ - private static final long FIRST_RESEND_TIME = System.currentTimeMillis() + 120000; - - - /** * Interface to contact the database. */ protected EventDAO eventDAO; @@ -77,47 +61,14 @@ protected ILamsToolService toolService; /** - * Quartz scheduler used for resending messages. - */ - private Scheduler scheduler; - /** - * Name of the Quartz job that resends messages. - */ - private final static String RESEND_MESSAGES_JOB_NAME = "Resend Messages Job"; - /** - * Name of the Quartz trigger that resends messages. - */ - private final static String RESEND_MESSAGES_TRIGGER_NAME = "Resend Messages Job trigger"; - - /** * Default constructor. Should be called only once, since this class in a singleton. - * - * @param scheduler - * scheduler injected by Spring */ - public EventNotificationService(Scheduler scheduler) { + public EventNotificationService() { if (EventNotificationService.instance == null) { EventNotificationService.instance = this; - this.scheduler = scheduler; EventNotificationService.availableDeliveryMethods.add(IEventNotificationService.DELIVERY_METHOD_MAIL); - try { - JobDetail resendMessagesJobDetail = getScheduler().getJobDetail( - EventNotificationService.RESEND_MESSAGES_JOB_NAME, Scheduler.DEFAULT_GROUP); - if (resendMessagesJobDetail == null) { - resendMessagesJobDetail = new JobDetail(EventNotificationService.RESEND_MESSAGES_JOB_NAME, - Scheduler.DEFAULT_GROUP, ResendMessagesJob.class); - resendMessagesJobDetail.setDescription(""); - Trigger resendMessageTrigger = new SimpleTrigger( - EventNotificationService.RESEND_MESSAGES_TRIGGER_NAME, Scheduler.DEFAULT_GROUP, new Date(FIRST_RESEND_TIME), null, - SimpleTrigger.REPEAT_INDEFINITELY, EventNotificationService.RESEND_FREQUENCY); - getScheduler().scheduleJob(resendMessagesJobDetail, resendMessageTrigger); - } - getScheduler().start(); - } catch (SchedulerException e) { - EventNotificationService.log.error(e.getMessage()); - } - } } + } /** * Gets the only existing instance of the class. @@ -603,7 +554,8 @@ * @param event * event to be saved */ - protected void saveEvent(Event event) { + @Override + public void saveEvent(Event event) { event.referenceCounter--; if (event.referenceCounter <= 0) { EventNotificationService.eventPool.remove(event); @@ -631,10 +583,6 @@ this.userManagementService = userManagementService; } - private Scheduler getScheduler() { - return scheduler; - } - public void setMessageService(MessageService messageService) { this.messageService = messageService; } @@ -658,4 +606,8 @@ protected ILamsToolService getToolService() { return toolService; } + + public List getEventsToResend() { + return eventDAO.getEventsToResend(); + } } \ No newline at end of file Index: lams_common/src/java/org/lamsfoundation/lams/events/IEventNotificationService.java =================================================================== RCS file: /usr/local/cvsroot/lams_common/src/java/org/lamsfoundation/lams/events/IEventNotificationService.java,v diff -u -r1.4 -r1.4.2.1 --- lams_common/src/java/org/lamsfoundation/lams/events/IEventNotificationService.java 10 Mar 2014 22:39:30 -0000 1.4 +++ lams_common/src/java/org/lamsfoundation/lams/events/IEventNotificationService.java 21 Oct 2014 21:25:09 -0000 1.4.2.1 @@ -1,6 +1,7 @@ package org.lamsfoundation.lams.events; import java.security.InvalidParameterException; +import java.util.List; import java.util.Set; /** @@ -71,6 +72,12 @@ String defaultMessage, boolean isHtmlFormat) throws InvalidParameterException; /** + * Saves an event into the database. + */ + void saveEvent(Event event); + + + /** * Deletes an event. * * @param scope @@ -102,7 +109,15 @@ abstract boolean eventExists(String scope, String name, Long eventSessionId) throws InvalidParameterException; + /** + * Returns Event that are to be resend by QuartzJob + * @return events to resend + */ + List getEventsToResend(); + + + /** * Gets the available delivery methods that can be used when subscribing an user to an event. * * @return set of available delivery methods in the system @@ -356,4 +371,5 @@ */ abstract boolean unsubscribe(String scope, String name, Long eventSessionId, Integer userId, AbstractDeliveryMethod deliveryMethod) throws InvalidParameterException; + } \ No newline at end of file Index: lams_common/src/java/org/lamsfoundation/lams/events/ResendMessagesJob.java =================================================================== RCS file: /usr/local/cvsroot/lams_common/src/java/org/lamsfoundation/lams/events/ResendMessagesJob.java,v diff -u -r1.4 -r1.4.2.1 --- lams_common/src/java/org/lamsfoundation/lams/events/ResendMessagesJob.java 2 Jul 2014 17:10:59 -0000 1.4 +++ lams_common/src/java/org/lamsfoundation/lams/events/ResendMessagesJob.java 21 Oct 2014 21:25:09 -0000 1.4.2.1 @@ -4,10 +4,13 @@ import org.apache.log4j.Logger; import org.lamsfoundation.lams.usermanagement.User; +import org.lamsfoundation.lams.usermanagement.service.IUserManagementService; import org.lamsfoundation.lams.util.MessageService; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.quartz.QuartzJobBean; +import org.springframework.web.context.support.SpringBeanAutowiringSupport; /** * Quartz job for resending messages. This job is scheduled from the start-up and periodically attempts to resend failed @@ -20,60 +23,97 @@ protected static final Logger log = Logger.getLogger(ResendMessagesJob.class); /** - * Period after which the thread gives up on attempting to resend messages. Currently - 2 days. - */ - private static final long RESEND_TIME_LIMIT = 2 * 24 * 60 * 60 * 1000; + * Period after which the thread gives up on attempting to resend messages. + * Currently - 2 days. + */ + private static final long RESEND_TIME_LIMIT = 2 * 24 * 60 * 60 * 1000; - private static final EventNotificationService notificationService = EventNotificationService.getInstance(); + @Autowired + private IEventNotificationService eventNotificationService; - private static final MessageService messageService = ResendMessagesJob.notificationService.getMessageService(); - + @Autowired + private MessageService commonMessageService; + + @Autowired + private IUserManagementService userManagementService; + @Override protected void executeInternal(JobExecutionContext context) throws JobExecutionException { - try { - EventNotificationService.log.debug("Event notification service is running a resend messages thread..."); - List events = ResendMessagesJob.notificationService.getEventDAO().getEventsToResend(); - for (Event event : events) { - event.referenceCounter++; - if (event.getFailTime() != null) { - event.trigger(event.getSubject(), event.getMessage()); - event.notificationThread.join(); - if (event.getSubscriptions().isEmpty()) { - event.deleted = true; - } else if (System.currentTimeMillis() - event.getFailTime().getTime() >= ResendMessagesJob.RESEND_TIME_LIMIT) { - event.deleted = true; - StringBuilder body = new StringBuilder( - ResendMessagesJob.messageService.getMessage("mail.resend.abandon.body1")).append( - event.getDefaultMessage()).append( - ResendMessagesJob.messageService.getMessage("mail.resend.abandon.body2")); - for (Subscription subscription : event.getSubscriptions()) { - User user = (User) EventNotificationService.getInstance().getUserManagementService() - .findById(User.class, subscription.getUserId()); - body.append(user.getLogin()).append('\n'); + //First recover context of the job since it is created by Quartz, not Spring + SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this); + resendMessages(); + } + + private void resendMessages() throws JobExecutionException { + try { + EventNotificationService.log.debug("Event notification service is running a resend messages thread..."); + List events = eventNotificationService.getEventsToResend(); + for (Event event : events) { + event.referenceCounter++; + if (event.getFailTime() != null) { + event.trigger(event.getSubject(), event.getMessage()); + event.notificationThread.join(); + if (event.getSubscriptions().isEmpty()) { + event.deleted = true; + } else if (System.currentTimeMillis() - event.getFailTime().getTime() >= ResendMessagesJob.RESEND_TIME_LIMIT) { + event.deleted = true; + StringBuilder body = new StringBuilder( + commonMessageService.getMessage("mail.resend.abandon.body1")).append( + event.getDefaultMessage()).append( + commonMessageService.getMessage("mail.resend.abandon.body2")); + for (Subscription subscription : event.getSubscriptions()) { + User user = (User) userManagementService.findById(User.class, subscription.getUserId()); + body.append(user.getLogin()).append('\n'); + } + ((DeliveryMethodMail) IEventNotificationService.DELIVERY_METHOD_MAIL).notifyAdmin( + commonMessageService.getMessage("mail.resend.abandon.subject"), + body.toString(), event.isHtmlFormat()); + } + } else { + for (Subscription subscription : event.getSubscriptions()) { + if ((subscription.getLastOperationTime() != null) + && (System.currentTimeMillis() - subscription.getLastOperationTime().getTime() > subscription + .getPeriodicity())) { + String subject = event.getSubject() == null ? event.getDefaultSubject() : event + .getSubject(); + String message = event.getMessage() == null ? event.getDefaultMessage() : event + .getMessage(); + boolean isHtmlFormat = event.isHtmlFormat(); + subscription.notifyUser(subject, message, isHtmlFormat); + } + } } - ((DeliveryMethodMail) IEventNotificationService.DELIVERY_METHOD_MAIL).notifyAdmin( - ResendMessagesJob.messageService.getMessage("mail.resend.abandon.subject"), - body.toString(), event.isHtmlFormat()); + eventNotificationService.saveEvent(event); } - } else { - for (Subscription subscription : event.getSubscriptions()) { - if ((subscription.getLastOperationTime() != null) - && (System.currentTimeMillis() - subscription.getLastOperationTime().getTime() > subscription - .getPeriodicity())) { - String subject = event.getSubject() == null ? event.getDefaultSubject() : event - .getSubject(); - String message = event.getMessage() == null ? event.getDefaultMessage() : event - .getMessage(); - boolean isHtmlFormat = event.isHtmlFormat(); - subscription.notifyUser(subject, message, isHtmlFormat); - } - } + } catch (Exception e) { + log.error("Error while resending messages", e); + throw new JobExecutionException("Error while resending messages"); } - ResendMessagesJob.notificationService.saveEvent(event); - } - } catch (Exception e) { - log.error("Error while resending messages", e); - throw new JobExecutionException("Error while resending messages"); } - } + + public IEventNotificationService getEventNotificationService() { + return eventNotificationService; + } + + + public void setEventNotificationService(IEventNotificationService eventNotificationService) { + this.eventNotificationService = eventNotificationService; + } + + public MessageService getCommonMessageService() { + return commonMessageService; + } + + public void setCommonMessageService(MessageService commonMessageService) { + this.commonMessageService = commonMessageService; + } + + public IUserManagementService getUserManagementService() { + return userManagementService; + } + + public void setUserManagementService(IUserManagementService userManagementService) { + this.userManagementService = userManagementService; + } + } \ No newline at end of file