Partition name for clustered EJB3 SLSB
kkrivopustov Sep 28, 2006 8:46 AMHello
I'm using JBoss-4.0.4.GA and trying to set up clustered EJB3 SLSB for work in dedicated partition. Annotated bean with explicit partition name works fine, failover and load balancing take place. But I don't want to hardcode partition name into the bean class...
Unfortunately @Clustered annotation doesn't allow partition name in ${jboss.partition.name:DefaultPartition} notation, so I switched to XML deployment descriptor. But in this case bean's behaviour is not clustered regardless of using explicit partition name or jboss.partition.name environment variable: requests execute on one server and if this server goes down, client gets an exception.
Below is my test code:
package test.cluster.intf; public interface Foo { int doSomething(int value); } package test.cluster.ejb; import org.apache.log4j.LogManager; import test.cluster.intf.Foo; public class FooBean implements Foo { public int doSomething(int value) { LogManager.getLogger(FooBean.class).info("iteration " + value); return 100; } } package test.cluster.client; import java.util.Properties; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import test.cluster.intf.Foo; public class Client { private Foo foo; private void connect() { Properties props = new Properties(); props.put("java.naming.factory.initial", "org.jboss.naming.NamingContextFactory"); props.put("java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces"); props.put("java.naming.provider.url", "localhost:1100,shamrock-a4:1100"); props.put("jnp.partitionName", "ShamrockPartition"); Context ctx = null; try { ctx = new InitialContext(props); foo = (Foo) ctx.lookup("Foo"); } catch (NamingException e) { throw new RuntimeException("Unable to lookup bean", e); } } private void process() { assert foo != null; for (int i = 0; i < 10000; i++) { foo.doSomething(i); System.out.println("iteration " + i + " success"); try { Thread.sleep((long) (Math.random() * 500)); } catch (InterruptedException e) { throw new RuntimeException(e); } } } public static void main(String[] args) { Client client = new Client(); client.connect(); client.process(); } } <?xml version="1.0" encoding="UTF-8"?> <ejb-jar xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd" version="3.0"> <enterprise-beans> <session> <ejb-name>FooBean</ejb-name> <remote>test.cluster.intf.Foo</remote> <ejb-class>test.cluster.ejb.FooBean</ejb-class> <session-type>Stateless</session-type> </session> </enterprise-beans> </ejb-jar> <?xml version="1.0" encoding="UTF-8"?> <jboss xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://www.jboss.org/j2ee/schema/jboss_5_0.xsd" version="3.0"> <enterprise-beans> <session> <ejb-name>FooBean</ejb-name> <jndi-name>Foo</jndi-name> <clustered>true</clustered> <cluster-config> <partition-name>${jboss.partition.name:DefaultPartition}</partition-name> <load-balance-policy>org.jboss.ha.framework.interfaces.RandomRobin</load-balance-policy> </cluster-config> </session> </enterprise-beans> </jboss>
I start server with -Djboss.partition.name=ShamrockPartition -Djboss.partition.udpGroup=228.1.2.4 environment variables.
What's wrong with my configuration?
Is there any other way to define cluster partition for annotated beans at deployment time?
Thanks in advance.
Konstantin.