Vraptor + cluster + quartz

4 respostas
C

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!!

4 Respostas

Lucas_Cavalcanti

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)
C

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?

Lucas_Cavalcanti

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

C

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…

Criado 26 de dezembro de 2012
Ultima resposta 27 de dez. de 2012
Respostas 4
Participantes 2