¿Cuál es la mejor práctica en la aplicación de una transacción de reiniciar al estancamiento o bloqueo de tiempo de espera de las excepciones cuando se utiliza la Primavera (específicamente la Primavera enfoque recomendado: declarativos de las transacciones) ?

Gracias,

Asaf

4 Comentarios

  1. 15

    Me siento como la Primavera misma debe tener una buena respuesta a esta pregunta (en forma de documentación, al menos, o un reintento interceptor de algún tipo). Por desgracia, no.

    Probablemente la mejor manera de manejar los reintentos (si desea seguir siendo «declarativa» acerca de las cosas) es escribir su propia implementación de interceptor que va a intentar automáticamente la transacción de un número determinado de veces. Para empezar, el estudio de la Primavera TransactionInterceptor, que gestiona comenzar/deshacer/comportamiento de confirmación para declarativos de las transacciones. Si usted está usando Hibernate, nota cómo se maneja sesión de Hibernate de la unión/desunión para el Subproceso actual.

    Cosas a mirar hacia fuera para si usted está usando Hibernate:

    • Su reintento «interceptor» debe ser seguro para separar los preexistentes hilo enlazado sesión de Hibernate y volver a enlazar una nueva. Una vez que una excepción (por ejemplo, de interbloqueo) se produce desde dentro de Hibernación/JDBC código de la correspondiente sesión de Hibernate es envenenado y debe ser desechado. (session.clear() no es suficiente).
    • Tenga cuidado si el servicio transaccional uso de los métodos sesión de Hibernate objetos como parámetros del método. En reintentar, cuando se restablece su sesión de Hibernate, estos objetos se van a separar. Usted necesitará para volver a ellos si el método de servicio se supone que están conectados (por ejemplo, si utilizan perezoso cargado propiedades que accedan en el método de servicio, o si intenta guardar, etc.) En general, es mejor si usted no usar el modo de Hibernación objetos como parámetros al servicio transaccional métodos.
    • Vas a ser la aplicación de MethodInterceptor.invoke() — el MethodInvocation instancia que se le pasa a esto puede ser el estado, puede que necesite clon de él antes de usarlo en el interceptor.
  2. 8

    Recomiendo el uso de la clase org.springframework.retry.interceptor.RetryOperationsInterceptor a partir de la primavera de reintento proyecto, configurado como este:

    <aop:config>
        <aop:pointcut id="transactional" expression="execution(* com...*Service.remoteCall(..))" />
        <aop:advisor pointcut-ref="transactional" advice-ref="retryAdvice" order="-1"/>
    </aop:config>
    
    <bean id="retryAdvice" class="org.springframework.retry.interceptor.RetryOperationsInterceptor"/>

    Pero si usted todavía desea implementar por sí mismo, el ejemplo de AOP partir de la primavera de la documentación es un buen comienzo.

    • Gracias por mencionar la primavera-retry proyecto.
  3. 4

    No hay una respuesta universal, porque depende de la aplicación específica. Por ejemplo, puede que desee realizar automático de transacciones de la operación de reinicio o notificar al usuario acerca de fallos de operación y pedir explícito de reintento de confirmación, etc.

    Que haría uso de AOP en caso de reinicio automático escenario.

  4. 4

    Tenía la misma pregunta hace varios años y terminó de escribir mi propia solución como un AOP aspecto, que termina en busca de esta manera en el código:

      @RetryTransaction
      @Transactional
      public void doSomething() {
          ....
      }
    • El enlace está muerto.
    • Gracias, link actualizado.
    • Oh, wow. Muchas gracias. Definitivamente voy a tener una mirada en ella.

Dejar respuesta

Please enter your comment!
Please enter your name here