由于需要从一个远程机器取数据。处理后保存到本地数据库处理。用 wildfly datasource 会报:
[com.arjuna.ats.arjuna] (default task-6) ARJUNA012140: Adding multiple last resources is disallowed. Trying to add LastResourceRecord(XAOnePhaseResource(LocalXAResourceImpl@7f19c56d[connectionListener=1......
这主要是jpa里面的的事物,只允许一个datasource连接。
采用xa-datasource即可。
另一种方案是在主控程序中禁止事务。将数据库的操作写在其他类中,使用事务。即只有要修改的操作才需要事务。
更一步,可以在远程取数据的类中,也是不需要事务的。这样就可以inject 需要使用事务的类。
主控类:
package com.italktv.iof.service; import java.util.List; import java.util.logging.Logger; import javax.annotation.Resource; import javax.ejb.Schedule; import javax.ejb.Stateless; import javax.ejb.Timer; import javax.ejb.TimerService; import javax.ejb.TransactionAttribute; import javax.ejb.TransactionManagement; import javax.inject.Inject; import com.italktv.iof.entity.AccountInfoSync; @Stateless @TransactionManagement(javax.ejb.TransactionManagementType.CONTAINER) @TransactionAttribute(javax.ejb.TransactionAttributeType.NEVER) public class SyncTableTimer { @Inject private Logger logger; @Resource private TimerService timerService; @Inject IOFDbUtil iof; @Inject private MySqlUtil mysql; // @Schedule(hour = "6", minute = "0", second = "0", persistent = false ,info = "6点执行 ") @Schedule(hour = "*", minute = "*/1", second = "0", persistent = false, info = " ") public void automaticCustomer() { logger.info("=== job " + " started ===="); doTask(); logger.info("=== job end ===="); } private void cancelTimers() { for (Timer timer : timerService.getTimers()) { // timer.cancel(); } } private void doTask() { List<AccountInfoSync> list; list = iof.getList(); while (list.size() > 0) { logger.info(" list.size=" + list.size()); mysql.saveList(list); list = iof.getList(); } } }