Vraptor + cluster + quartz

Pessoal,

Não tenho certeza se o tópico deveria estar em arquitetura, mas enfim…

Tenho 3 máquinas unix rodando tomcat 6 em cluster configurado asssim:

<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
maxThreads="1800" />

<Engine name="Catalina" defaultHost="localhost" jvmRoute="xxx-01">
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="6">

<Manager className="org.apache.catalina.ha.session.BackupManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"
mapSendOptions="6"/>

<Channel className="org.apache.catalina.tribes.group.GroupChannel">

<Membership className="org.apache.catalina.tribes.membership.McastService"
address="228.0.0.4"
port="45564"
frequency="500"
dropTime="3000"/>

<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="auto"
port="5000"
selectorTimeout="100"
maxThreads="6"/>

<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
  <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
</Sender>

<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/>

</Channel>

<Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\ .html;.*\.css;.*\.txt;"/>

<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>

</Cluster>

Porem meus beans estão isolados em cada servidor, ou seja, tenho um AppContext para iniciar o quartz que deveria ser um para as 3 maquinas, mas acabam sendo um para cada maquina, ou seja, meus jobs são executados 3x…

O Conteiner utilizado é o do Spring…

Qualquer componente/bean que eu subo no vraptor fica exclusivo à maquina que o subiu… alguem sabe se é erro na configuração do cluster?

Valeu!!

cada máquina é uma instancia diferente da aplicação… e tudo que é @ApplicationScoped no VRaptor só é único por instância.

soluções possíveis:

  • só subir os jobs do quartz em uma das máquinas
  • usar um serviço centralizado de controle de jobs (Redis, algum MQ tipo ActiveMQ ou RabbitMQ)

Ooopa Lucas… valeu pela resposta…

Eu não tenho como ter um componente que seja único no cluster?

O cluster só vai compartilhar oq for session scoped?

não, porque um objeto só pode estar em uma JVM e cada instancia do aplicação é uma JVM diferente…

outra alternativa é usar algo como EJB ou RMI pra ter um mesmo objeto compartilhado entre multiplas VMs

certo certo…

Entao eu fiz um cara que verifica quem sou e quem está vivo…

Assim sei se sou o server que tem que rodar o quartz…

Vamos dizer que é gambirra mas nao mata…