Urgente - Sincronismo EJB Stateless

Pessoal,

Estou tentando sincronizar um metodo do EJB Stateless por todos os beans no pool, ja tentei colocar synchronized mas nao funcionou, pois acredito que o Container esteja gerenciando ele.

Pensei em usar um Stateful, porem eu poderia ter no pior dos casos 1 instancia para cada usuario na sessao e estaria sobrecarregando o sistema, mesmo assim nao sei se isso resolveria.
Mesmo fazendo o uso de activate e passivate o Stateful, ainda acho o Stateless melhor devido a sua curta duraçao…

Alguem teria alguma ideia??

Valeu…


Olá Cbelleza,
Sim vc estar certo, nao pode usar syncronized!! mas pq vc quer sincrinizar um metodo de seu stateless?
Stateless durarm um método apenas, depois eles voltam para o pool.
Diga qual o problema que vc esta querendo resolver.
[]'s

bem, o problema que tenho e que esse ejb esta acessando alguns recursos de um componente externo so que esse componente so aceita um acesso por vez…

Qdo mais de um acesso e feito ao mesmo tempo os valores retornados para o EJB voltam incorretos, por isso queria sincronizar esse metodo do EJB Stateless.

Entendeu melhor?

Valeu…

Hum, que tal aplicar a Singleton Pattern para ter apenas uma instância desse EJB?

Bem pessoal consegui resolver o meu problema com uma dica de um outro amigo na web…

Segue a dica dele abaixo! :smiley:

Bom, a princípio, você não deveria ter que sincronizar EJBs stateless, mas, vamos lá…

Como você usou o synchronized? na declaração do método? Isso não funciona, pois é o mesmo de synchronized(this) {}, portanto, sincroniza usando a própria instância do bean como lock (cada instância terá seu próprio lock, portanto, rodam paralelamente).

O que você poderia fazer aqui é criar um objeto estático (atributo de classe), e sincronizar os métodos sobre este objeto. Algo do tipo (não compilei, não testei, use por sua conta e risco:)):

Código:
class Bean … {
private static final Object LOCK = new Object();
public void metodo1() {
synchronized (LOCK) {
//do your stuff here
}
}
public void metodo2() {
synchronized (LOCK) {
//do your stuff here
}
}
}

Mas só avisando, a sincronização só vale na mesma JVM. Se você for rodar isso em um ambiente em cluster, isso não vai impedir que duas instâncias em máquinas diferentes rodem ao mesmo tempo.
Dependendo, isso não é problema, mas você deve saber exatamente o que está fazendo Smile. Apenas nunca tente substituir transações por synchronized.

Link da Ajuda!
http://www.javafree.com.br/forum/viewtopic.php?t=10444