Trabalho em segundo plano no Worklight Server
-
20-12-2019 - |
Pergunta
Tentando encontrar uma abordagem para realizar algumas tarefas domésticas regulares em um Worklight Server.Cenário simplificado:
Temos um adaptador conversando com um sistema back-end.Quando o usuário se autentica com o Worklight, ele cria algumas credenciais que são transmitidas ao backend em cada chamada de serviço.Essas credenciais podem ficar obsoletas se não forem usadas por um período de tempo.Portanto, o que queremos é uma “pulsação” para todas as sessões ativas.Eu tenho um objeto Java singleton no qual escondo as credenciais quando o usuário se autentica. O que eu quero fazer é ter algum tipo de thread de trabalho em segundo plano para iterar a lista de credenciais e fazer uma chamada de pulsação para o servidor.
Acabo com métodos adaptadores como este
// in business service adapter
businessMethod(){
make service call using credentials from user's Worklight session
}
// in authentication adapter, normal adapter authentication methods and a heartbeat
authentication(){
get back-end credentials
store credentials in user's session
stash credentials in singleton
}
// how do we cal this heartbeat every x min
heartbeat(){
for each credential in singleton stash
make heartbeat call to server keeping credential alive
}
A questão é:como acionamos esse batimento cardíaco.Tentei usar um Java TimerTask, que quase funciona.Posso providenciar para que o Java TimerTask chame meu batimento cardíaco.O problema é que, ao executar no TimerTask, não temos um ambiente normal do Worklight Server, as chamadas para WL.Server.invokeProcedure() lançam exceções e, pensando nisso, parece improvável que eu teria acesso às APIs normais do Worklight de efetivamente um segmento estranho.
Estamos usando o Worklight 6.1, implementando em um servidor WebSphere Liberty.No momento, o melhor que consigo pensar é escrever algum miniaplicativo externo ou script de shell que chame periodicamente o método heartbeat().
Alguma sugestão melhor?
Solução
Não tenho certeza se um back-end acelerado é uma boa ideia; além disso, isso parece uma possível falha de segurança.Você deve configurar o servidor WL e os tempos limite da sessão de back-end.
Quanto à resposta à pergunta real - você pode usar o EventSource para criar tarefas em segundo plano.Veja aqui - https://www.ibm.com/developerworks/community/blogs/worklight/entry/configurando_a_polling_event_source_to_send_push_notifications?lang=en
Outras dicas
David, não tenho certeza se isso aborda sua pergunta diretamente, pois não tenho certeza se você está visando apenas uma pulsação ou se deseja fazer algum trabalho personalizado na camada do adaptador quando a pulsação for recebida ( você pode esclarecer um pouco mais sobre o propósito subjacente?);mas você está ciente de que o próprio Worklight possui um conceito de pulsação integrado?Você o configura com o valor heartBeatIntervalInSec como parte da chamada para WL.Cliente.init().Ver a documentação para mais informações.