/*
* Copyright 2003,2004 Colin Crist
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package hermes.browser.tasks;
import hermes.BrowseInterruptedException;
import hermes.Domain;
import hermes.Hermes;
import hermes.browser.HermesBrowser;
import hermes.browser.IconCache;
import hermes.config.DestinationConfig;
import hermes.impl.QueueBrowserWithConsumer;
import java.util.Enumeration;
import java.util.Iterator;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Queue;
import javax.jms.QueueBrowser;
import org.apache.log4j.Logger;
/**
* @author colincrist@hermesjms.com
*/
public class BrowseDestinationTask extends TaskSupport implements Task {
private static final Logger log = Logger.getLogger(BrowseDestinationTask.class);
private Hermes hermes;
private Iterator iter;
private QueueBrowser browser;
private String title = "Browse";
private boolean useMessageConsumer = false;
private boolean queuesOnly = false;
public BrowseDestinationTask(Hermes hermes, final DestinationConfig dConfig) {
super(Domain.getDomain(dConfig.getDomain()).getIcon());
this.hermes = hermes;
this.title = "Browsing " + dConfig.getName() + " on " + hermes.getId();
if (dConfig.isDurable()) {
title = title + " (durableName=" + dConfig.getClientID() + ")";
}
this.iter = new Iterator() {
private boolean first = true;
public void remove() {
// TODO Auto-generated method stub
}
public boolean hasNext() {
return first;
}
public Object next() {
first = false;
return dConfig;
}
};
}
public BrowseDestinationTask(Hermes hermes, Iterator iter) {
super(IconCache.getIcon("jms.unknown"));
this.hermes = hermes;
this.iter = iter;
this.queuesOnly = true; // Can only browse queues when browsing all destinations on a session.
}
public String getTitle() {
return title;
}
protected QueueBrowser createBrowser(Destination destination, DestinationConfig dConfig) throws JMSException {
if (dConfig.getDomain() == Domain.QUEUE.getId() && hermes.getSessionConfig().isUseConsumerForQueueBrowse()) {
log.debug("using a MessageConsumer for the QueueBrowse");
return new QueueBrowserWithConsumer(hermes, (Queue) destination, dConfig.getSelector(), HermesBrowser.getBrowser().getQueueBrowseConsumerTimeout());
} else {
return hermes.createBrowser(dConfig);
}
}
public void stop() {
super.stop();
try {
if (browser != null) {
browser.close();
browser = null;
}
} catch (JMSException e) {
log.error(e.getMessage(), e);
}
}
public void invoke() throws Exception {
while (iter.hasNext()) {
final DestinationConfig dConfig = (DestinationConfig) iter.next();
final boolean shouldBrowse = queuesOnly ? Domain.getDomain(dConfig.getDomain()).equals(Domain.QUEUE) : true ;
int nmessages = 0;
try {
if (shouldBrowse) {
final Destination destination = hermes.getDestination(dConfig.getName(), Domain.getDomain(dConfig.getDomain()));
browser = createBrowser(destination, dConfig);
notifyStatus("Running...");
for (final Enumeration messageIter = browser.getEnumeration(); messageIter.hasMoreElements() && isRunning();) {
final Message message = (Message) messageIter.nextElement();
if (message != null) {
notifyMessage(message);
nmessages++;
} else {
// @TODO May be a bug here, keep an eye out for this
// message recurring!
log.error("Got a null message!");
Thread.sleep(500);
}
}
if (!isRunning()) {
log.debug("user requested stop browse of " + dConfig.getName());
}
}
} catch (BrowseInterruptedException ex) {
log.info("browse of " + getTitle() + " interrupted after " + nmessages);
} catch (InterruptedException ex) {
log.info(ex.getMessage(), ex);
} finally {
log.debug("browse complete nmessages=" + nmessages);
notifyStatus("Done.");
if (browser != null) {
browser.close();
browser = null;
}
hermes.close();
}
}
}
public boolean isUseMessageConsumer() {
return useMessageConsumer;
}
public void setUseMessageConsumer(boolean useMessageConsumer) {
this.useMessageConsumer = useMessageConsumer;
}
}