Nesse cenário temos que levar em conta um item muito importante, a preparação do ambiente.

 

No RPC sempre que necessitamos de um ambiente preparado para realizar um determinado procedimento temos que utilizar o método “SetEnv”, que vai realizar todo o trabalho de preparação de ambiente, e a partir disso podemos iniciar a implementação das rotinas, que de acordo com os testes que estão no exemplo terão um melhor desempenho, demorando menos tempo, mas levando em conta somente depois do método “SetEnv” ser chamado. Já o Web Service trabalha de forma totalmente diferente, o ambiente já fica instanciado no servidor, então quando executado, não há necessidade de realizar o “SetEnv”, porém o desempenho da rotina não é muito maior que o do RPC. Veja o exemplo com dados só contando com execução de rotina, sem levar em conta a preparação do ambiente, numa repetição de 1000 vezes.

 

Tempo usando RPC 9.936

Tempo usando Web Service 16.42

 

Teste:

// WebServiceVsRPCTeste.prw

#INCLUDE "TOTVS.CH"

#INCLUDE "APWEBSRV.CH"

#INCLUDE "TBICONN.CH"

 

Static nVezes := 1000 // Numero de Repeticoes

 

Function WebServiceVsRPCTeste()

 

// Testa Web Service

TestWs()

// Intervalo de tempo

Sleep(500)

// Testa RPC

TestRpc()

 

Return

 

Static Function TestWs()

 

Local oWS          := Nil              // Instacia classe de Web Service

Local nX           := 1                // Contador de Repeticoes

Local cTet         := ""               // Retorno de teste

Local nSeconds    := Seconds()       // Armazena segundos inicial

 

// Instacia classe de Web Service

oWS := WSWSTESTPER():New()

// Informa o Ip que esta o Web Service

oWs:_URL := "http://172.16.31.118:89/WSTESTPER.apw"

 

// Realiza repeticoes de Chamada de Web Service

For nX := 1 To nVezes

       oWs:CCCODCLI      := "000001"

       oWs:nnVezes        := nX

       oWS:PEGANOMECLI()

       cTet := oWs:CPEGANOMECLIRESULT

Next nX

 

ConOut("Tempo execução Web Service " +  AllTrim(Str(Seconds() - nSeconds) ))

 

Return

 

Static Function TestRpc()

 

Local oServer     := Nil // Objeto que chama Classe de RPC

Local lConect     := .T. // Reotrno de RPC fez comunicação

Local cRet         := ""  // Retorno

Local nX           := 0   // Contador de repeticao

Local nSeconds    := 0   // Armazena segundos inicial

 

// Ip e porta do Server que o RPC se conectara

oServer :=FwRpc():New( "172.16.31.118", 5041 , "MULTINEG" ) // Instancia o objeto de oServer       

 

oServer:SetRetryConnect(1)   

lConect := oServer:Connect()                             // Tenta efetuar conexao

// Prepara Ambiente

oServer:SetEnv("T1", "D MG 01", "LOJA")                // Prepara o ambiente no servidor alvo

// Intervalo de Tempo para iniciar rotina

Sleep(5000)

// Inicia repeticoes

nSeconds := Seconds()          // Armazena segundos inicial

For nX := 1 To nVezes

       cRet := oServer:CallProc("TetSeeCli", "000001", nX)

Next nX

// Desconecta do servidor

oServer:Disconnect()

 

ConOut("Tempo execução RPC " +  AllTrim(Str(Seconds() - nSeconds) ))

 

Return cRet

 

WSService WSTestPer Description "Servico de Test de Performece"

 

       WSData cCodCli           As String

       WSData cNomeClie               As String

       WSData nVezes            As Integer

      

       WSMethod PegaNomeCli    Description "Pega nome do Cliente"              

      

EndWSService

 

WSMethod PegaNomeCli WSReceive cCodCli, nVezes  WSSend cNomeClie WSService WSTestPer

 

Self:cNomeClie := TetSeeCli(Self:cCodCli, Self:nVezes)

 

Return .T.               

 

 

Function TetSeeCli(cCodCli, nVezes)

Local cRet                := ""

Default cCodCli          := ""

Default nVezes           := 1

 

DbSelectArea("SA1")

DbSetOrder(1)

 

If DbSeek(XFilial("SA1") + cCodCli)

       cRet := SA1->A1_NOME

       Conout(Str(nVezes))

EndIf

 

Return cRet

 

  • Sem rótulos