Spring 3.0 TransactionProxyFactoryBean preInterceptors AfterReturningAdvice не работает - PullRequest
2 голосов
/ 13 сентября 2011

У меня есть требование регистрировать бизнес-операции, которые также могут быть сопоставлены с сгенерированными данными контрольного журнала.Я использую Hibernate envers в качестве механизма контрольного журнала.

Я реализовал журнал операций следующим образом:

  1. У меня есть классы обслуживания, которые проксируются с использованием конкретных классов (с использованием CGLIB) и расширяются.TransactionProxyFactoryBean.Это то, что обеспечивает аспект транзакции.
  2. Мой метод либо имеет базовый объект, переносящий данные активности в качестве типа возврата или аргумента службы.
  3. Предполагается, что при применении предварительного-интерцептор на TransactionProxyFactoryBean ;его AfterReturningAdvice метод должен быть вызван после завершения транзакции.

Согласно моему пониманию, пре- и пост-перехватчики для TransactionProxyFactoryBean должны вести себя следующим образом на основепри допущении, что перехватчики добавляются в стек.

  1. Предварительные перехватчики перед выполнением метода рекомендации
  2. Spring запускает транзакцию
  3. Пост-перехватчики передвыполняется метод рекомендации
  4. основной метод обслуживания выполняется
  5. после перехватчиков после возврата метод рекомендации запускается
  6. Spring фиксирует транзакцию
  7. предварительные перехватчики послеметод возврата рекомендаций запускается

Однако, когда я отладил приложение, я обнаружил, что метод пре-перехватчика после возврата рекомендаций запускается до совершения транзакции .

Может кто-нибудь подсказать, что я делаю не так?

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

<bean id="fqngTransactionManager"
          class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory">
            <ref local="sessionFactory"/>
        </property>
    </bean>

    <bean id="fqngTxProxyTemplate" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
        <property name="transactionManager"><ref local="fqngTransactionManager"/></property>
        <property name="transactionAttributes">
              <props>
                  <prop key="save*">PROPAGATION_REQUIRED</prop>
                  <prop key="delete*">PROPAGATION_REQUIRED</prop>
                  <prop key="update*">PROPAGATION_REQUIRED</prop>
                  <prop key="process*">PROPAGATION_REQUIRED</prop>
                  <prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
              </props>
        </property>
    </bean>

           <bean id="activityLogInterceptor"
        class="com.fuelquest.mothra.activitylogs.interceptors.ActivityLogInterceptor">
        <property name="activityLogPostingService">
            <ref bean="activityLogPostingService" />
        </property>
        <property name="methodList">
            <list>
                <value>save*</value>
                <value>execute*</value>
                <value>calculate*</value>
            </list>
        </property>
    </bean>

Файл перехватчика активности Java Определение

public class ActivityLogInterceptor implements AfterReturningAdvice {

    private static final Logger logger = Logger
            .getLogger(ActivityLogInterceptor.class);

    private ActivityLogPostingService activityLogPostingService;
    private List<String> methodList;

    @SuppressWarnings("rawtypes")
    @Override
    public void afterReturning(Object returnValue, Method method,
            Object[] methodParams, Object target) throws Throwable {
        // If return type is ActivityLoggingBaseVO
        if (isLoggedMethod(method.getName())) {
.......................

Конфигурация службы

<bean id="inventoryControlRuleService" parent="fqngTxProxyTemplate">
            <property name="target">
                <bean
                    class="com.fuelquest.mothra.inventorycontrol.service.impl.InventoryControlRuleServiceImpl">
                    <property name="assetService">
                        <ref bean="assetService" />
                    </property>             
                    <property name="pointOfSaleService">
                        <ref bean="pointOfSaleService" />
                    </property>
                    <property name="inventoryService">
                        <ref bean="inventoryService" />
                    </property>
                    <property name="deliveryService">
                        <ref bean="deliveryService" />
                    </property> 
                    <property name="languageCdDao">
                        <ref bean="languageCdDao" />
                    </property>
                    <property name="inventoryBizRulesDao">
                        <ref bean="inventoryBizRulesDao" />
                    </property>
                    <property name="bizRulesResultsDao">
                        <ref bean="bizRulesResultsDao" />
                    </property>
                    <property name="ruleEngineService">
                        <ref bean="ruleEngineService" />
                    </property>
                    <property name="icRuleCalculationDataDao">
                        <ref bean="icRuleCalculationDataDao" />
                    </property>
                    <property name="inventoryControlService">
                        <ref bean="inventoryControlService" />
                    </property>
                    <property name="fqngESBMessagePoster">
                        <ref bean="fqngESBMessagePoster" />
                    </property>
                    <property name="droolsRuleTemplateService">
                        <ref bean="droolsRuleTemplateService" />
                    </property>
                    <property name="uomsDao">
                        <ref bean="uomDao" />
                    </property>
                </bean>
            </property>
            <property name="transactionAttributes">
                <props>
                    <prop key="calculate*">PROPAGATION_REQUIRED,-Exception</prop>
                    <prop key="execute*">PROPAGATION_REQUIRED,-Exception</prop>
                    <prop key="update*">PROPAGATION_REQUIRED,-Exception</prop>
                    <prop key="f*">PROPAGATION_REQUIRED,readOnly</prop>
                    <prop key="*">PROPAGATION_SUPPORTS</prop>
                </props>
            </property>     
            <property name="preInterceptors">
                <list>
                    <ref bean="activityLogInterceptor"/>
                </list>
            </property>
        </bean>

Ответы [ 2 ]

1 голос
/ 31 октября 2011

Мы используем Spring OpenSessionInViewFilter для совместного использования одного и того же сеанса Hibernate через запрос потока HTTP, который поступает на сервер приложений / веб-сервера из GWT.

Мы также требуем, чтобы сеансы Hibernate были доступны для заданий cron, запускаемых с помощью планировщика Quartz. Эти потоки не могут использовать сеанс Hibernate, доступный через OpenSessionInViewFilter и прокси-сервер TransactionProxyFactoryBean, который мы используем для прокси-транзакций. Следовательно, нам нужно было использовать дополнительный org.springframework.aop.framework.autoproxy.BeanNa meAutoProxyCreator, чтобы проксировать сервис опроса и правила SV, чтобы их можно было вызывать из планировщика Quartz.

Потому что теперь у нас было 2 транзакционных прокси для одного и того же компонента; Функциональность Spring, например наличие предварительного перехватчика и т. Д., Не работала должным образом, поскольку перехватчик был применен к прокси-серверу, созданному с BeanNameAutoProxyCreator и НЕ TransactionProxyFactoryBean .

Решение состояло в том, чтобы перейти к транзакциям Spring 2.x с использованием пространства имен AOP и TX, в результате чего был создан один прокси-сервер, который использовался как OpenSessionInViewFilter, так и планировщиком Quartz.

0 голосов
/ 26 октября 2011

Ваше понимание совпадает с моим.

Поможет ли переключение на совет Around (MethodInterceptor) для ActivityLogInterceptor?Если это решит проблему, вы можете сообщить об ошибке.

...