#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