Singleton em cluster usando o Wildfly?
Estou tentando criar um simples agrupadoSingleton
no Wildfly 8.2. Eu configurei 2 instâncias do Wildfly, executando em uma configuração em cluster autônoma. Meu aplicativo está implantado nos dois e posso acessá-lo sem problemas.
Meu EJB em cluster fica assim:
@Named
@Clustered
@Singleton
public class PeekPokeEJB implements PeekPoke {
/**
* Logger for this class
*/
private static final Logger logger = Logger
.getLogger(PeekPokeEJB.class);
private static final long serialVersionUID = 2332663907180293111L;
private int value = -1;
@Override
public void poke() {
if (logger.isDebugEnabled()) {
logger.debug("poke() - start"); //$NON-NLS-1$
}
Random rand = new SecureRandom();
int newValue = rand.nextInt();
if (logger.isDebugEnabled()) {
logger.debug("poke() - int newValue=" + newValue); //$NON-NLS-1$
}
this.value = newValue;
if (logger.isDebugEnabled()) {
logger.debug("poke() - end"); //$NON-NLS-1$
}
}
@Override
public void peek() {
if (logger.isDebugEnabled()) {
logger.debug("peek() - start"); //$NON-NLS-1$
}
if (logger.isDebugEnabled()) {
logger.debug("peek() - value=" + value); //$NON-NLS-1$
}
if (logger.isDebugEnabled()) {
logger.debug("peek() - end"); //$NON-NLS-1$
}
}
}
... e escrevi um serviço RESTful muito simples para que eu chame esses métodos pelo navegador ...
@Path("/test")
@Named
public class TestRS extends AbstractRestService {
/**
* Logger for this class
*/
private static final Logger logger = Logger.getLogger(TestRS.class);
@Inject
private PeekPoke ejb = null;
@GET
@Path("/poke")
public void poke() {
if (logger.isDebugEnabled()) {
logger.debug("poke() - start"); //$NON-NLS-1$
}
this.ejb.poke();
if (logger.isDebugEnabled()) {
logger.debug("poke() - end"); //$NON-NLS-1$
}
}
@GET
@Path("/peek")
public void peek() {
if (logger.isDebugEnabled()) {
logger.debug("peek() - start"); //$NON-NLS-1$
}
this.ejb.peek();
if (logger.isDebugEnabled()) {
logger.debug("peek() - end"); //$NON-NLS-1$
}
}
}
Eu sou capaz de chamar tanto opeek
epoke
métodos de uma única instância do Wildfly e obtenha o valor esperado. No entanto, se eu tentar chamar poke de uma instância e espiar de outra, vejo que os valores não estão sendo replicados nos EJBs.
Fiquei com a impressão de que um singleton em cluster replicaria o valor de 'value
'nos dois servidores de aplicativos, fornecendo o mesmo valor, independentemente de qual host eu crieipeek
chamada de. Isso não está correto? Falta algo que ainda precise ser adicionado a esse código?
Agradeço qualquer ajuda que você possa me dar! Obrigado!