记录一次@Transactional失效问题( 同@PostConstruct一起使用时 )

参考:https://stackoverflow.com/questions/17346679/transactional-on-postconstruct-method

@Log4j
@Repository
public class SchoolDaoImpl implements SchoolDao {

    private static final String[] KEYS = new String[] { "school.sms.alert", "school.sms.out", "school.user.alert",
            "school.user.out" };

    private static final long PERIOD = 60*10 * 1000;

    private Map<String, Float> values = new HashMap<String, Float>();

    private Timer timer = new Timer("school alert data syn");

    public SchoolDaoImpl() {

    }

    @Autowired
    @Qualifier("transactionManager")
    protected PlatformTransactionManager txManager;

    
    @PersistenceContext
    private EntityManager schoolEntityManager;

    /**
     * 获取会话
     * 
     * @return
     */
    private Session getSession() {
        return schoolEntityManager.unwrap(Session.class);
    }
    
    /**
     * 定时刷新
     */
    @PostConstruct
    protected void init() {
        if(!existsDict()){
            return;
        }
        timer.schedule(new TimerTask() {

            @Override
            public void run() {
                refreshData();
            }

        }, 0, PERIOD);
    }
    
    /**
     * Dict表是否存在
     * 
     * @return
     */
    private boolean existsDict() {
        try {
            Object obj = schoolEntityManager.createNativeQuery("select count(id) from sys_dict").getSingleResult();
            if (null==obj) {
                return false;
            }
            return true;
        } catch (Exception e) {
            log.info("Test Dict not exists", e);
            return false;
        }
    }
    
    /**
     * 刷新数据
     */
    @Transactional(readOnly = false, isolation = Isolation.DEFAULT, propagation = Propagation.REQUIRED, rollbackFor = {Exception.class}, timeout = 1800)
    public void refreshData() {
        TransactionTemplate tmpl = new TransactionTemplate(txManager);
        tmpl.execute(new TransactionCallbackWithoutResult() {
            @Override
            protected void doInTransactionWithoutResult(TransactionStatus status) {

                for (String key : KEYS) {
                    String d = (String) schoolEntityManager.createNativeQuery("select dict_value from sys_dict where dict_key=:key and dict_type=:type").setParameter("key", key)
                            .setParameter("type", key).setMaxResults(1).getSingleResult();
                    if (StringUtils.isNotBlank(d)) {
                        try {
                            values.put(key, Float.parseFloat(d));
                        } catch (Exception e) {
                            log.warn("Dict "+key +" is not float ",e);
                        }
                    } else {
                        Dict dict = new Dict();
                        dict.setKey(key);
                        dict.setType(key);
                        String value = "";
                        if (KEYS[0].equals(key)) {
                            value = "0.9";
                        } else if (KEYS[1].equals(key)) {
                            value = "0.1";
                        } else if (KEYS[2].equals(key)) {
                            value = "0.9";
                        } else if (KEYS[3].equals(key)) {
                            value = "0.1";
                        }
                        dict.setValue(value);
                        String jpql = "insert into sys_dict(dict_key, dict_type, dict_value,flag) values('"+key+"','"+key+"','"+value+"',0)";
                        try {
                            Query query = schoolEntityManager.createNativeQuery(jpql);
                            query.executeUpdate();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                        values.put(key, Float.parseFloat(value));
                    }
                }
            }
        });
        
    }
    
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值