Я пытаюсь использовать Spring Batch в режиме JSR 352 в Websphere. (Websphere 8.0, Spring Batch 3.0.1)JSR 352 Spring Batch: Управление транзакциями
Насколько я понимаю документацию, весна должна обрабатывать транзакции, то есть начинать транзакцию до вызова ItemReader шага, совершая транзакции после вызова ItemWriter и т. Д.
Однако в моем случае никакая транзакция не активна при вызове ItemReader (userTransaction.getStatus() == 6). Мой код работает, если я начинаю транзакцию самостоятельно в itemReader, но я понимаю, что мне не нужно это делать.
Я подозреваю, что проблема в том, как я настроил свою партию.
Это образец кода, который показывает проблему:
META_INF/batch.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<tx:jta-transaction-manager />
</beans>
META-INF/пакетного задания/samplebatch3.xml:
<?xml version="1.0" encoding="UTF-8"?>
<job version="1.0"
id="samplebatch3"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/jobXML_1_0.xsd">
<step id="step1">
<chunk checkpoint-policy="item"
item-count="5">
<reader ref="my.jbatchtest.samplebatch3.SampleReader" />
<processor ref="my.jbatchtest.samplebatch3.SampleProcessor"/>
<writer ref="my.jbatchtest.samplebatch3.SampleWriter" />
</chunk>
</step>
</job>
ItemReader:
package my.jbatchtest.samplebatch3;
import java.io.Serializable;
import javax.batch.api.chunk.ItemReader;
import javax.naming.InitialContext;
import javax.transaction.UserTransaction;
import org.xadisk.connector.outbound.XADiskConnectionFactory;
public class SampleReader implements ItemReader {
private UserTransaction utx;
public SampleReader() {
// TODO Auto-generated constructor stub
}
@Override
public void open(Serializable checkpoint) throws Exception {
utx = (UserTransaction) new InitialContext().lookup("jta/usertransaction");
System.out.println("Status before begin:"+utx.getStatus());
utx.begin();
System.out.println("Status after begin:"+utx.getStatus());
}
@Override
public void close() throws Exception {
// TODO Auto-generated method stub
}
@Override
public Object readItem() throws Exception {
// TODO Auto-generated method stub
return null;
}
@Override
public Serializable checkpointInfo() throws Exception {
// TODO Auto-generated method stub
return null;
}
}
Отладочный вывод из ItemReader:
[07.10.14 12:52:48:881 CEST] 00000039 SystemOut O Status before begin:6
[07.10.14 12:52:48:881 CEST] 00000039 SystemOut O Status after begin:0
Мои вопросы:
- я понимаю правильно, что весной партия должна управлять сделками?
- то почему он этого не делает?
Благодарим вас за информацию. Наше намерение состояло в том, чтобы использовать SpringBatch в среде JEE, которая еще не поддерживает JSR-352 (WAS 8.0), и переключиться на собственную реализацию JSR-352 после реализации JEE 7. В этой среде мы не используем других функций Spring и не планируем. (не мое решение ...) Это не проект для создания продуктивного кода, а скорее шаблон и инструкции для других проектов в корпорации. Ваша информация, безусловно, поможет нашему решению о том, как действовать. –