Veja como funciona o escopo de visibilidade das variáveis no Magic xpi, e como
podemos contornar estes limites algumas vezes.
Se você já fez o treinamento básico de desenvolvimento na plataforma Magic xpi, já conheceu os 5 tipos de variáveis de memória disponíveis e o escopo de visibilidade (acesso) de cada uma:
- Variáveis Globais ( G.??? ) = São acessíveis (leitura/gravação) em qualquer fluxo do projeto, em qualquer business process. São ‘singleton‘ (única instância), e são mantidas na memória do GigaSpaces (porque um projeto pode ter ‘n’ Magic xpi Servers atendendo suas requisições).
- Variáveis de Business Process ( B.??? ) = São acessíveis (leitura/gravação) em qualquer fluxo do projeto, mas apenas do business process onde foi definida. Outros fluxos de outros business processes não tem acesso a elas. São ‘singleton‘ (única instância), e são mantidas na memória do GigaSpaces (porque um projeto pode ter ‘n’ Magic xpi Servers atendendo suas requisições).
- Variáveis de Contexto ( C.??? ) = São acessíveis (leitura/gravação) em qualquer fluxo do projeto, em qualquer business process, mas somente se estiverem executando na mesma thread (contexto). São ‘non-singleton‘ (múltiplas instâncias), onde cada thread/contexto em execução mantém suas cópias destas variáveis. São mantidas na memória do Magic xpi Server (porque um contexto só existe dentro de um único Magic xpi Server).
- Variáveis de Ambiente ( ??? ) = Tem o mesmo escopo e funcionalidade das variáveis de ‘contexto’, porém sua definição é feita fora do código-fonte do projeto, diretamente nos arquivos MAGIC.INI (definição para qualquer projeto existente) ou IFS.INI (definição exclusiva deste projeto).
- Variáveis de Fluxo ( F.??? ) = São acessíveis (leitura/gravação) exclusivamente no fluxo do projeto onde foram definidas, em nenhum outro local. São ‘non-singleton‘ (múltiplas instâncias), onde cada instância em execução do fluxo mantém suas cópias destas variáveis. São mantidas na memória do Magic xpi Server (porque uma instância de fluxo só existe dentro de um único Magic xpi Server).
Ok. Estes são os 5 possíveis escopos e tipos das variáveis Magic xpi, do mais acessível ao mais restritivo.
Com isso, compreendemos que se definirmos uma variável de fluxo “F.Var1” num determinado fluxo F1, não temos como acessá-la em um outro fluxo F2 por exemplo, sem que haja uma passagem formal de parâmetros (In/Out).
O componente Invoke Flow permite um fluxo (“F1”) chamar a um outro fluxo (“F2”) passando formalmente parâmetros, que podem inclusive ser atualizados de volta:
Isso resolveria a situação.
Mas o mesmo não acontece quando chamamos (F2) a partir de um outro fluxo (F1), por DataMapper.
Com o DM só podemos enviar valores ao fluxo do destino:
E não tem como recebermos uma atualização de volta na variável original, do fluxo que fez a chamada.
Certo?
Certo. Exceto se … 🤔
Manipulação Interna de Variáveis de Fluxo
Como visto acima, as variáveis de fluxo ( F.??? ) vivem na memória do Magic xpi Server, assim como as de contextos. E de fato, internamente, elas são também de contexto 😲.
O que dá a elas uma visibilidade diferente é uma técnica interna da plataforma que muda o nome de cada uma dessas variáveis, durante a execução do projeto.
Quando o projeto está rodando, o nome de cada variável de fluxo é alterado com a adição de um prefixo numérico de 12 dígitos, cfe. a seguir:
- 6 dígitos com o “Id” do business process a que pertence o fluxo onde ela foi definida:
- 6 dígitos com o “Id” do fluxo onde ela foi definida:
Assim, o real nome da variável “F.Var1” definida no fluxo que tem Id=1, e que pertence a um business process que também tem Id=1, será:
-
000000000001000000000001F.Var1
Uma variável de fluxo nada mais é então, que uma variável de contexto com ‘nome especial’. É esta nomenclatura que confere a ela a aparência de uma visibilidade específica ao fluxo, pois não será possível que duas variáveis de mesmo nome, mas definidas em fluxos diferentes, colidam (ocupem a mesma área de memória).
Isso seria somente uma informação técnica, um pouco ‘nerd’ até, se não fosse a questão a seguir (que é a parte realmente interessante):
O Magic xpi possui duas funções que permitem manipular variáveis de “contexto” pelo seu nome real:
- GetParam() = Para ler o conteúdo da variável
- SetParam() = Para atualizar o conteúdo da variável.
Logo, sabedores da existência de uma variável de fluxo (que na verdade, internamente, é contexto) de nome ‘F.Var1‘, criada no fluxo de Id=1, no BP de Id=1, poderemos manipular seu conteúdo em qualquer outro fluxo do projeto (incluindo outros business processes) desta forma:
GetParam ( '000000000001000000000001F.Var1' )
SetParam ( '000000000001000000000001F.Var1', <Algum Valor> )
Não é algo que precisemos fazer com frequência. Até porque o correto seria enviar variáveis locais (de fluxo) como parâmetros “Out” quando fosse necessário tê-las atualizadas por outros fluxos.
Mas lembra do exemplo acima (Data Mapper) ? Veja este fluxo de integração:
Você pode baixar deste link um pequeno projeto exemplo com o Magic xpi 4.13, sobre este tema abordado.
Fique ligado no Blog MagicBR, para mais dicas sobre o Magic xpi.
Para receber os artigos do Blog Magic Brasil em primeira mão no seu email, registre-se aqui