Каков общий шаблон для обработки запланированных событий весной?

#java #spring

#java #весна

Вопрос:

В моем приложении мне нужно добавить проверку и обработку запланированных событий. Когда произошла какая-то бизнес-логика, мне нужно создать триггер posponed, который должен запускать некоторые действия через определенный промежуток времени. Например:

Если пользователь опубликовал фотографию, он должен быть уведомлен, если под ней нет лайков в течение трех дней.

Я чувствую, что это должен быть общий шаблон для таких действий, основанный на функциях Spring framework.

Ответ №1:

В вашей основной конфигурации вам нужно что-то вроде :

 @Configuration
@EnableScheduling
public class HelloWorldConfig { ..}
  

Затем в вашем компоненте, где вы хотите что-то запланировать :

  @Scheduled(fixedRate=1000)
 public void reload()  { ..}
  

Смотрите http://docs.spring.io/spring/docs/current/spring-framework-reference/html/scheduling.html

Убедитесь, что вы включили @EnableScheduling или эквивалент, если вы используете XML config .

Комментарии:

1. Пожалуйста, включите соответствующие части связанного содержимого в свой ответ.

2. Я обновил свой ответ с учетом комментариев выше.

Ответ №2:

 @Component
public class DemoExpirationEvent implements Runnable {

    @Resource(name = "demoPhotoService")
    private DemoExpirationService demoExpirationService;

    @Resource(name = "demoExpirationTaskScheduler")
    private TaskScheduler taskScheduler;

    private Long id;

    @Override
    public void run() {
        demoExpirationService.expiration(id);     
    }

    public void schedule(Long id, Date dateToExpire){
        this.id = id;
        taskScheduler.schedule(this, dateToExpire);
    }
}

@Service("demoPhotoService")
public class DemoPhotoServiceImpl implements DemoExpirationService, DemoPhotoService {

    @Override
    public void expiration(Long id) {
        DemoPhoto photo = getPhoto(id); 
        photo.setExpirationDate(null);
        savePhoto(photo);
        notifyAuthorOfPhoto(id); 
    }

    @Override
    public void getPhoto(long id){
         //some implementation
    }

    @Override
    public void savePhoto(DemoPhoto photo){
         //some implementation
    }

    @Override
    public void notifyAuthorOfPhoto(long id){
         //some implementation
    }
}


public class DemoAddedPhotoActivity {

    @Resource(name = "demoExpirationEvent")
    private DemoExpirationEvent demoExpirationEvent;

    @Resource(name = "demoPhotoService")
    private DemoPhotoService demoPhotoService;

    public void execute(long id) throws Exception {
        DemoPhoto photo = demoPhotoService.getPhoto(id);
        Date expirationDate = new Date(System.currentTimeMillis()   30000000000L);

        photo.setExpirationDate(expirationDate);
        demoPhotoService.savePhoto(photo);
        demoExpirationEvent.schedule(id,  expirationDate);
    }
}
  
  • зарегистрируйте планировщик задач в своем applicationContext.xml
 <beans xmlns:task="http://www.springframework.org/schema/task"
    xsi:schemaLocation="http://www.springframework.org/schema/task
    http://www.springframework.org/schema/task/spring-task-4.1.xsd">

<task:scheduler id="demoExpirationTaskScheduler" pool-size="3"/>
  
  • И остальные компоненты тоже и вызовите activity при добавлении photo (это может быть метод контроллера с помощью метода execute like