有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

来自其他线程的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) 个答案

  1. # 1 楼答案

    最后我找到了简单的解决办法。正如Gimby所建议的,它基于ejb定时器的使用

    @Singleton
    public class IdentityDao{    
        @PersistenceContext
        EntityManager em;
    
        @Schedule(hour = "*", minute = "*", second = "*/10")
        public void every10Sec() {
             em.persist(new PersonEntity("123"));
        }
    }