由于需要从一个远程机器取数据。处理后保存到本地数据库处理。用 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();
        }
    }
}
View Code

相关文章: