EJB Stateful + Cluster

3 respostas
Dennys

Salve, Salve Galera!

Seguinte… fiquei meio curioso quanto ao funcionamento do EJB se Sessão Stateful…

Exemplo:

Temos um cluster com duas Máquinas Virtuais…

O Usuário faz uma requisição e a Virtual Machine 1 é chamada… O EJB de Sessão guarda o valor 25…

O Mesmo Usuário faz a segunda requisição e a Vitual Machine 2 é chamada… o EJB de Sessão da Virtual Machine 2 não tem valor nenhum… e ae ???

Entenderam minha dúvida ?

Valeu!!!

3 Respostas

louds

Um cluster usa sticky sessions e/ou replicação para resolver esse tipo de problema.

O

Cluster de Statefull Session Beans (2.1) é um pouco mais complexo, pois toda vez que a sessão mudar, o container tem que replicar para todo o cluster, se estiver utilizando o JBOSS ele trata isso com um MBEAN chamado HASessionStateService.

Verifique seu jboss.xml

<jboss>    
    <enterprise-beans>
        <session>        
            <ejb-name>myBean.StatefulSession</ejb-name>        
            <jndi-name>myBean.StatefulSession</jndi-name>        
            <clustered>[b]True[/b]</clustered>        
            <cluster-config>          
                <partition-name>DefaultPartition</partition-name>
                <home-load-balance-policy>               
                    org.jboss.ha.framework.interfaces.RoundRobin          
                </home-load-balance-policy>          
                <bean-load-balance-policy>               
                    org.jboss.ha.framework.interfaces.FirstAvailable          
                </bean-load-balance-policy>          
                [b]<session-state-manager-jndi-name>              
                    /HASessionState/Default          
                </session-state-manager-jndi-name> [/b]       
            </cluster-config>      
        </session>    
    </enterprise-beans>
</jboss>

Você também precisa configurar o HASessionStateService MBEAN. Verifique o arquivo cluster-service.xml.

<mbean code="org.jboss.ha.hasessionstate.server.HASessionStateService"
      name="jboss:service=HASessionState">
    <depends>
        jboss:service=${jboss.partition.name:DefaultPartition}
    </depends>
    <!-- Name of the partition to which the service is linked -->
    <attribute name="PartitionName">
        ${jboss.partition.name:DefaultPartition}
    </attribute>
    <!-- JNDI name under which the service is bound -->
    <attribute name="JndiName">/HASessionState/Default</attribute>
    <!-- Max delay before cleaning unreclaimed state.
           [b]Defaults to 30*60*1000 => 30 minutes -->[/b]
    <attribute name="BeanCleaningDelay">0</attribute>
</mbean>

Se tudo estiver correto, então provavelmente, quando você verificou o estado da sessão o container ainda não havia replicado para o cluster.

Existe um truque para melhorar a performance do container para replicar o estado da sessão para o cluster. Você pode implementar no seu bean o método:

Antes de replicar, o container verifica se o bean implementa este método, se sim, ele só vai efetuar a réplica se o método retornar true. (Acho que este recurso encontra-se disponível apenas apartir da versão 3.0.1 do JBOSS).

Faça cluster de entity beans agora :lol:

Abraço.

Dennys

Eita… eu teria algum problema com entity beans?

não consegui ver qual problema teria…

Criado 6 de junho de 2006
Ultima resposta 8 de jun. de 2006
Respostas 3
Participantes 3