来自其他线程的java JTA事务(以前的JSR236)
我的JavaEE应用程序应该有一个后台线程,用于更新DB状态。为此,我想使用JPA。做这件事的最佳实践是什么?(我们的EE容器是之前的JSR-236,因此ManagedExecutorService不是我们的选择)
顺便说一句,我尝试了下面的代码,但它没有工作-没有抛出异常,但没有保存到DB中。没有后台线程并使用注入的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();
}
}
}
}
# 1 楼答案
最后我找到了简单的解决办法。正如Gimby所建议的,它基于ejb定时器的使用