参考: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));
}
}
}
});
}
}