1 21 package com.presumo.jms.client; 22 23 import com.presumo.jms.message.JmsMessage; 24 25 import java.util.Enumeration ; 26 import java.util.NoSuchElementException ; 27 28 import javax.jms.JMSException ; 29 import javax.jms.Queue ; 30 import javax.jms.QueueBrowser ; 31 import javax.jms.QueueReceiver ; 32 33 38 public final class JmsQueueBrowser implements QueueBrowser 39 { 40 47 public static final int DEFAULT_TIMEOUT = 10000; 48 public static final String END_OF_STREAM_PROP = "JMSX_END_OF_STREAM"; 49 50 51 private QueueReceiver receiver; 55 private boolean browserCreated; 56 private int timeout = DEFAULT_TIMEOUT; 57 58 62 JmsQueueBrowser(JmsQueueReceiver receiver) 63 { 64 this.receiver = receiver; 65 } 66 67 71 77 public void setTimeout(int timeout) 78 { 79 this.timeout = timeout; 80 } 81 82 public Queue getQueue() throws JMSException 83 { 84 return receiver.getQueue(); 85 } 86 87 public String getMessageSelector() throws JMSException 88 { 89 return receiver.getMessageSelector(); 90 } 91 92 public void close() throws JMSException 93 { 94 receiver.close(); 95 } 96 97 public Enumeration getEnumeration() throws JMSException 98 { 99 if (browserCreated) 100 throw new JMSException ("Only one Enumeration is allowed per QueueBrowser"); 101 browserCreated = true; 102 return new BrowserEnumeration(); 103 } 104 105 106 110 public class BrowserEnumeration implements Enumeration 111 { 112 private JmsMessage nextMessage; 113 private boolean endOfQueue; 114 115 BrowserEnumeration() throws JMSException 116 { 117 } 118 119 public boolean hasMoreElements() 120 { 121 if (nextMessage == null) 122 readNextMessage(); 123 return (nextMessage != null); 124 } 125 126 127 public Object nextElement() 128 { 129 if (nextMessage == null) { 130 readNextMessage(); 131 if (nextMessage == null) 132 throw new NoSuchElementException (); 133 } 134 JmsMessage retval = nextMessage; 135 retval.acknowledge(); 136 nextMessage = null; 137 return retval; 138 } 139 140 141 private void readNextMessage() 142 { 143 if (endOfQueue) 144 return; 145 try { 146 JmsMessage msg = (JmsMessage) receiver.receive(timeout); 147 if ( msg != null && !isEndOfQueueMsg(msg) ) 148 { 149 nextMessage = msg; 150 } 151 } catch (JMSException jmsex) {} 152 } 153 154 private boolean isEndOfQueueMsg(JmsMessage msg) 155 { 156 Boolean b = (Boolean ) msg.getObjectProperty(END_OF_STREAM_PROP); 157 if (b != null) { 158 endOfQueue = b.booleanValue(); 159 } 160 return endOfQueue; 161 } 162 } 163 164 168 } 169 | Popular Tags |