постоянство в потоке - PullRequest
       3

постоянство в потоке

0 голосов
/ 09 сентября 2011

Я реализовал небольшое веб-приложение с Spring 3.0, Spring-Webflow 2.3, ZK 5.0.7, Zkspring 3.0 и Hibernate.

Один из потоков показывает панель задач (zk-borderlayout) с панелями на ней, представляющими задачи.Если пользователь добавляет новую задачу, я запускаю новый подпоток с управляемостью потока.Новая задача сохраняется в конце потока.Все работает отлично.

Кроме того, пользователь может перетаскивать панель на панели задач, чтобы изменить статус («не стартед», «выполняется» ...) задачи.Новый статус задачи должен сохраняться в указанном потоке, а не в конце.Я реализовал эту функциональность, вызвав специальный метод обновления DAO (см. Ниже) в слушателе onDrop компонента.Это также хорошо работает.

    public void updateNow(Task task) {
    EntityManager em = getJpaTemplate().getEntityManagerFactory().createEntityManager();
    EntityTransaction tx = em.getTransaction();
    tx.begin();
    em.merge(task);
    tx.commit();
}

Я прочитал эту статью об упорстве, управляемом потоком, и спрашиваю себя, является ли это правильным способом сохранения изменений до моего потока.

Есть предложения?

Ответы [ 2 ]

1 голос
/ 16 апреля 2012

Это решение разработчика о «атомарном» или «неатомарном» веб-потоке.Для атомарного веб-потока объявите @Transactional(readOnly = true) для всех методов действия в потоке и примените <end-state commit="true"/> в конце потока.Для неатомарного веб-потока применение @Transactional(readOnly = false) фиксирует транзакцию прямо в конце аннотированного метода.Нет необходимости запускать управляемую пользователем транзакцию.

1 голос
/ 26 сентября 2011

Согласно вашей ссылочной статье ( Постоянное управление потоком в Spring Web Flow 2 ), фиксируйте транзакцию до того, как конец веб-потока принадлежит категории «Неатомарный поток». Реализация «Атомного потока» или «Неатомного потока» зависит от вашего варианта использования. Так это зависит от вашего основного потока должен быть "атомным" или нет? Если в вашем случае это атомарно, вы должны сохранять задачи и фиксировать их в конце веб-потока. Как и статус задачи, я думаю, что переменные flowcope могут удовлетворить ваши требования. Если это НЕ аотмично, то вы наверняка сможете зафиксировать его до конца потока. Вы по-прежнему можете использовать управляемый потоком контекст для сохранения вашей новой задачи. Просто установите свой метод с помощью @Transactional (readOnly = true), который описан в «Неатомарном веб-потоке» в «Сохранении управляемых потоков в Spring Web Flow 2».

@Transactional(readOnly = false)
    public Booking createBooking(Long hotelId, String username) {
        Hotel hotel = em.find(Hotel.class, hotelId);
        User user = findUser(username);
        Booking booking = new Booking(hotel, user);
        em.persist(booking);
        return booking;
}
...