我的Spring批處理作業每5分鐘啓動一次 - 基本上它讀取一個字符串,將該字符串用作sql查詢中的參數,並打印出結果sql結果列表。主要是它似乎是確定運行,但我發現在我的日誌零星錯誤每隔5-10運行Spring批處理無法打開JPA EntityManager進行事務處理;嵌套異常是java.lang.IllegalStateException:事務已經激活
2017-05-05 11:13:26.101 INFO 9572 --- [nio-8081-exec-8] c.u.r.s.AgentCollectorServiceImpl : Could not open JPA E
ntityManager for transaction; nested exception is java.lang.IllegalStateException: Transaction already active
我的工作是從我AgentCollectorServiceImpl類開始像
@Override
public void addReportIds(List<Integer> reportIds) {
try {
.toJobParameters();
jobLauncher.run(job, jobParameters);
} catch (Exception e) {
log.info(e.getMessage());
}
}
我BatchConfig類看起來像
@Configuration
@EnableBatchProcessing
@Import(AppConfig.class)
public class BatchConfig {
@Autowired
private JobBuilderFactory jobBuilderFactory;
@Autowired
private StepBuilderFactory stepBuilderFactory;
@Autowired
private AppConfig appConfig;
@Bean
public Reader reader() {
return new Reader();
}
@Bean
public Processor processor() {
return new Processor();
}
@Bean
public Writer writer() {
return new Writer();
}
@Bean
public Job job() {
return jobBuilderFactory.get("job")
.incrementer(new RunIdIncrementer())
.flow(step1())
.end()
.build();
}
@Bean
public Step step1() {
return stepBuilderFactory.get("step1")
.<String, String> chunk(1)
.reader(reader())
.processor(processor())
.writer(writer())
.build();
}
}
我的AppConfig類是什麼樣子
@Configuration
@PropertySource("classpath:application.properties")
@ComponentScan
public class AppConfig {
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(organizationDataSource());
em.setPackagesToScan(new String[]{"com.organization.agentcollector.model"});
JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
em.setJpaVendorAdapter(vendorAdapter);
em.setJpaProperties(additionalProperties());
return em;
}
Properties additionalProperties() {
Properties properties = new Properties();
properties.setProperty("hibernate.dialect", "com.organization.agentcollector.config.SQLServerDialectOverrider");
return properties;
}
@Bean
JpaTransactionManager transactionManager(final EntityManagerFactory emf) {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(entityManagerFactory().getObject());
return transactionManager;
}
我的處理器類是什麼樣子
public class Processor implements ItemProcessor<String, String> {
private final Logger log = LoggerFactory.getLogger(Processor.class);
@Autowired
EventReportsDAOImpl eventReportsDAOImpl;
@Override
public String process(String reportIdsJson) throws Exception {
String eventReportsJson = eventReportsDAOImpl.listEventReportsInJsonRequest(reportIdsJson);
//System.out.println(returnContent+"PROCESSOR");
return eventReportsJson;
}
}
我DAOImpl類是什麼樣子
@Component
@Transactional
public class EventReportsDAOImpl implements EventReportsDAO {
@PersistenceContext
private EntityManager em;
@Override
public EventReports getEventReports(Integer reportId) {
return null;
}
@Override
public String listEventReportsInJsonRequest(String reportIds) {
System.out.println("Event Report reportIds processing");
ArrayList<EventReports> erArr = new ArrayList<EventReports>();
String reportIdsList = reportIds.substring(1, reportIds.length() - 1);
//System.out.println(reportIdsList);
try {
StoredProcedureQuery q = em.createStoredProcedureQuery("sp_get_event_reports", "eventReportsResult");
q.registerStoredProcedureParameter("reportIds", String.class, ParameterMode.IN);
q.setParameter("reportIds", reportIdsList);
boolean isResultSet = q.execute();
erArr = (ArrayList<EventReports>) q.getResultList();
} catch (Exception e) {
System.out.println("No event reports found for list " + reportIdsList);
}
return erArr.toString();
}
我以爲春天會自動管理事務。該錯誤似乎表明交易未被正確關閉?
我試過的一件事是從我的代碼中刪除所有@Transactional註釋,因爲我讀了@EnableBatchProcessing已經注入到每個步驟的事務管理器 - 但是當我這樣做時,我更頻繁地看到'transaction already active'錯誤。
有關如何解決此問題的任何建議讚賞,謝謝!
錯誤出現在'c.u.r.s.AgentCollectorServiceImpl'中,但沒有提供源代碼。另外,請考慮一個最小的,可驗證的例子。當你得到這些,你可能已經解決了這個問題。 –
@KarlNicholas顯示如何啓動作業的第一個代碼塊來自AgentCollectorServiceImpl。我編輯了我的問題來表明這一點。 – user619804
@KarlNicholas - 這是基本的工作代碼 - 我只是看到這個事務已經存在每5-10次出錯一次 – user619804