CronTrigger是不是在指定的时间触发,而是在错误的时间发出多个推送通知(CronTrigge

2019-10-30 02:58发布

我使用亚马逊推送通知我的Spring MVC 4项目。 我已经使用CronTrigger来推送通知早上8点发送到Android应用程序的每一天。 我也用的时区与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获取随机的问题,并与设定时间(上午8点)的CronTrigger的帮助,给他们在推送通知每个GCM registrationID。 我从使用snsmobilepush.zip http://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();
}
}

请帮我,我也出了问题。 唯一的问题是推送通知要在错误的时间,也通知的倍数,而不是去每个用户只有1推送通知,每天(上午8:00)。 TIA。

更新:有在cron表达式的修正。 我纠正它。

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

但问题仍然没有固定的

Answer 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
    }
}


文章来源: CronTrigger is not triggering at specified time but instead sends multiple push notifications at wrong times