2015-07-12 31 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

相關問題