Доброго времени суток. В приложении на Spring + Hibernate мне понадобилось выполнять некую работу по расписанию, сделал по туторилам так:
@Service
public class ServerScanner implements RequestHandler
{
@Scheduled(fixedRate = 60000)
public void process()
{
doWork();
}
@Transactional
private void doWork()
{
// Some code with DAO here
}
@Autowired
private ServerDAO serverDAO;
}
В методе doWork() у меня есть обращение к полям с ленивой инициализацией, поэтому мне нужно, что бы открывалась сессия Hibernate'a во время выполнения этого метода.
Вот, что получается при срабатывании таймера. При этом, аналогичный код, помещенный в контроллер, работает нормально.
org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here
Попробовал добавить такую строчку в конфиг Hibernate'a:
У вас doWork вызывается не через спринговую прокси. Сделайте какой нить ScheduledServiceWorker и заинжектите туда ServerScanner. Тогда вызов doWork пойдет через прокси. Можно еще через контекст получить ссылку на свою прокси, но имхо это как то не красиво.
Здравствуйте, PZI, Вы писали:
PZI>У вас doWork вызывается не через спринговую прокси. Сделайте какой нить ScheduledServiceWorker и заинжектите туда ServerScanner. Тогда вызов doWork пойдет через прокси. Можно еще через контекст получить ссылку на свою прокси, но имхо это как то не красиво.
Попытался сделать как Вы объяснили.
@Service
public class ScheduledServiceWorker
{
@Scheduled(fixedRate = 60000)
public void process()
{
scanner.process();
}
@Autowired
private ServerScanner scanner;
}
А вот сам ServerScanner
@Service
public class ServerScanner
{
@Transactional
public void process()
{
// Some code here.
}
Теперь перестало запускаться совсем
org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [net.mydomain.service.impl.ServerScanner]
Здравствуйте, PZI, Вы писали:
PZI>Здравствуйте, InstantI, Вы писали:
II>>Здравствуйте, PZI, Вы писали:
PZI>В ServerScanner случайно нет депенденси на самого себя?
Ну и сейчас лень конечно читать доки, будет ли спринг генерить прокси на классы без интерфейсов, но без интерфейсов как то не красиво.
Здравствуйте, PZI, Вы писали:
PZI>Ну и сейчас лень конечно читать доки, будет ли спринг генерить прокси на классы без интерфейсов, но без интерфейсов как то не красиво.
Сделал через интерфейс, помогло, большое спасибо!
Re: [Spring] @Scheduled и @Transactional
От:
Аноним
Дата:
18.10.11 18:31
Оценка:
Здравствуйте, InstantI, Вы писали: II>Подскажите, как правильно решать эту задачу?
1. Поставить аннотацию Transactional на метод process, хотя я не уверен может и не сработать.
2. Если первое не поможет, создать класс для джоба, туда притянуть сервис и дергать метод сервиса оттуда это 100% гарантия. Кстати в этот класс джоба можно
будет притянуть все сервисы методы которых нужно дергать по расписанию, так хоть какой-то порядок будет, все работы в одном месте.