1 /***
2 *
3 * Copyright 2004 Protique Ltd
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 **/
18
19 package org.codehaus.activemq;
20
21 import org.codehaus.activemq.message.ActiveMQDestination;
22
23 import javax.jms.JMSException;
24 import javax.jms.Queue;
25 import javax.jms.QueueBrowser;
26 import java.util.Enumeration;
27
28 /***
29 * A client uses a <CODE>QueueBrowser</CODE> object to look at messages on a
30 * queue without removing them.
31 * <p/>
32 * <P>
33 * The <CODE>getEnumeration</CODE> method returns a <CODE>
34 * java.util.Enumeration</CODE> that is used to scan the queue's messages. It
35 * may be an enumeration of the entire content of a queue, or it may contain
36 * only the messages matching a message selector.
37 * <p/>
38 * <P>
39 * Messages may be arriving and expiring while the scan is done. The JMS API
40 * does not require the content of an enumeration to be a static snapshot of
41 * queue content. Whether these changes are visible or not depends on the JMS
42 * provider.
43 * <p/>
44 * <P>
45 * A <CODE>QueueBrowser</CODE> can be created from either a <CODE>Session
46 * </CODE> or a <CODE>QueueSession</CODE>.
47 *
48 * @see javax.jms.Session#createBrowser
49 * @see javax.jms.QueueSession#createBrowser
50 * @see javax.jms.QueueBrowser
51 * @see javax.jms.QueueReceiver
52 */
53
54 public class ActiveMQQueueBrowser extends ActiveMQMessageConsumer implements
55 QueueBrowser, Enumeration {
56
57 /***
58 * Constructor for an ActiveMQQueueBrowser - used internally
59 *
60 * @param theSession
61 * @param dest
62 * @param selector
63 * @param cnum
64 * @throws JMSException
65 */
66 protected ActiveMQQueueBrowser(ActiveMQSession theSession,
67 ActiveMQDestination dest, String selector, int cnum)
68 throws JMSException {
69 super(theSession, dest, "", selector, cnum, theSession.connection.getPrefetchPolicy().getQueueBrowserPrefetch(), false, true);
70 }
71
72 /***
73 * Gets the queue associated with this queue browser.
74 *
75 * @return the queue
76 * @throws JMSException if the JMS provider fails to get the queue associated
77 * with this browser due to some internal error.
78 */
79
80 public Queue getQueue() throws JMSException {
81 return (Queue) getDestination();
82 }
83
84 /***
85 * Gets an enumeration for browsing the current queue messages in the order
86 * they would be received.
87 *
88 * @return an enumeration for browsing the messages
89 * @throws JMSException if the JMS provider fails to get the enumeration for this
90 * browser due to some internal error.
91 */
92
93 public Enumeration getEnumeration() throws JMSException {
94 checkClosed();
95
96 if (super.messageQueue.size() == 0) {
97 try {
98 Thread.sleep(1000);
99 }
100 catch (InterruptedException e) {
101 }
102 }
103 return this;
104 }
105
106 /***
107 * @return true if more messages to process
108 */
109 public boolean hasMoreElements() {
110
111 return super.messageQueue.size() > 0;
112 }
113
114 /***
115 * @return the next message
116 */
117 public Object nextElement() {
118 Object answer = null;
119 try {
120 answer = super.receiveNoWait();
121 }
122 catch (JMSException e) {
123 e.printStackTrace();
124 }
125 return answer;
126 }
127
128 }