i have 2 simple ejb beans. first 1 timer method called every second. in method add 10 random messages testqueue.
@singleton @startup public class timer { @inject private jmscontext context; @resource(mappedname = "java:/jms/queue/testqueue") private queue queue; @schedule(hour = "*", minute = "*", second = "*/1", persistent = false) @accesstimeout(unit = timeunit.days, value = 1) public void addtoqueue() { for(int = 0; i<30; i++) context.createproducer().send(queue, "msg " + (new random().nextint(100))); printqueuesize(); } public void printqueuesize() { queuebrowser qb = context.createbrowser(queue); enumeration enumeration = null; try { enumeration = qb.getenumeration(); } catch (jmsexception e) { e.printstacktrace(); } int size = 0; while(enumeration.hasmoreelements()) { enumeration.nextelement(); size++; } system.out.println("queue size: " + size); } } second bean mdb consumer. put thread.sleep(100) simulate long running task , make sure there messages in testqueue.
@messagedriven( activationconfig = { @activationconfigproperty(propertyname = "destination", propertyvalue = "java:/jms/queue/testqueue"), @activationconfigproperty(propertyname = "destinationtype", propertyvalue = "javax.jms.queue"), @activationconfigproperty(propertyname = "maxsession", propertyvalue = "1") }) public class consumer implements messagelistener { @override public void onmessage(message msg) { try { thread.sleep(100); } catch (interruptedexception e) { e.printstacktrace(); } } } the problem console output shows:
15:06:29,006 info [stdout] (ejb default - 9) queue size: 0 15:06:30,006 info [stdout] (ejb default - 10) queue size: 0 15:06:31,009 info [stdout] (ejb default - 1) queue size: 0 etc.
but in wildfly admin console can see there more , more messages every second:

the question is, why queuebrowser return empty enumeration? bug in hornetq implementation or there reason that?
although not answer question, show how queue size in hornetq, in ejb service:
initialcontext initialcontext = null; try { // step 1. create initial context perform jndi lookup. initialcontext = getcontext(); // step 2. perfom lookup on queue queue queue = (queue) initialcontext.lookup("jmx/queue/your_queue_name"); // step 7. use jmx retrieve message counters using // jmsqueuecontrol objectname on = objectnamebuilder.default .getjmsqueueobjectname(queue.getqueuename()); jmxconnector connector = jmxconnectorfactory.connect(new jmxserviceurl("service:jmx:http-remoting-jmx://localhost:9990"), new hashmap<string, object>());//this url wildfly 8.2 (should work 8.x) mbeanserverconnection mbsc = connector.getmbeanserverconnection(); jmsqueuecontrol queuecontrol = mbeanserverinvocationhandler.newproxyinstance(mbsc, on, jmsqueuecontrol.class, false); // step 8. list message counters , convert them // messagecounterinfo data structure. string counters = queuecontrol.listmessagecounter(); messagecounterinfo messagecounter = messagecounterinfo.fromjson(counters); queuecontrol.getconsumercount();//this returns consumer count queuecontrol.getmessagesadded();//returns messages added last time checked queuecontrol.ispaused();//prints out, whether queue paused (you can stop queue being processed e.g. jmx) queuecontrol.getmessagecount();//message count far } { // step 17. sure close our jms resources! if (initialcontext != null) { initialcontext.close(); } }
Comments
Post a Comment