2014-10-07 2 views
0

Я пытаюсь использовать 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 

Мои вопросы:

  1. я понимаю правильно, что весной партия должна управлять сделками?
  2. то почему он этого не делает?

ответ

4

Позвольте мне перезвон в на некоторые из вопросов, выносимых здесь. Полное раскрытие, я в настоящее время ведущий проект для Spring Batch, и я тоже был в группе экспертов JSR-352.

Что такое статус Spring Batch и JSR-352
Spring Batch с версии 3.0.0 является JSR-352 соответствует всем требованиям SE. Требования JSR-352 разбиты на группы SE и EE. Мы не обращались ни к одной из функций EE, как указано в спецификации, которые отличаются от «нормальной» обработки Spring Batch.

Почему в Spring Batch не реализованы специальные функции EE?
Мы пошли по пути только реализации требований SE по одной простой причине. Это единственные требования, которые мы можем проверить, соответствуют спецификации через доступный TCK. Единственный способ проверки специфических требований EE заключается в том, чтобы запустить TCK как часть сертификации сервера приложений (Oracle CTS), который Spring Batch, очевидно, не является частью и не имеет доступа (при условии, что он должен быть лицензирован) ,

Мы запросили версию TCK, что мы можем проверить особенности ЭЭ против и по состоянию на сегодняшний день, ответ, который мы получили был "In opening up the TCK for public contributions on GitHub, this is certainly an enhancement we'd be happy to accept help with."

Как и любые хорошие разработчики, мы не хотим, чтобы разрабатывать новые функции без испытаний. Мы хотим, чтобы иметь возможность проверить, что мы реализовали, соответствует требованиям. В этом случае этот шаг проверки заключается в выполнении TCK против нашего кода, чего мы не можем сделать в это время. Невозможность выполнить TCK ставит нас под угрозу реализации функций EE в том, как мы «думаем» правильно, освобождая их, а затем вынуждены менять свое поведение позже, если/когда TCK может быть запущен, что прямо противоречит к мобильности, которую JCP пытается обеспечить.

А как насчет BATCH-2240?
в настоящее время стоит не запрос о том, как ведет себя реализация Spring Batch JSR-352. Напротив, он запрашивает поведение обертывания методов ItemStream#open() и ItemStream#close() в транзакциях, которые могут повлиять только на обычную обработку Spring Spring. Фиксация BATCH-2240 не будет напрямую касаться того, как ведет себя JSR-352 Spring Batch. Он отмечен как незначительное улучшение, поскольку он не рассматривается как ошибка в нашей реализации JSR-352, и рассматривается как дополнительная функция для нашей регулярной пакетной обработки Spring.

Чтобы ответить на оригинальные вопросы
1. ли мое понимание правильно, что весной партия должна управлять сделками? - Да, ваше понимание верное. Spring Batch обрабатывает транзакции. С помощью шага на основе, методы open и close вызываются за пределами транзакции, позволяющей сбросить состояние исполняющего компонента. В Spring Batch нет ничего, что помешало бы вам обернуть ваш код в транзакции, используя TransactionTemplate, чтобы получить аналогичную функциональность.
2. Тогда почему он этого не делает? - Я надеюсь, что вышеуказанные вопросы касаются этого вопроса.

Заключение
Мы хотим решить конкретную ЭЭ особенность JSR-352, как только у нас есть способ, чтобы подтвердить, что мы обращались к ним таким образом, что гарантирует портативность, что JCP пытается достичь. Мы считаем, что правильный способ сделать это - иметь стандартизованный TCK, который мы можем запустить. Как только это будет рассмотрено, приоритет будет иметь отношение к различиям между версией EE спецификации и Spring Batch.

+0

Благодарим вас за информацию. Наше намерение состояло в том, чтобы использовать SpringBatch в среде JEE, которая еще не поддерживает JSR-352 (WAS 8.0), и переключиться на собственную реализацию JSR-352 после реализации JEE 7. В этой среде мы не используем других функций Spring и не планируем. (не мое решение ...) Это не проект для создания продуктивного кода, а скорее шаблон и инструкции для других проектов в корпорации. Ваша информация, безусловно, поможет нашему решению о том, как действовать. –

0

После прочтения и перехода по весеннему пакетному коду и чтения спецификаций JSR 352, я думаю, что это может быть ошибка весенней партии.

