1 2 Previous Next 27 Replies Latest reply: May 15, 2012 10:05 AM by Arnold Johansson Go to original post RSS
  • 15. Re: Cluster to Cluster EJB Call
    Graeme Wallace Newbie

    jboss-ejb3.xml

     

    <jboss xmlns="http://www.jboss.com/xml/ns/javaee"

           xmlns:jee="http://java.sun.com/xml/ns/javaee"

           xmlns:c="urn:clustering:1.0">

     

     

        <jee:assembly-descriptor>

            <c:clustering>

                <jee:ejb-name>LocationModuleSessionBean</jee:ejb-name>

                <c:clustered>true</c:clustered>

            </c:clustering>

        </jee:assembly-descriptor>

    </jboss>

     

     

    Session Bean

     

     

    @Stateless

    @Remote(LocationModuleAPI.class)

    public class LocationModuleSessionBean implements LocationModuleAPI {

     

        private static final int SLEEP_TIME_WAITING_FOR_DELEGATE = 1000;

        private static final long MAXIMUM_WAIT_FOR_DELEGATE = 2 * 60 * 1000; //two minutes

     

        @Resource(name="module.name")

        private String _moduleName;

     

        private LocationModuleAPI _delegate;

     

        public LocationModuleSessionBean() {

        }

     

        protected Log getLog() {

            return LogFactory.getLog( getClass() );

        }

     

        @PostConstruct

        public void init() {

            try {

                _delegate = (LocationModuleAPI) ModuleLookupService.getInstance().lookupModule(_moduleName);

            }

            catch (ModuleLookupException ne) {

                ne.printStackTrace();

            }

        }

     

    / * All methods below here - just delegate to _delegate */

  • 16. Re: Cluster to Cluster EJB Call
    Graeme Wallace Newbie

    Jaikiran,

     

    Did you have a chance to look at this again ?

     

    thanks

     

    Graeme

  • 17. Re: Cluster to Cluster EJB Call
    jaikiran pai Master

    Graeme Wallace wrote:

     

    Jaikiran,

     

    Did you have a chance to look at this again ?    

    Will do today - was caught up with other important tasks yesterday.

  • 18. Re: Cluster to Cluster EJB Call
    jaikiran pai Master

    I just tested this against the latest build and it works fine. Could you attach that application which reproduces this issue for you, along with the entire server logs (I guess you forgot to attach the logs in your earlier post)?

  • 19. Re: Cluster to Cluster EJB Call
    Graeme Wallace Newbie

    Ok. Let me skinny the code up for you as you wont want all the dependencies the real system has.

  • 20. Re: Cluster to Cluster EJB Call
    Graeme Wallace Newbie

    Here's an example i've hacked up.

     

    If you add jboss-client.jar to the lib dir, it should compile and produce a couple of ear files and jars.

     

    farecompare-cluster-server.ear is deployed on cmc5-101 and cmc5-102

    farecompare-relay-server.ear is deployed on cmc5-103

     

    farecompare-client.jar is a standalone client that makes a non clustered EJB connection to the relay server

     

    In the process of doing this however, I've found that  cmc5-101 and cmc5-102 no longer behave like they are in a cluster,

    even though i've started them both with standalone-ha.xml. Failover doesnt even work now.

     

    Is there some extra config you have to do in 7.1.2 ?

  • 21. Re: Cluster to Cluster EJB Call
    jaikiran pai Master

    There's a bug in your application packaging which is causing this issue. The jboss-ejb3.xml (which is meant for JBoss specific overrides for the ejb-jar.xml/annotations) is expected to be alongside the ejb-jar.xml in the META-INF of EJB jar and _not_ in the META-INF of the .ear. It's jboss-ejb-client.xml (which is a JBoss specific descriptor file for remote EJB client configurations) which is expected to be in the META-INF of the .ear (or  WEB-INF of top level .war deployments). Once I fixed your build.xml to package this correctly, the clustering configuration in your jboss-ejb3.xml started taking effect and your round robin cluster node selector started being used. I've attached a modified version of your application (fixed the build.xml and added some System.out.println statements in some parts of the code to illustrate that both clustering failover and clustering loadbalancing is working).

  • 22. Re: Cluster to Cluster EJB Call
    jaikiran pai Master

    By the way, here's the log which shows loadbalancing is working (the reference to "one" corresponds to cmc5-103 relay app, two corresponds to cmc5-101 cluster app and three corresponds to cmc5-102 cluster app)

     

    12:33:42,258 INFO  [stdout] (EJB default - 1) Relay module session bean invoked on one --> first invocation when clustering topology hasn't yet been received
    12:33:53,593 INFO  [stdout] (EJB default - 2) Relay module session bean invoked on one --> at this point clustering topology has been received, so the cluster node selector will be called
    12:33:53,595 INFO  [stdout] (EJB default - 2) RoundRobin::selectNode ejb ConnectedNodes: [two, three] AvailableNodes: [two, three] -->cluster node selector invoked
    12:34:13,496 INFO  [stdout] (EJB default - 3) Relay module session bean invoked on one
    12:34:13,497 INFO  [stdout] (EJB default - 3) RoundRobin::selectNode ejb ConnectedNodes: [two, three] AvailableNodes: [two, three]
    12:34:25,596 INFO  [stdout] (EJB default - 4) Relay module session bean invoked on one
    12:34:25,598 INFO  [stdout] (EJB default - 4) RoundRobin::selectNode ejb ConnectedNodes: [two, three] AvailableNodes: [two, three]
    12:34:38,281 INFO  [stdout] (EJB default - 5) Relay module session bean invoked on one
    12:34:38,282 INFO  [stdout] (EJB default - 5) RoundRobin::selectNode ejb ConnectedNodes: [two, three] AvailableNodes: [two, three]
    

     

     

    Then I take down cluster node "two" and here's the rest of the failover log which shows updated topology and the load balancer being invoked:

     

    12:34:46,412 INFO  [org.jboss.ejb.client.remoting] (Remoting "one" task-4) EJBCLIENT000016: Channel Channel ID ed696301 (outbound) of Remoting connection 011ff1b8 to localhost.localdomain/127.0.0.1:4547 can no longer process messages
    12:34:55,825 INFO  [stdout] (EJB default - 6) Relay module session bean invoked on one
    12:34:55,826 INFO  [stdout] (EJB default - 6) RoundRobin::selectNode ejb ConnectedNodes: [three] AvailableNodes: [three]
    
  • 23. Re: Cluster to Cluster EJB Call
    Graeme Wallace Newbie

    Thanks Jaikiran ! Its always something stupid - i must have had that correct at some point then bollocksed it up.

     

    I have one last question regarding the standalone client - in the code there is a line

     

        final ContextSelector<EJBClientContext> previousSelector = EJBClientContext.setSelector(ejbClientContextSelector);

     

    This appears not to be thread safe, as the setSelector could be called in another thread before the JNDI lookup is done.

    Is this really the case ?

     

    Thanks again for your help,

     

    Graeme

  • 24. Re: Cluster to Cluster EJB Call
    Arnold Johansson Apprentice

    Hi!

    Great explanations Jaikiran!

     

    I'm having similar issues with yesterdays (downloaded 2012-05-08, 08:41 CET) 7.1.2.Final-SNAPSHOT, but here the selectNode() method of the ClusterNodeSelector-implementation is not getting called. The constructor is called though! Is this a known issue?

     

    KR

    /Arnold

  • 25. Re: Cluster to Cluster EJB Call
    jaikiran pai Master

    Arnold, sorry I forgot to reply to your question. Are you still running into this? If yes, could you please create a separate thread with relevant details about the issue you are running into?

  • 26. Re: Cluster to Cluster EJB Call
    jaikiran pai Master

    Graeme Wallace wrote:

     

    I have one last question regarding the standalone client - in the code there is a line

     


    final ContextSelector<EJBClientContext> previousSelector = EJBClientContext.setSelector(ejbClientContextSelector);

     

    This appears not to be thread safe, as the setSelector could be called in another thread before the JNDI lookup is done.

    Is this really the case ?

     

    That really isn't a "thread safety" issue. What you are looking for is a way to lock down the selector so that it cannot be changed. That's possible, you can use:

     

    EJBClientContext.lockSelector();
    

     

    to do that.

  • 27. Re: Cluster to Cluster EJB Call
    Arnold Johansson Apprentice

    Hi!

    Yes, I've got the same problem in AS7.1.2.Final.

    I've created a new thread here: https://community.jboss.org/thread/199715

     

    Thanks

    /Arnold

1 2 Previous Next