13 Replies Latest reply: Jun 21, 2011 6:51 PM by Clebert Suconic RSS

    Looking for QueueControl example

    rhinmass Newbie

      Hello,

      Sorry for the multiple posts on this topic.  I would really appreciate an example on how to instantiate an instance of

       

      org.hornetq.api.core.management.QueueControl

       

      I am running JBoss 6.0.0.Final with embedded hornetq.

       

      I see that this is an interface and the actual class is org.hornetq.core.management.impl.QueueControlImpl

       

      but I have not been able to figure out how to get or create one.

       

      Thanks!!

        • 1. Looking for QueueControl example
          Clebert Suconic Master

          Look at the hornetq distribution: examples/jms/jmx

          • 2. Looking for QueueControl example
            rhinmass Newbie

            Sorry I wasn't clear (again!)  I'm looking for an example of using the core QueueControl, not JMS.

            • 3. Looking for QueueControl example
              Andy Taylor Master

              It will be exactly the same except you look up a different class using a different object name

              • 4. Looking for QueueControl example
                Dan Regan Newbie

                There isn't much example code using the core API.  Here's what I have, based on some code I found referred to in these forums somewhere:

                 

                    synchronized private MBeanServerConnection getMBeanServerConnection(int jmxPort) throws IOException {

                        String jmxUrl = "service:jmx:rmi:///jndi/rmi://" + serverHost + ":" + jmxPort + "/jmxrmi";

                        boolean newConnectorNeeded = false;

                 

                        // We want to re-use JMXConnectors as much as possible, otherwise we

                        // either a) have to close them when we're done with them, and this

                        // complicates things for the user, or b) run the risk of leaking

                        // JMX connectors and a new thread is created on the server each time

                        // we ask for a new one.  To avoid this, we only create one

                        // JMXConnector.  If we find that the current connector is not

                        // connected, we create a new one.

                 

                        if (jmxConnector == null) {

                            newConnectorNeeded = true;

                        }

                        else {

                            // check for a broken connection

                            // we could instead register for a notification, but any JMX objects

                            // that were using the broken connection would have to be recreated

                            // anyways; you cannot re-connect a broken connection.

                            try {

                                String connectionId = jmxConnector.getConnectionId();

                            } catch (IOException e) {

                                newConnectorNeeded = true;

                            }

                        }

                        if (newConnectorNeeded) {

                            jmxConnector = JMXConnectorFactory.connect(new JMXServiceURL(jmxUrl), new HashMap<String, Object>());

                        }

                 

                        MBeanServerConnection mbsc = jmxConnector.getMBeanServerConnection();

                        return mbsc;

                    }

                 

                    /**

                     * Returns a QueueControl

                     * ( http://hornetq.sourceforge.net/docs/hornetq-2.1.2.Final/api/org/hornetq/api/core/management/QueueControl.html )

                     * object, which the management object for a queue.

                     *

                     * @param queueName

                     * @param jmxPort

                     * @return

                     * @throws java.lang.Exception

                     */

                    public QueueControl getQueueControl(String queueName, int jmxPort) throws Exception {

                        QueueControl queueControl = null;

                        try {

                            MBeanServerConnection mbsc = getMBeanServerConnection(jmxPort);

                            ObjectNameBuilder builder = ObjectNameBuilder.DEFAULT;

                            ObjectName queueObjName = builder.getQueueObjectName(new SimpleString(queueName), new SimpleString(queueName));

                            queueControl = (QueueControl) MBeanServerInvocationHandler.newProxyInstance(mbsc, queueObjName, QueueControl.class, false);

                        } catch (Exception e) {

                            // tell the user why they're getting an exception before rethrowing it

                            System.out.println("Make sure you start the server JVM with these options:\n"

                                    + "-Dcom.sun.management.jmxremote.port=" + jmxPort + "\n"

                                    + "-Dcom.sun.management.jmxremote.ssl=false\n"

                                    + "-Dcom.sun.management.jmxremote.authenticate=false");

                            if (!serverHost.equals("localhost")) {

                                System.out.println("You may also need this option: -Djava.rmi.server.hostname=<fqdn>\n");

                            }

                            throw e;

                        }

                        return queueControl;

                    }

                • 5. Re: Looking for QueueControl example
                  Carl Heymann Newbie

                  This may be a bit late, but I've been experimenting with embedded hornetq myself over the weekend, and was looking for a way to delete messages.

                   

                  If you're running hornetq embedded, then it seems to me that you could just get a reference to a org.hornetq.core.server.Queue (https://github.com/bobmcwhirter/hornetq/blob/vendor/hornetq-core/src/main/java/org/hornetq/core/server/Queue.java) by using HornetQServer.locateQueue(queueName). The Queue interface allows you to directly control the queue, in the same way as QueueControl, but it seems to be part of the core implementation, not the public API. It would be nice if there was a QueueControl implementation for embedded use that avoided JMX.

                  • 6. Re: Looking for QueueControl example
                    Tim Fox Master

                    If you're in the same VM as the JNDI server, then it's trivial to just look up the QueueControl object directly (one line of code)

                    • 7. Re: Looking for QueueControl example
                      Carl Heymann Newbie

                      Like this?

                       

                         QueueControl control = (QueueControl)server.getManagementService().getResource(ResourceNames.CORE_QUEUE + queueName);

                       

                      When embedding, I'd like to avoid JNDI. The question is, whether the above is "safe" from an API point of view. The "ResourceNames" class is in the api package, but HornetQServer and ManagementService are not. Then again, I am embedding here. If the method to obtain the QueueControl interface changes in the future, it will be easy to deal with.

                      • 8. Re: Looking for QueueControl example
                        Tim Fox Master

                        Carl Heymann wrote:

                         

                        Like this?

                         

                           QueueControl control = (QueueControl)server.getManagementService().getResource(ResourceNames.CORE_QUEUE + queueName);

                        If you are running embedded you will either:

                         

                        a) Already have an instance of the MBeanServer server which you passed into the constructor when you created the embedded HornetQ server

                        b) If you used a constructor which doesn't take take the MBeanServer, then the default platform one will be used. You can get a reference to this with:

                         

                        mbeanServer = ManagementFactory.getPlatformMBeanServer();

                         

                        http://download.oracle.com/javase/1,5.0/docs/api/java/lang/management/ManagementFactory.html#getPlatformMBeanServer()

                         

                        You can then call methods on that to get the actual beans

                        • 9. Re: Looking for QueueControl example
                          Carl Heymann Newbie

                          Nothing (simple?) in MBeanServer gives the underlyning QueueControl instance directly. Everything seems designed around reflection/remote invocation. One can register an mbean, but can't get it back out. I can get the "ObjectInstance" for a QueueControl mbean, but this is just a handle, it doesn't expose the underlying mbean. Then I'm back to instantiating a proxy instance as described in message 4 by Dan Regan.

                           

                          Wouldn't it make sense to expose the QueueControl objects more directly for embedded use? All I want to do, is to have a simple way of deleting certain messages from a queue, without moving too far from the official hornetq API.

                          • 10. Re: Looking for QueueControl example
                            rhinmass Newbie

                            Can you help me with the "1 line of code"?  I have the mBeanServer obtained from ManagementFactory.getPlatformMBeanServer.

                             

                            One difficulty I'm having is in determining the ObjectName for the QueueControl object that will get me access to the hornetq.

                             

                            Assuming I could get that, I would then call mBeanServer.getObjectInstance(objectName)  right?

                             

                            That would return an org.jboss.mx.server.ServerObjectInstance. 

                             

                            I then need to convert that to a QueueControl, right? Is that just a cast?

                             

                            QueueControl queueControl = (QueueControl) mBeamServer.getObjectInstance(objectName)  ??

                             

                            I really appreciate yours and everyone's time in answering these endless queries.  Please understand that what is trivial to you, is often a big stumbling block for those of us trying to learn, so any help would be so very much appreciated. Thanks!!

                            • 11. Re: Looking for QueueControl example
                              rhinmass Newbie

                              Making a little progress but still stuck.

                               

                              I was able to construct an object name corresponding to the queue I want to control.  I called the mBeanServer and got an ObjectInstance.

                               

                              ObjectInstance objInst = mBeanServer.getObjectInstance(on);

                               

                              I think I just need to convert the objInst to a QueueControl or a QueueControlImpl, and this is where I am stuck. 

                               

                              I get:

                               

                                 org.jboss.mx.server.ServerObjectInstance cannot be cast to org.hornetq.api.core.management.QueueControl

                              • 12. Re: Looking for QueueControl example
                                rhinmass Newbie

                                This seems to work: (from http://community.jboss.org/wiki/HowCanAnEJBCallAnMBean)

                                 

                                SimpleString queueId = new SimpleString(queueName);

                                ObjectName on = ObjectNameBuilder.DEFAULT.getQueueObjectName(queueId, queueId); 

                                QueueControl queueControl =MBeanServerInvocationHandler.newProxyInstance(mBeanServer, on, QueueControl.class, false);

                                 

                                My question now is - is this the preferred way to do this?  I'm running in the same VM as the JBoss/JNDI/hornetq (JBoss 6.0.0.Final)

                                • 13. Re: Looking for QueueControl example
                                  Clebert Suconic Master

                                  Yes... that's a good way to go