Мне не нравятся проблемы с обвинениями в проверенных библиотеках, таких как весна, поэтому я все еще могу ошибаться. Вот что я нашел:

Весна вызывает метод чтения() читателя и писателя, а затем выполняет основной пакетный цикл чтения, обработки и записи. После завершения цикла, close() вызывается для чтения и записи.

Проблема заключается в том, что весенняя партия запускает основной цикл партии внутри контекста транзакции. Он не запускает транзакцию для вызовов open() и close().

Согласно спецификациям, эти вызовы должны запускаться в их собственной транзакции. Это относится к спецификациям JSR 352:

11.6 Regular Chunk Processing 

1. <Create StepContext> 
2. <Store step level properties in StepContext> 
3. <->[StepListener.beforeStep...] // thread A 
4. [<begin transaction> ] 
5. <->ItemReader.open // thread A 
6. <->ItemWriter.open // thread A 
7. [<commit transaction> ] 
8. // chunk processing: 
9. <repeat until no more items> { 
    a. <begin checkpoint [<begin transaction> ]> 
    b. <repeat until commit criteria reached> { 
     i. <->ItemReader.readItem // thread A 
     ii. <->ItemProcessor.processItem // thread A 
     iii. <add item to buffer> 
    c. } 
    d. <->ItemWriter.writeItems // thread A 
    e. <->[ItemReader.checkpointInfo] // thread A 
    f. <->[ItemWriter.checkpointInfo] // thread A 
    g. <Store StepContext persistent area> 
    h. 
    i. <commit checkpoint (commit transaction)> 
10. } 
11. [<begin transaction> ] 
12. <->ItemWriter.close // thread A 
13. <->ItemReader.close // thread A 
14. [<commit transaction> ] 
15. <->[StepListener.afterStep...] // thread A 
16. <Store StepContext persistent area> 
17. <Destroy StepContext> 

Линии 4, 7, 11 и 14 никогда не случаются в весенней партии.

Я вижу это поведение в своем коде (нет открытых транзакций в open() и close()), и это также отражается в весеннем пакетном коде: очевидная транзакционная скобка для основного цикла, код транзакции для open() и close())

Я не нашел способ опубликовать ошибку на сайте spring.io, просто ссылку на stackoverflow.com.Может быть, кто-то из пружинной команды будут видеть это и дать обратную связь (или, по крайней мере передать это на разработчиков)

Upate: Это, кажется, известная проблема: https://jira.spring.io/browse/BATCH-2240 Обозначение спецификации, кажется, указывают что начало транзакции здесь необязательно, что делает кодирование чтения и записи затруднительным, поскольку я должен проверить, есть ли у меня действительная транзакция, и создать свою собственную транзакционную скобку.

+0

Если вы считаете, что есть ошибка, зарегистрируйте ошибку [JIRA] (http://jira.spring.io). Spring Batch тестируется на Spring Batch TCK (afaik), поэтому, если это будет проблемой, возможно, он уже появился. –

+0

@ M.Deinum Спасибо за ссылку. Кажется, это действительно известная проблема: https://jira.spring.io/browse/BATCH-2240. Хотя я должен сказать, что я категорически не согласен с приоритетом и типом проблемы: исправление для явного нарушения спецификаций не является «незначительным улучшением». Если мне нужно создать код вокруг проблемы, мой код станет несовместимым со стандартными реализациями. –

+0

ОК, обозначения спецификаций, похоже, делают это необязательным, что делает классификацию в порядке. –

1

На ваш samplebatch3.xml вам нужно объявить тасклет между тегами шага и куска, а в теге таска, вы поместите ссылку на диспетчер транзакций Spring Batch, иначе он не узнает, какой менеджер транзакций использовать. Смотрите раздел 5.1.1 на этой странице:

http://docs.spring.io/spring-batch/trunk/reference/html/configureStep.html

Отредактировано: извините, я забыл использовать JSR-352 вместо обычного Спринг партии, см по ссылке ниже, она определяет некоторые настройки, которые необходимо передать в рамки, один из них является менеджер транзакций

http://docs.spring.io/spring-batch/trunk/reference/html/jsr-352.html

И по этой статье, There'sa пример настройки:

https://blog.codecentric.de/en/2014/08/writing-jsr-352-style-jobs-spring-batch-part-1-configuration-options/

Смотри раздел «Как настроить стандартную конфигурацию»

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