Páginas filhas
  • Integração RM x SmartLink Behavior Sharing - Visão desenvolvedor

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

...

Este documento técnico tem por objetivo auxiliar os desenvolvedores dos segmentos na criação de classes que "publicam" e/ou "consomem" mensagens no SmartLink através da plataforma TotvsAppsTotvs SmartLink.

O desenvolvimento e manutenção dos publicadores e consumidores de mensagens são de responsabilidade das equipes de segmentos. Os artefatos genéricos que controlam a fila de execução das mensagens são de responsabilidade da equipe de Framework.

...

  1. Criar um projeto (classLibrary .NET) na solution do segmento em questão, com o seguinte padrão de nome: RM.[Segmento].XXX.SmartLink.Service.
    1. Exemplo: RM.Glb.SGDP.SmartLink.Service.dll
  2. Adicionar referência para a dll "RM.Lib.SmartLink.dll";
  3. Criar uma classe que receba em seu construtor instâncias para as das seguintes interfaces:

    1. "IRMSSmartLinkPublisherService": objeto interface de serviço responsável em incluir a mensagem na fila do RM.SmartLink.Client.

      Informações

      Foi criada na Lib uma classe de "factoryFactory" responsável em fornecer uma instância para interface "IRMSSmartLinkPublisherService". Trata-se da classe  "RMSSmartLinkPublisherFactory". Basta chamar seu método público "NewSmartLinkPublisher" para obter uma instância contendo essa responsabilidade.

    2. "IRMSLogger": objeto serviço usado para incluir logs relacionados à regra de negócio em questão. 

      Informações

      Esses Todos os logs adicionados nesse serviço serão persistidos gravados automaticamente na tabela "GTotvsLinkLog"

    3. Para publicar uma mensagem na fila do RM.SmartLink.Client, basta chamar o método "AddMessage" da instância de interface "IRMSSmartLinkPublisherService". Os seguinte dados devem ser enviados através de uma classe de parâmetros do tipo "SmartLinkPublisherAddMessageParams":

      PropriedadeDescrição
      CommandNome do comando a ser incluído na fila do SmartLink. Ex: SGDPUpdateTenantMetada
      CorrelatedIddeve Pode ser ser enviado nessa propriedade um identificador (guid) que correlacionam mensagens de request envio e response;resposta.
      Data

      Dados da mensagem contendo dados do informações relacionadas ao negócio. Pode ser em qualquer formato (json, xml, etc)  desde que o consumidor consiga interpretá-lalo.

      RouterMessagerota Rota de envio da mensagem. Será concatenada ao endpoint do serviço do Totvs SmartLink.Server. ex: /api/v1/link/send/SGDPMaskResponse/SGDP


  4. Diagrama de classes contendo um publicador de mensagem de exemplo:

