Variáveis de Aplicação

8 respostas
A

Estou com um sistema pra fazer uma adequação que faz reclamações de ligações celulares. Tudo é feito em relação as faturas…

O problema é que hoje as atendentes conseguem abrir a mesma fatura em duas máquinas diferentes, não dando lock quando alguma já estiver aberta.

Gostaria de saber como eu utilizaria uma variável de sessão à nivel de aplicação, para não ter que usar lock no banco. Como por exemplo armazenar uma lista com o numero das faturas que estão sendo utilizadas naquele momento.

:roll:

8 Respostas

J

Oi

Arocha, isso é possível sim, mas existem soluções melhores… Por exemplo, se uma operadara abrir uma fatura no PC01 e a outra operadora abrir a mesma fatura no PC077, vai abrir normalmente, pq as aplicacoes no PC01 e no PC077 são diferentes …

T+

J

Oi

:martelada: :martelada: , burro burro burro… desculpa ae, agora que eu fui ver que post é em J2EE/EJB, estou com uma penca de aba do Firefox abertas aqui, hehehe… :bebado:

Mas então, da pra fazer isso, variáveis de sessão, mas deves tomar cuidado com isso, principalmente se for ambiente em cluster.

T+

S

Porque você não quer fazer o lock no BD ?

Sugestão, não sei se é a melhor (na verdade acho que é péssima):
Chame um Session statefull que chamará o Entity que representa a fatura. No entity deixe uma variável referenciando qual Principal o está utilizando. E tenha certeza que no ejbRemove() e no ejbPassivate() do Session que você limpa a flag do entity. Ai é só no seus business method do entity lançar uma exception caso o Principal que chamou não for o mesmo que o que a flag armazena.

Problemas: o seu Principal deve referenciar o usuário e não o grupo que ele pertence, isso é setado no deploy (dependendo do seu container).

A

Desculpe por ter repetido esse topico no Fórum JSP/Servlets, mas foi porque depois que postei que vi que lá o assunto estava mais por dentro do tópico do fórum.

Eu não quero usar lock no banco pois esse sistema está sofrendo uma adequação, e alterações no banco demorariam pois é a própria operadora de celular que faz alterações no banco… eles implantaram GSM a pouco tempo, então o tempo está escasso dos analistas.

Vou analisar melhor o que você me disse e respondo se obtive sucesso.

Obrigado

A

Um problema maior… não se usa EJB nessa aplicação. Essa é a aplicação mais mal analisada que eu já vi, mas como não tem tempo de reestruturar gostaria que alguém me desse outra idéia sem usar EJB,
queria saber como eu usaria por exemplo uma sessão à nivel de aplicação, onde armazenaria uma lista com as faturas sendo usadas. Será que isso é possível?

Construiria um Listener para gerenciar se a sessão da fatura expirou ou não. é uma maneira porca de fazer, mas é que estão com urgência nesse caso.

S

Mas agora eu fiquei curioso com EJB…
Jeveaux, o que vc achou da minha solução ???


Um jeito bem tosco de fazer é colocar no ServletContext uma LinkedList com a chave primária das faturas em uso (ou uma referência para algum “FaturaManager” que controlaria o acesso as faturas).
Isto se você tem apenas uma aplicação, mas se tem várias aplicações diferentes e não quer fazer o lock no BD, EJB é o meio mais fácil.

A

Pessoal… muito obrigado pelas dicas…

Como eu tinha que fazer o negócio a curto prazo e não dava pra incrementar tanto, utilizei as Interfaces HttpSessionListener e HttpSessionAttributeListener.

Quando eu adicionava a fatura na sessão, o Listener adicionava o numero da fatura em um map na sessão de contexto. Quando esse atributo era removido, pegava-se o map e retirava esse valor.

No map também havia no lugar do valor, a sessão, portanto quando a sessão se tornava inativa, também retirava-se esses valores do map, portanto, sempre que ia abrir uma fatura nova, verificavamos se essa fatura já não estava lá.

Obrigado a todos.

:slight_smile:

S

Neste caso é mais fácil usar o HttpSessionBindingListener na Fatura (faça a sua classe de fatura implementar esta interface), nem precisa mexer no web.xml.

Criado 5 de abril de 2005
Ultima resposta 11 de abr. de 2005
Respostas 8
Participantes 3