2011-05-24 81 views
1

我想先知道队列中已有多少条消息。以下类浏览器将返回队列中存在的消息数量。现在,我希望用户输入要从队列中读取的消息数量,并仅向客户端显示该消息的数量。我不想读取队列中的所有消息,但只能读取用户想要读取的消息数量。请检查代码并回复应该完成的操作。从队列中读取消息并将其显示给用户?

public class Browser 
{ 
    public static void main(String[] args) throws Exception 
    { 
    | // get the initial context 
    | InitialContext ctx = new InitialContext(); 
    |                  
    | // lookup the queue object 
    | Queue queue = (Queue) ctx.lookup("queue/queue0"); 
    |                  
    | // lookup the queue connection factory 
    | QueueConnectionFactory connFactory = (QueueConnectionFactory) ctx. 
    |  lookup("queue/connectionFactory"); 
    |                  
    | // create a queue connection 
    | QueueConnection queueConn = connFactory.createQueueConnection(); 
    |                  
    | // create a queue session 
    | QueueSession queueSession = queueConn.createQueueSession(false, 
    |  Session.AUTO_ACKNOWLEDGE); 
    |                  
    | // create a queue browser 
    | QueueBrowser queueBrowser = queueSession.createBrowser(queue); 
    |                  
    | // start the connection 
    | queueConn.start(); 
    |                  
    | // browse the messages 
    | Enumeration e = queueBrowser.getEnumeration(); 
    | int numMsgs = 0; 
    |                  
    | // count number of messages 
    | while (e.hasMoreElements()) { 
    | | Message message = (Message) e.nextElement(); 
    | | numMsgs++; 
    | } 
    |                  
    | System.out.println(queue + " has " + numMsgs + " messages"); 
    |                  
    | // close the queue connection 
    | queueConn.close(); 
    } 
} 


To read the number of messages as per user's requirements.... 
String NUMBER = request.getParameter("number"); 
....... 
....... 
....... 
connection.start(); 
      for (int s = 0; s <= Integer.parseInt(NUMBER); s++){ 
      while (true){ 
       Message m = qReceiver.receive(); 
       if (m != null){ 
        if (m instanceof BytesMessage){ 
         BytesMessage bytesMessage = (BytesMessage)m; 
         PrintStream buffer = null; 
         for (int i = 0; i < (int)bytesMessage.getBodyLength(); i++) { 
          buffer.append((char) bytesMessage.readByte()); 
          } 
          String msg = buffer.toString().trim(); 

          System.out.println("Reading Message: " + msg); 
         }else if (m instanceof TextMessage){ 
         TextMessage textMessage = (TextMessage)m; 
         System.out.println("Reading message: " + textMessage.getText()); 
        }else { 
         break; 
        } 
+0

听起来一样简单,只要循环读取N个消息,其中N是用户请求的数字。为什么不能为你工作,你有什么具体问题? – alpian 2011-05-24 20:02:08

+0

这种类型的功能更多地涉及JMS Broker的管理功能。查看队列中的#msgs不是JMS规范的一部分。你在使用哪个JMS提供程序?很多时候,有一种单独的管理API用于这种事情。例如。 TIBCO EMS,ActiveMQ,IBM MQ都有这种类型的管理API。 – 2018-01-04 08:28:05

回答

0

我假设你使用的是MessageListner,所以一旦有消息出现,就会调用OnMessage()方法。在这种方法中,您可以保留一个计数器,一旦该计数器达到允许的最大值,您可以调用connection.stop()来停止从队列中消费消息。

您可以随时通过再次调用connection.start()重新启动。

相关问题