...

   5. Diagrama de sequência contendo um exemplo do ciclo de vida da inclusão da mensagem "SGDPTenantMetada"

   5. Código fonte de exemplo (extraído da classe "GlbSGDPPublisherMessageService" localizada na solution de Globais, projeto "RM.Glb.SGDP.SmartLink.Service"

...

  1. Criar um projeto (classLibrary .NET) na solution do segmento em questão, com o seguinte padrão de nome: RM.[Segmento].XXX.SmartLink.Service.
    1. Exemplo: RM.Glb.SGDP.SmartLink.Service.dll
  2. Adicionar referência para a dll "RM.Lib.SmartLink.dll";
  3. Criar uma classe herdando da ancestral "RMSSmartLinkConsumerMessageBase".

  4. A classe "RMSSmartLinkConsumerMessageJSonBaseRMSSmartLinkConsumerMessageBase" herda da classe RMSObject da Lib. Consequentemente, as classes de "consumers" poderão chamar os métodos "CreateFacade" e "CreateModule" dentro de suas estruturas.
  5. Carimbar a classe com o atributo "RMSSmartLinkConsumerMessageAttr". Nesse atributo, devem ser informados os dados abaixo:

  6. Identificador único do provedor (novo guid);
  7. Nome do papel (essa informação será mostrada para o usuário no sistema LGDP que está sendo criado pela Totvs);
  8. Linha do Produto (RM,TREPORTS, etc)
  9. Aplicação (Folha de Pagament, Educacional, Globais, etc)
  10. ClassName (Nome do Menu Controller do segmento) - Pode ser localizado na tabela GDICDATAPROTECTION coluna CLASSNAME.
  11. CodSistema (Código Sistema do segmento) -Pode ser localizado na tabela GDICDATAPROTECTION coluna CODSISTEMA.
  12. PropriedadeDescrição
    Cod.SistemaIdentificador da aplicação
    ComandoNome do Comando da mensagem
  13. Código fonte de exemplo (extraído da classe "GlbSGDPConsumerDataCommandMessage" localizada na solution de Globais, projeto "RM.Glb.SGDP.SmartLink.Service":

    Bloco de código
    language

    Exemplo:

    Bloco de código
    languagec#
    firstline1
    linenumberstruetrue
    using RM.Glb.SGDP.SmartLink.Service.Domain.Interfaces;
    using RM.Lib;
    using RM.Lib.SmartLink.Domain;
    using RM.Lib.SmartLink.Domain.Consumer;
    using RM.Lib.SmartLink.Domain.Interfaces;
    using RM.Lib.SmartLink.Domain.Publisher;
    using System;
    using System.Runtime.Serialization;
    
    namespace RM.Glb.SGDP.SmartLink.Service.Domain
    {
      /// <summary>
      /// Regras de implementação do mecanismo de processamento da mensagem SGDDataCommand do SGDP
      /// </summary>
      [RMSSmartLinkConsumerMessageAttr(CodSistema.Glb, "SGDPDataCommand")]
      public class GlbSGDPConsumerDataCommandMessage : RMSSmartLinkConsumerMessageBase
      {
        protected override ConsumerMessageExecuteResult DoExecute(string message)
        {
          logService.NotifyLogInfo(Properties.Resources.sconTotvsAppInicioExecucaoDoConsumerSGDPDataCommandConsumer);
          ConsumerMessageExecuteResult result = new ConsumerMessageExecuteResult();
          IGlbSGDPResolverService resolver = GlbSGDPResolveFactory.NewSGDPResolve(this.DBS, this.logService);
          IRMSSmartLinkPublisherService smartLinkPublisherService = RMSSmartLinkPublisherFactory.NewSmartLinkPublisher(this.DBS, this.logService);
          IGlbSGDPPublisherMessageService publisher = new GlbSGDPPublisherMessageService(smartLinkPublisherService, resolver, logService);
    
          ExecuteDataCommandParms par = new ExecuteDataCommandParms();
          par.Message = message;
          try
          {
            var execDataResult = resolver.ExecuteSGDPDataCommand(par);
            logService.NotifyLogInfo(Properties.Resources.sconTotvsAppJSonSGDPDataResponseCommandForamGerados, "Quantidade JSons Gerados", execDataResult?.JsonResults?.Count);
            result.CorrelatedID = execDataResult.RequestId;
            if (execDataResult?.JsonResults != null)
            {
              foreach (var jsonResult in execDataResult.JsonResults)
              {
                AddResponseDataCommandParms parResponse = new AddResponseDataCommandParms();
                parResponse.Message = jsonResult;
                parResponse.CorrelatedId = execDataResult.RequestId;
                publisher.AddResponseDataCommand(parResponse);
              }
            }
          }
          catch(Exception ex)
          {
            logService.NotifyLogError(new GlbSGDPConsumerDataCommandMessageException(
              Properties.Resources.sconTotvsAppErroAoProcessarSGDDataCommand, ex));
          }
          logService.NotifyLogInfo(Properties.Resources.sconTotvsAppFimExecucaoDoConsumerSGDPDataCommandConsumer);
          return result;
        }
      }
    
      [Serializable]
      public class GlbSGDPConsumerDataCommandMessageException : RMSApplicationException
      {
        public GlbSGDPConsumerDataCommandMessageException() : base()
        {
        }
    
        public GlbSGDPConsumerDataCommandMessageException(string message) : base(message)
        {
        }
    
        public GlbSGDPConsumerDataCommandMessageException(string message, Exception ex) : base(message, ex, string.Empty)
        {
        }
    
        public GlbSGDPConsumerDataCommandMessageException(SerializationInfo info, StreamingContext context)
      : base(info, context)
        {
        }
      }
    }
    
    
    namespace RM.Glb.TesteUnitario
    {
      [GlbDataProtectionRoleAttr("7b886d91-86b1-4953-ad93-7da732d40515", "Funcionários", "RM", "Fop","FopFolhaActionModuleController", "P")]
      public class RHUDataProtectionProviderFuncionarios<FuncID> :
        GlbDataProtectionProviderBase<FuncionarioIDModel>
        where FuncID : FuncionarioIDModel, new()
      {
      }
    }
    
    

Image RemovedImage Added