Quando configuramos a infraestrutura do REST no INI do appserver, podemos criar diversos Thread Pools, ou seja, conjuntos de threads disponíveis para o atendimento das requisições HTTP.
Porém, como é decidido qual thread de fato irá atender a requisição HTTP é algo que pode ser modificado. A camada tlppCore tem seu algoritmo de distribuição das conexões, porém não é o foco desse documento explicar como funciona, e sim ensinar como modificar esse algoritmo.
Importante ressaltar que ele te servirá não somente para modificar o algoritmo, mas dará o poder de decidir se a requisição será atendida ou não, se a conexão deve ser encerrada imediatamente e até decidir que a partir de certo momento, o tlppCore utilize o algoritmo padrão.
Basicamente, essa função tem que retornar o valor do índice correspondente ao Slave para o qual deseja indicar como responsável pelo atendimento da requisição HTTP.
O índice pode ser encontrado buscando pela lista (array) retornado pelo método oRest:getThreadPoolSlaves(), ficando a critério de quem implementa o algoritmo de busca e escolha.
Logo mais a baixo, iremos detalhar as demais opções e suas finalidades na sessão de retorno.
Parâmetros
A função customizada recebe 3 (três) parâmetros, sendo:
1 - cClassName
Nome da classe que foi implementada para a execução quando requisitado a "endpoint" correspondente do serviço REST. (pode estar em branco)
2 - cFunctionName
Nome da função ou do Método que foi implementado para a execução quando requisitado o endpoint correspondente do serviço REST.
3 - cProgramType
Tipo do programa, sendo:
Valor = 1 - Implementação do endpoint do serviço REST através de endpoint.
Valor = 2 - Implementação do endpoint do serviço através do callback de LoadURN. (descrito em documento próprio)
Nota: Embora não seja esse o momento de executar cada método ou função, saber quem será executado é importante, pois pode-se nessa camada implementar a validação de controle sobre autenticação X permissão de acesso por rotina a ser executada, concedendo mais poder a esse Callback
Retorno
O retorno dessa função deve ser do tipo numérico, indicando o índice correspondente do Slave contido na lista em oRest:GetThreadPoolSlaves() na qual deseja que a Thread seja responsável pelo atendimento da requisição.
Pode-se retornar as seguintes opções:
Maior que 0 (zero) >> Índice do slave para qual deseja transferir a responsabilidade de atendimento.
-1 >> Indica que deseja que o algoritmo do tlppCore seja o responsável pela escolha
-2 >> Indica que não irá atender a essa requisição, porém deixa que o server responda para o cliente requisitante.
-3 >> Derruba a conexão de modo silencioso, sem dar resposta para o cliente requisitante. Ex: útil para quando detectar tentativa de invasão.
function restGrader( cClassName as character, cFunctionName as character, cProgramType as character ) as integer
Local nIndex := -1 as integer
local aSlaves := oRest:GetThreadPoolSlaves() as array
local nA := 0 as integer
for na := 1 to len(aSlaves)
if ( aSlaves[nA]:ID == 6 ) // logica qualquer
nIndex := nA
endif
next
return nIndex