Мое приложение Java EE должно иметь фоновый поток, который обновляет состояние БД. Я бы хотел использовать JPA для этой цели. Каковы наилучшие методы для этого? (Наш контейнер EE находится в JSR-236, поэтому ManagedExecutorService не является нашим выбором)
Кстати, я попробовал код ниже, но он не работал - никаких исключений не было, но ничего не было записано в БД. Без фонового потока и с помощью встроенного EntityManager все сохранено:
@Singleton
public class IdentityDao{
@PersistenceUnit(unitName = "routing")
private EntityManagerFactory emf;
@Resource
private UserTransaction utx;
@PostConstruct
protected void startConverter() {
new Converter();
}
private class Converter implements Runnable {
private Converter() {
ScheduledExecutorService scheduler = ThreadUtils.newSingleThreadScheduledExecutor("test", true);
scheduler.scheduleAtFixedRate(this, 5, 5, TimeUnit.SECONDS);
}
@Override
public void run() {
EntityManager em = emf.createEntityManager();
try {
utx.begin();
em.persist(new PersonEntity("123"));
utx.commit();
} catch (Exception e) {
try {
e.printStackTrace();
utx.rollback();
} catch (Exception exc) {
}
} finally {
em.close();
}
}
}
}
Наконец, я нашел простое решение. Он основан на использовании таймеров ejb, как предложил Гимби.
@Singleton
public class IdentityDao{
@PersistenceContext
EntityManager em;
@Schedule(hour = "*", minute = "*", second = "*/10")
public void every10Sec() {
em.persist(new PersonEntity("123"));
}
}