3 Replies Latest reply on May 6, 2016 8:38 AM by Miroslav Novak

    How to programatically create a JMS Queue in a Clustered Environment

    Terry Paterson Newbie

      Currently we are working on moving our application from a standalone configuration to a domain / clustered configuration.


      Our client app is Swing based, and talks to various EJBs in JBoss..


      At the point a user logs-in, we currently create a new JMS Queue using the JBoss Native Interface - which works well for us...


      however - this only works some times in a clustered environment -- since the JBoss Native Interface code, seems to have to be run on the master node / domain controller,



      our code looks like this :



                    ModelControllerClient client = null;

              final ModelNode op = new ModelNode();

              final ModelNode address = op.get(ClientConstants.OP_ADDR);


              address.add("profile", "full-ha");

              address.add("subsystem", "messaging");

              address.add("hornetq-server", "default");


              // the name of the queue

              address.add("jms-queue", queueName);


              // the JNDI entries

              final ModelNode entries = op.get("entries");

              for (final String jndiName : jndiNames) {





              final ModelNode result = execute(op);



      and we can also do the same thing using jboss-cli.sh :





      however -- if we try to execute either of these, on a node which is NOT the Domain Controller - we get the following response :



          "outcome" => "failed",

          "failure-description" => "JBAS010849: Operation add for address [

          (\"profile\" => \"full-ha\"),

          (\"subsystem\" => \"messaging\"),

          (\"hornetq-server\" => \"default\"),

          (\"jms-queue\" => \"newQueue5\")

      ] can only be handled by the master Domain Controller; this host is not the master Domain Controller",

          "rolled-back" => true





      The JBoss Native Interface code is executed from a SLSB, which can of course be run on any node in the cluster (which is great from load balancing / HA point of view)..



      How can we make this work on any node in the cluster ?


      Or is there a way to pin an EJB to a specific node in the cluster ? (e.g. the Domain Controller),


      but still have it continue to work if the Domain Controller should go down ? (e.g. have it move to another node in that scenario ?)