gpt4 book ai didi

java - CronTrigger 未在指定时间触发,而是在错误的时间发送多个推送通知

转载 作者:行者123 更新时间:2023-12-01 11:19:54 25 4
gpt4 key购买 nike

我在 Spring MVC 4 项目中使用 Amazon 推送通知。我使用 CronTrigger 每天早上 8 点向 Android 应用程序发送推送通知。我还使用了 Timezone 和 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 获取随机问题,并在 CronTrigger 设置为时间(上午 8 点)的帮助下,以每个 GCM 注册 ID 的推送通知形式发送它们。我使用了 http://docs.aws.amazon.com/sns/latest/dg/mobile-push-gcm.html 中的 snsmobilepush.zip

@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 点)仅发送 1 个推送通知。 TIA。

更新:Cron 表达式中进行了更正。我纠正了。

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

但是问题还没有解决

最佳答案

您应该为每个用户创建单独的时间表

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

关于java - CronTrigger 未在指定时间触发,而是在错误的时间发送多个推送通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31370293/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com