当前位置: 首页 > 知识库问答 >
问题:

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

苗康平
2023-03-14

我在我的Spring MVC4项目中使用了Amazon推送通知。我每天早上8点用CronTrigger向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);
  } 
}
@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();
}
}

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

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

但问题还没有解决

共有1个答案

陈俊誉
2023-03-14

您应该为每个用户创建单独的计划

// 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
    }
}
 类似资料:
  • 我有一个场景,我需要安排一个工作,必须每天在特定时间执行。当我用特定的时间作为调度器的开始时间来调度它时,quartz不会在设定的开始时间触发作业,而是在下一个周期即延迟24小时后触发作业。即使在检查下一个FireTime时,我们也会得到一天的延迟。 例如:我需要每天安排一项工作在晚上6点进行。今天(2018年3月27日)下午5点开始。工作没有开始,下一次火灾时间是2018年3月28日下午6点。

  • 我对Android系统比较陌生,所以我在这里很困惑... NotificationReceiver.java manifest.xml

  • 我试图在指定时间触发通知和警报。我已经将日志信息放在控制台上,以查看是否设置了正确的时间,并且一切正常。但是,仍然没有触发警报。请帮忙。 创建通知和警报的/Code/ /通知消息类/ 请帮帮我,我做错了什么?

  • 我管理一切都很好,创建了一个通知服务,用于作为警报的结果触发通知。不幸的是,使用AlarmManager设置警报不能正常工作。它会在几分钟后触发(而不是几小时,这将表示时区问题)。循环周期为1周,所以我使用了常数INTERVAL_DAY,并将其乘以7。为了确保一个PendingIntent不会替换另一个,我将dayOfWeek作为第二个参数传递给PendingIntent.getService()

  • 我正在尝试使用Firebase云功能创建消息推送。以下是我的代码: 我得到以下错误: 错误:提供给sendToDevice()的注册令牌必须是非空字符串或非空数组。在FirebaseMessagingeror。FirebaseError[作为构造函数](/srv/node_modules/firebase admin/lib/utils/error.js:42:28)位于FirebaseMessa

  • 这是舱单 这是我的注册令牌类 这是我的Firebase服务类