2015-07-12 52 views
0

我在Spring MVC 4项目中使用亚马逊推送通知。我已经使用CronTrigger每天早上8点向Android应用发送推送通知。我还使用了Timezone和CronTrigger,以便用户根据各自的时区获取通知。CronTrigger在指定的时间没有触发,而是在错误的时间发送多个推送通知

这里是我的WebConfig.java:

@Configuration 
@EnableScheduling 
@EnableWebMvc 
@ComponentScan(basePackages="com.project") 
public class WebConfig implements SchedulingConfigurer 
{  
    protected static final Logger slf4jLogger = Logger.getLogger(WebConfig.class.getName()); 
private static final String cronExpression = "0 8 * * * ?"; 



/*@Bean 
public MobileNotifSchedulerBean schedulerbean() 
{ 
    return new MobileNotifSchedulerBean(); 
}*/ 

@Bean 
public InternalResourceViewResolver getInternalResourceViewResolver() 
{ 
    InternalResourceViewResolver resolver = new InternalResourceViewResolver(); 
    resolver.setPrefix("/WEB-INF/jsp/"); 
    resolver.setSuffix(".jsp"); 
    resolver.setSuffix(".html"); 
    resolver.setSuffix(".htm"); 
    return resolver; 
} 

@Bean 
CronTrigger cronTrigger() 
{ 
    //The code in FetchUserTimeZones.java fetches all the user timezones which are stored in DynamoDb. Eg timeZone = "Asia/Calcutta"; 
    String timeZone = null; 
    HashSet<String> userTimeZonesfromDB = FetchUserTimeZones.fetchUserTimeZone(); 
    for (String s : userTimeZonesfromDB) 
    { 
     timeZone = s; 
     slf4jLogger.info(s); 
    } 
    return new CronTrigger(cronExpression, TimeZone.getTimeZone(timeZone)); 
} 


@Override 
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) 
{ 

    taskRegistrar.addCronTask(new CronTask(new MobileNotifSchedulerBean(), cronTrigger())); 
} 

@Bean(destroyMethod="shutdown") 
public Executor taskExecutor() 
{ 
    return Executors.newScheduledThreadPool(1); 
    } 
} 

这里是我的MobileNotifSchedulerBean: 此代码DynamoDb获取随机的问题的帮助下把他们的推送通知每个GCM registrationID CronTrigger设置为时间(上午8点)。我已使用snsmobilepush.ziphttp://docs.aws.amazon.com/sns/latest/dg/mobile-push-gcm.html

@EnableScheduling 
public class MobileNotifSchedulerBean implements Runnable 
{ 
    protected static final Logger slf4jLogger = Logger.getLogger(MobileNotifSchedulerBean.class.getName()); 

public MobileNotifSchedulerBean() 
{ 
    run(); 
} 

public void sendQuestionNotif() 
{ 
    try 
    { 
     HashSet<String> reg_ids = FetchRegistrationIDs.fetchItems(); 
     for (String s : reg_ids) 
     { 
      String REGISTRATION_IDs = s; 
      slf4jLogger.info(s);     
      MobileSNSPushNotification.sendNotification(REGISTRATION_IDs); 
     } 
    } 
    catch (IOException e) 
    { 
     //e.printStackTrace(); 
     slf4jLogger.error(e); 
     slf4jLogger.error(e.getMessage()); 
     slf4jLogger.error(e.getStackTrace()); 
    } 
} 


@Override 
public void run() 
{ 
    sendQuestionNotif(); 
} 
} 

请帮我我哪里出错了。唯一的问题是推送通知发生在错误的时间,并且还有多个通知,而不是每个用户每天(上午8点)只推送一个通知。 TIA。

更新:在Cron表达式中有一个更正。我纠正了它。

private static final String cronExpression = "0 0 8 * * ?"; // For everyday 8 am. 

但还是问题并没有固定

回答

1

你应该为每个用户

// spring bean 
class Task implements Runnable { 

    public Task(TaskScheduler scheduler, String cron) { 
     HashSet<String> userTimeZonesfromDB = FetchUserTimeZones.fetchUserTimeZone(); 
     for (String tz : userTimeZonesfromDB) { 
      scheduler.schedule(this, new CronTrigger(cron, TimeZone.getTimeZone(tz))); 
     } 
    } 

    @Override 
    public void run() { 
     // notify 
    } 
} 
+0

我能留住ScheduledTaskRegistrar或使用的TaskScheduler创建一个单独的时间表? – Chandz

+0

我用户_TaskScheduler_。我得到这个错误,_No [org.springframework.scheduling.TaskScheduler]类型的合格bean被定义了_你能帮我吗? – Chandz

相关问题