locked
Alguém conhece um pattern ou uma boa prática para tratar exceções em situações com atividade Receive and SendReply usando WF 4.0 ? RRS feed

  • Pergunta

  • Alguém conhece um pattern ou uma boa prática para tratar exceções em situações com atividade Receive and SendReply usando WF 4.0 ?

    Eu necessito executar uma CustomCodeActivity, contudo ela pode causar uma exceção pois está usando recursos de banco de dados ou enviando e-mail, por exemplo.

    No meu caso, minha atividade não pode lançar uma exceção e parar o workflow, pois sua instancia seria perdida e as atividades já executadas seriam impactadas. Eu não quero ter de iniciar uma nova instância do Workflow por um erro ocorrido.

    Para resolver o problema eu pensei em fazer o tratamento dentro do código da CustomCodeActivity e para isto criei uma OutArgument to retornar se uma atividade foi ou não executada. Se a atividade foi executada com sucesso, o workflow deve enviar um e-mail para o administrador relatando o problema ocorrido. Não usei a atividade Try Catch pois com ela eu tenho uma dificuldade maior para executar a atividade, pois tenho que usar uma atividade de While.

    A solução descrita acima gerou um problema, pois eu necessito desenhar este fluxo para quase todas as atividades que podem lançar uma exceção, e com isto deixo o meu workflow poluído e com pouca legibilidade.

    Minas dúvidas são:

    Esta solução descrita acima é a melhor forma de resolver o problema ?

    Como eu poderia modularizar esta solução para usa-la para cada atividade exposta como serviço (Receive Activity) sem repetir o mesmo desenho para todas as atividades ? Eu tentei criar uma atividade activity.xaml com esta implementação e passar o Receive.OperationName como argumento, contudo verifiquei que o valor da OperationName não é parametrizado e portanto eu tive que replicar este desenho para todas as minhas atividades de Receive.

    Segue abaixo o desenho de uma parte do fluxo e o codigo da CustomCodeActivity.

    Image 1: Fluxo para tratar a exception permitindo executar a atividade Receive novamente.

    Image 2: Código para tratar exception na CodeActivity

    Agradeço pela ajuda.

    Cristiano Franco

     


    • Editado Cristiano Franco quinta-feira, 5 de janeiro de 2012 12:43 O texto foi postado inicialmente em inglês.
    quarta-feira, 4 de janeiro de 2012 19:51

Respostas

Todas as Respostas

  • Olá,

    Pedimos para que sejam postadas somente questões em português nos fóruns da MSDN Brasil...

    Obrigado pelo apoio...


    André Alves de Lima
    Microsoft MVP - Client App Dev
    Visite o meu site: http://www.andrealveslima.com.br
    Me siga no Twitter: @andrealveslima
    quarta-feira, 4 de janeiro de 2012 20:56
    Moderador
  • Cristiano,

    Segue alguns modelos 

    http://my-tech-talk.blogspot.com/2010/05/workflow-4-bugfest-exception-handling.html

    http://stackoverflow.com/questions/2545076/windows-workflow-foundation-4-wf4-error-handling


    Não esqueça de usar o componente </> na barra para posta seu código. Microsoft MCPD,MCTS,MCC
    quinta-feira, 5 de janeiro de 2012 12:42
  • Seilor,

    estes links não me ajudaram muito pois o meu cenário é bem diferente. Eu tenho um Workflow do tipo WCF Workflow Service hospedado em um APP Fabric e o meu Workflow é de longa duração com atividades acionadas por um humano , ou seja, é um human Workflow.  A maioria dos exemplos que vejo na internet ou na documentação do WF, trata as exceções com a atividade Try Catch e no Catch finaliza o Workflow, ainda não vi exemplos onde a exceção é capturada e o fluxo do  workflow permite que o usuário possa novamente executar atividade ou o bloco que lançou a exceção. 

    No meu cenário de aplicação o workflow leva dias ou meses para ser finalizado. Eu não poderia solicitar ao usuário que executou a primeira atividade que entre na aplicação novamente e refaça todo o processo, pois a última atividade do fluxo lançou uma exceção devido a uma indisponibilidade temporária no banco de dados e com isto workflow foi abortado.

    Eu tenho que garantir que todo fluxo seja realizado e para isto tenho que ter fluxos alternativos para todos os casos de exceção. Este desenho que fiz resolve o problema, porém o meu workflow  fica poluído. Eu gostaria de saber se há uma melhor forma de resolver este problema, um pattern para tratamento de exceções para Human Workflows de longa duração.

     Agradeço pela ajuda.

    quinta-feira, 5 de janeiro de 2012 17:45
  • Vejo 3 opções para manter seus fluxos mais limpos:

    • Fazer sua própria NativeActivity genérica para encapsular seu tratamento de erro
    • No catch da activity do seu exemplo dar um ScheduleAction para a atividade de tratamento de erros

    Para as duas acima leia:

    http://msmvps.com/blogs/theproblemsolver/archive/2010/02/09/error-handling-in-a-nativeactivity.aspx

    http://blogs.msdn.com/b/tilovell/archive/2010/01/27/basic-activity-scheduling-in-workflow-4.0.aspx


    +.+
    segunda-feira, 9 de janeiro de 2012 22:08
  • Pessoal alguém conseguiu achar uma resposta para essa pergunta ? Estou buscando uma solução desse mesmo problema já faz um bom tempo. Eu tenho uma fluxo com interação humana, no qual caso ocorra uma exception nesse fluxo, eu consigo retomar ele de onde ocorreu esse erro ? Porque como é um fluxo de longa duração não posso simplesmente começar ele do zero novamente. Por favor me ajudem.
    terça-feira, 28 de maio de 2013 18:58