Usuário com melhor resposta
Transações no Workflow

Pergunta
-
Olá.Estou tentando usar transações no workflow através do componente Transaction Scope. Eu tenho um WF que chama outro WF, quando adicionei o Transaction Scope, recebi a seguinte mensagem de erro no componente invokeWorkflow: InvokeWorkflowActivity cannot be used inside TransactionScopeAcvity. Não é possível utilizar dessa forma? Como posso passar a transação de um WF para o outro?Obrigado.
Marcos Aguiar Jr - Brazilterça-feira, 25 de agosto de 2009 14:31
Respostas
-
Marcos boa tarde!
Imagine o seguinte cenário - Você recebe uma nova compra e abre uma transação para inserir os dados e invoca o WF para gerar as parcelas, que consegue inserir e realizar o commit. Neste momento a execução volta para o WF de Compra que ao finalizar o processo executa um rollback no WF de Compra e no WF da Parcela. A pergunta que fica é : A sua solução consegue passar por este caso? Se sim a solução que você deu funciona perfeitamente, mas se a resposta for não, você está apenas abrindo duas transações independentes. Neste caso eu tentaria utilizar o WF de Parcelas dentro de um serviço WCF, sendo invocado dentro e um escopo de transação no WF de Compra.
Abração!
Cristiano Rodrigues- Marcado como Resposta Marcos Aguiar Jr terça-feira, 8 de setembro de 2009 19:53
quinta-feira, 27 de agosto de 2009 17:09
Todas as Respostas
-
Marcos boa tarde!
Segue o link para o site da Microsoft falando sobre o InvokeWorkflowActivity :http://msdn.microsoft.com/en-us/library/ms735829.aspx
Neste site existe uma nota sobre a sua pergunta:
"An InvokeWorkflowActivity cannot be contained in a TransactionScopeActivity or a CompensatableTransactionScopeActivity. This is because a transaction cannot flow from one workflow to another. If an attempt is made to contain an InvokeWorkflowActivity inside a TransactionScopeActivity or a CompensatableTransactionScopeActivity, a validation error occurs that contains the following message: Activity 'invokeWorkflowActivity1' validation failed: InvokeWorkflowActivity cannot be used inside TransactionScopeActivity. "
Se você puder colocar o que deseja fazer, posso tentar montar uma solução para você.
Abração!
Cristiano Rodriguesquarta-feira, 26 de agosto de 2009 17:31 -
Olá Cristiano.Na verdade eu tenho WF que chama outro WF, o primeiro insere uma compra e o segundo insere o parcelamento dessa compra. Quero controlar a transação, ou seja, se der erro no WF de parcela o de compra deve executar o rollback. Estou usando o Entity Framework para fazer os insert, update e delete.Se puder ajudar.Obrigado.
Marcos Aguiar Jr - Brazilquarta-feira, 26 de agosto de 2009 19:08 -
Marcos boa noite!
Pelo que você descreveu a sua execução tem que ser síncrona, certo? Veja se é possível expor o seu WF de parcelamento dentro de um serviço WCF. Normalmente utilizamos o InvokeWorkflowActivity em processamentos assíncronos. Abaixo segue um link sobre como expor um WF em um serviço WCF.
Os serviços WCF aceitam escopos de transação. Me mande um feedback.
http://blog.newagesolution.net/2008/06/how-to-create-wf-as-wcf-service-hosted.html
Abração!
Cristiano Rodriguesquarta-feira, 26 de agosto de 2009 23:23 -
Olá Cristiano.
Não se é o correto, mas utilizando um componente Code e colocando o seguinte código
string
result = "";
wfParcela wfParcela = new wfParcela();
AutoResetEvent waitHandle = new AutoResetEvent(false);
wf.WorkflowCompleted +=
delegate(object sender, WorkflowCompletedEventArgs e)
{
result = e.OutputParameters[
"Message"].ToString();
waitHandle.Set();
};
Dictionary<string, object> parameters = new Dictionary<string, object>();
parameters.Add(
"associado", associado);
parameters.Add(
"beginTransaction", true);
WorkflowInstance instance = wf.CreateWorkflow(typeof(wfParcela), parameters);
instance.Start();
waitHandle.WaitOne();
Assim ele conseguiu chamar o outro WF e eu só precisei parar a transação por parâmetro.
O que você acha?
Obrigado.
Marcos Aguiar Jr - Brazilquinta-feira, 27 de agosto de 2009 11:49 -
Marcos boa tarde!
Imagine o seguinte cenário - Você recebe uma nova compra e abre uma transação para inserir os dados e invoca o WF para gerar as parcelas, que consegue inserir e realizar o commit. Neste momento a execução volta para o WF de Compra que ao finalizar o processo executa um rollback no WF de Compra e no WF da Parcela. A pergunta que fica é : A sua solução consegue passar por este caso? Se sim a solução que você deu funciona perfeitamente, mas se a resposta for não, você está apenas abrindo duas transações independentes. Neste caso eu tentaria utilizar o WF de Parcelas dentro de um serviço WCF, sendo invocado dentro e um escopo de transação no WF de Compra.
Abração!
Cristiano Rodrigues- Marcado como Resposta Marcos Aguiar Jr terça-feira, 8 de setembro de 2009 19:53
quinta-feira, 27 de agosto de 2009 17:09