Gostaria da opinião de vocês para a melhor maneira de se criar um processo de notificação.
Tenho o seguinte cenário:
Um método que faz o processamento assíncrono de um determinado arquivo. Enquanto o arquivo é gerado, o usuário pode navegar normalmente. Quando finalizado, ele tem que acessar a página de download para baixar o arquivo.
Gostaria de criar uma notificação na página template do topo, para que surgisse quando o arquivo estivesse finalizado. Isso deve acontecer independe de qual página o usuário esteja no momento.
- Se alguém tiver alguma sugestão.
- Tecnologias utilizadas: JSF 2.1, Primefaces 6, Omnifaces 2.0, Bootstrap
eu faria esse processo numa Thread e levava o usuario para o download quando terminasse esse processo
Bom, eu faria uma classe Singleton que guardasse estas notificações.
Na sua pagina template, eu faria uma função javascript que de tempos em tempos tivesse uma chamada para um controlador especifico que fosse na classe que guarda as notificações e devolvesse a resposta se acabou ou não.
caso não quera um JS que vai de tempos em tempos, pode ter outras opçoes como:
Em cada load da pagina (quando o usuario troca de pagina).
Ou usando WebSckets. assim seu propio servido avisaria pra sua pagina que houve uma notificação.
A solução vai depender do tamanho do sistema.
Se for um sistema pequeno threads e JS é a solução mais simples.
No caso de um sistema grande, dependendo do volume de acesso, pode ser interessante usar um message broker(colocando o processamento em outras máquinas pra não interferir no tempo de resposta) e WebSockets.
Ou threads e WebSockets, que tem no omniFaces 2.3.
Cada caso é um caso, você tem que analisar o que vai te atender melhor a sua necessidade.
Valeu galera! Vou analisar as respostas e ver o que se encaixa melhor para meu caso.
Seria um pouco intrusivo, não acha? Ele poderia estar visualizando outra coisa e de repente, do nada, é redirecionado para a página de download.
vc tem razão mais vc poderia manda uma mensagem dizendo pra ele aperta um ok por exemplo e ai sim fazer o download, um outro framework a ser citado é o iceFaces
Essa é a ideia. Poderia ser um botão com o link que aparecesse no topo. Ou simplesmente uma mensagem no topo informando que o processamento foi concluído, depois ele acessaria a página de download. Sabe me dizer se o Omnifaces 2.3 exige no mínimo o JSF 2.2? Não achei no site oficial essa informação. Minha aplicação usa o JSF 2.1 e no momento não posso migrar para o 2.2.
Consegui encontrar:
An important design goal will be to have as few dependencies as possible and to be minimally invasive. So far, OmniFaces 2.x requires Java 1.7, JSF 2.2, EL 2.2, Servlet 3.0, CDI 1.1 and WebSocket 1.0 APIs which is already minimally available in a fairly modern servlet container serving a JSF 2.2 web application. Legacy OmniFaces 1.x only requires Java 1.6, JSF 2.0, EL 2.1 and Servlet 2.5 APIs which is already minimally available in a fairly modern servlet container serving a JSF 2.x web application.
Realmente precisa do JSF 2.2. Terei que descartar o Omnifaces