2011-09-05 5 views
2

mynamespace.myproduct :Products.CMFCore.interfaces.IActionSucceededEvent가 실행되는 동안 상승을 수행하면 워크 플로에 대한 ZODB 트랜잭션이 중단됩니까?

 <subscriber for="..interfaces.myinterface.IMyInterface 
        Products.CMFCore.interfaces.IActionSucceededEvent" 
      handler=".handlers.actionSucceeded" 
    /> 

mynamespace.myproduct2 :

 <subscriber for="..interfaces.myinterface.IMyInterface 
        Products.CMFCore.interfaces.IActionSucceededEvent" 
      handler=".handlers.actionSucceeded" 
    /> 

(핸들러는 각 제품마다 동일한 이름을 사용하더라도 서로 다른 작업을 수행합니다. 이 예제)

사용자 지정 워크 플로가있는 사용자 지정 형식이 있습니다. doActionFor를 사용하여 파이썬에서 워크 플로를 전환하고 IActionSucceededEvent가 실행될 때 여러 가지 작업을 수행 할 것입니다.

내 질문 : 오류가 발생하면 .handlers.actionSucceeded 중 하나에 대한 예외를 발생 시키면 doActionFor 호출을 되돌릴 수 있습니까? 그렇지 않다면 IActionWillBeInvokedEvent를 사용하면 목표를 달성 할 수 있습니까? 동일한 ..interfaces.myinterface.IMyInterface 인터페이스에 대해 Products.CMFCore.interfaces.IActionSucceededEvent을 사용하는 두 가지 제품에 대한 문제가 있습니까?

답변

4
  1. 예, 전체 트랜잭션이 실패하여 핸들러 중 하나에 예외를 제기하며
  2. 아니, 당신은 같은 인터페이스에 대한 하나 명 이상의 가입자를 사용하는 데 문제가 없을 것 복귀 될 경우 . 그들은 등록 순서대로 실행됩니다.
  3. 아니요, IActionWillBeInvokedEvent를 사용하면 도움이되지 않습니다. 전환 이전에 해고되었지만 예외를 발생 시키면 어쨌든 트랜잭션이 실패합니다.
3

Plone 디버그 레벨을 DEBUG (기본값은 info)로 설정하고 로깅 출력을 이벤트 처리기에 넣음으로써이를 확인할 수 있습니다. DEBUG 로깅에서 Plone은 트랜잭션 경계를 인쇄합니다.

예외가 발생할 때 "505 내부 서버 오류"가 발생하면 transaction.commit()이 수동으로 호출되지 않는 한 진행중인 트랜잭션도 언 롤링되지만 일반 코드의 경우는 예외가됩니다).

+0

디버그 로깅에 대한 흥미, 내가 년후 : 그래서 당신의 가장 좋은 방법은 당신이 용납하고 가입자, log the exception에 그 예외를 포착하고 있으므로 트랜잭션이 여전히 최선을 다하고됩니다에 이동하려는 어떤 오류를 발견하는 것입니다 트랜잭션 경계를 인식하지 못합니다. 나는 이벤트 핸들러에서'raise '를 호출하는 testet을 호출하고 실제로 트랜잭션이 중단되었지만, 나는 정말로 hackish하고 잘못된 것을하고있는 것이 두려웠다. : / –

3

@ Giacomo의 응답에 따라 잡히지 않은 모든 예외에 대해 트랜잭션이 중단됩니다.

import logging 
logger = logging.getLogger('mynamespace.myproduct') 
... 
def actionSucceeded(obj, event): 
    ... 
    try: 
     my_dangerous_stuff(...) 
    except (TolerableException, AnotherTolerableException, ...): 
     logger.exception('Encountered an error while handling foo event') 
    ... 
관련 문제