2016-03-16 2 views
0

Я разработал приложение SpringBatch и развернуто как веб-приложение в контейнере профиля Websphere Liberty. Пакетная программа предназначена для чтения записей из таблицы и вызова службы HTTP. На основе ответа службы столбец с именем status обновляется как тип RECORD_SENT/COMPLETE/ERROR.Сопоставление объекта JPA с несколькими сущностямиManagers с программой SpringBatch

Цель состоит в том, чтобы повторно использовать одну и ту же программу для нескольких источников данных. Источник данных передается в параметре задания с использованием типа клиента. Источники данных находятся в разных схемах, но имеют одинаковые данные.

Вопрос: Как менеджер транзакций может применяться во время выполнения внутри шага задания или Tasklet ?. Ищет помощь в этом отношении.

Конфигурация:

<bean id="entityManagerFactory1" 
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
<property name="dataSource" ref="dataSource1" /> 
<property name="persistenceUnitName" value="user" /> 
<property name="jpaVendorAdapter"> 
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
<property name="showSql" value="false" /> 
</bean> 
</property> 
<property name="jpaDialect"> 
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" /> 
</property> 
</bean> 
<bean id="entityManagerFactory2" 
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
<property name="dataSource" ref="dataSource2" /> 
<property name="persistenceUnitName" value="user" /> 
<property name="jpaVendorAdapter"> 
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
<property name="showSql" value="false" /> 
</bean> 
</property> 
<property name="jpaDialect"> 
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" /> 
</property> 
</bean> 
<bean id="entityManagerSelector" class="*com.spring.jpa.test.EntitymanagerSelector"> 
<property name="entityManagerFactory1" ref="entityManagerFactory1"></property> 
<property name="entityManagerFactory2" ref="entityManagerFactory2"></property> 
</bean> 

job.xml snippet 

<bean id="itemReader" class="org.springframework.batch.item.database.JpaPagingItemReader" scope="step"> 
<property name="entityManagerFactory" value="#{entityManagerSelector.getEntitymanagerForClient({jobParameters['client']})}" /> 
<property name="queryString" value="select u from User u where u.age > #{jobParameters['age']}" /> 
</bean> 

Настройка параметров задания во время выполнения для идентификации клиента

JobParameters param = new JobParametersBuilder() 
.addString("age", "20").addString("client", "client2") 
.toJobParameters(); 
JobExecution execution = jobLauncher.run(job, param); 

ответ

0

Это не будет возможно для Вас, чтобы установить транзакции-менеджеру Шаг/тасклет во время выполнения , Вам будет лучше создать отдельный Job для каждого клиента и использовать собственный диспетчер транзакций в таске.

<bean id="transactionManager1" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="entityManagerFactory1" /> 
</bean> 
<bean id="transactionManager2" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="entityManagerFactory2" /> 
</bean> 

Теперь использовать этот менеджер транзакций при создании пакетного Иова

<job id="testJob1" xmlns="http://www.springframework.org/schema/batch"> 
    <step id="client1step1"> 
     <tasklet transaction-manager="transactionManager1"> 
      <chunk reader="itemReader" writer="itemWriter" commit-interval="1" /> 
     </tasklet> 
    </step> 
</job> 
<job id="testJob2" xmlns="http://www.springframework.org/schema/batch"> 
    <step id="client2step2"> 
     <tasklet transaction-manager="transactionManager2"> 
      <chunk reader="itemReader" writer="itemWriter" commit-interval="1" /> 
     </tasklet> 
    </step> 
</job> 

Позволь мне знать, если это работает.

+0

Большое спасибо Rajan V. Решение, предоставленное вами, сработало. – Narasi

Смежные вопросы