Preciso fazer integração do meu sistema CRM com um sistema discador. O sistema discador alimenta uma tabela na base de dados do meu sistema com telefone do cliente e meu sistema deveria abrir um alerta para o usuário que a ligação daquele cliente chegou.
Dúvida: Como fazer isso?
JMS
RMI
PipedOutputStream | PipedInputStream
Gostaria de saber de alguma solução que não seja um timer que de tempos em tempos fica vendo se chegou alguma coisa na base de dados.
Sem informações do contexto, restrições gerais, legados, não tem como indicar algo…
ibispo
Fernando, obrigado.
Exemplificando melhor:
É um sistema web JSF + RichFaces + Facelets.
Nós temos um sistema discador (de terceiros) que liga para os clientes e está instalado em aprox. 70 PAs.
Quando uma ligação chega, o discador abre um pop-up no terminal do usuário apontando que existe uma ligação do cliente X para atender. Isso ocorre pois o discador possui para cada PA o IP e o usuário atrelado.
Para a integração desejada, a empresa do discador quer executar uma Stored Procedure no banco de dados do meu sistema. Quando chegar a ligação, eles executarão a SP. Essa SP do banco irá dar um INSERT em uma tabela com o ID do usuário + ID do cliente.
Proposta (deixar de ter esse sistema do discador e fazer tudo pelo nosso sistema):
Eu preciso (ouvir | observar) essa tabela e quando tiver algum registro, eu poder direcionar para o usuário logado do sistema automaticamente.
Imaginei usar o pattern “Observer” para que na mudança do objeto ‘observable’ os ‘obsevers’ possam sentir essa mudança. Mas estou na dúvida se esse seria o melhor caminho, considerando que o ‘observable’ teria que de tempos em tempos verificar se existe regisrtro na tabela inserida pelo sistema discador.
Espero que possa ter explanado melhor.
FernandoFranzini
Isso vai ser um processo automático ou vai ter um GUI na aplicação JSF que ficara cuidando?
A
abmpicoli
Já está fechado que o sistema discador irá chamar uma stored procedure? O pessoal do discador está aberto a alternativas?
Essa stored procedure é criada por vocês?
Qual banco de dados (e versão) vocês estão usando?
ibispo
Isso vai ser um processo automático ou vai ter um GUI na aplicação JSF que ficara cuidando?
Fernando,
Essa é uma das minhas dúvidas: Qual seria a melhor opção.
Eu, que quando programava em Delphi tinha um componente ‘Timer’ que de tempos em tempos ia ao BD e fazia algumas consultas. Mas acho isso muito ruim, pois o processo desvia o fluxo para esse processamento.
O que eu gostaria de saber se posso fazer algum tipo de processamento paralelo, ou seja, o usuário está usando o sistema, quando de repente surge a informação de uma chamada para ele atender.
Estou estudando Threads. Será que o caminho seria por ai?
Já está fechado que o sistema discador irá chamar uma stored procedure? O pessoal do discador está aberto a alternativas?
Essa stored procedure é criada por vocês?
Qual banco de dados (e versão) vocês estão usando?
abmpicoli,
Isso é do sistema dos caras. Eu tb pensei na alternativa de o sistema deles consumir uma WS que eu criasse. Mas acho que eles não tem como fazer isso (no momento).
Eu imaginei que eles inserindo um registro na minha tabela, pelo meu sistema seria mais fácil eu interceptar isso para resolver meu problema.
FernandoFranzini
Da sim…fiz muitos.
1)Para aparecer numa GUI de listagem JSF é só vc usar AJAX POOL…qualquer provedor de componentes jsf tem isso. Ele manda requisições de tempos e tempos renderizando um datatable.
2)Para fazer via processo automatico vc tem configurar um tarefa para ser disparada automaticamente pelo container de tempos em tempos…tipo 1 minuto etc - veja as opções http://fernandofranzini.wordpress.com/2011/07/18/agendamento-de-tarefas-em-aplicativos-java/
ibispo
Fernando (valeu a paciencia!),
Eu uso RichFaces e existe realmente um componente <Pool> que faz isso.
2 questões:
Essa coisa de ‘tempos em tempos’ não tem jeito mesmo, ou seja, tem que ter alguém periodicamente ouvindo alguma coisa?
Quanto a performance, uma vez que aprox 100 usuários estarão ao mesmo tempo com sistema aberto e usando várias coisas eu posso ter problemas?
FernandoFranzini
Não. Existe outra estrategias como
1)AJAX COMET - o servidor manda dados para os clientes. Tem questões de performance e gasto de recurso…estude e conclua vc mesmo.
2)Container de Mensagens MOM - consegue mandar mensagens assíncronas entre as aplicações. Muito complicado, tem que usar um container mais completo (JMS, EJB), com mais serviços…eu acho que não vale a pena.
Não tem problemas não…vai gastar mais memoria é claro, mas é algo configurável e gerenciável.
Só 100 usuários? Da sim
Tenho cenários aqui 3 x mais que isso 24 hs por dia usando listagem de chamados de tarefas onde muitos ficam pendurados.
Eu acho que é o mais indicado…
ibispo
OK, Fernando,
Irei utilizar as classes Timer e TimerTask, onde a cada 5 segundos irei ler a tabela do BD para saber se chegou registros e usar o pattern ‘Observer’ para informar aos objetos ‘observadores’ as alterações.
Quando a solução estiver em funcionamento publicarei os passos e trechos da solução para ajudar os colegas da comunidade.