?? durableconsumerendpoint.java
字號:
/**
* Redistribution and use of this software and associated documentation
* ("Software"), with or without modification, are permitted provided
* that the following conditions are met:
*
* 1. Redistributions of source code must retain copyright
* statements and notices. Redistributions must also contain a
* copy of this document.
*
* 2. Redistributions in binary form must reproduce the
* above copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other
* materials provided with the distribution.
*
* 3. The name "Exolab" must not be used to endorse or promote
* products derived from this Software without prior written
* permission of Exoffice Technologies. For written permission,
* please contact info@exolab.org.
*
* 4. Products derived from this Software may not be called "Exolab"
* nor may "Exolab" appear in their names without prior written
* permission of Exoffice Technologies. Exolab is a registered
* trademark of Exoffice Technologies.
*
* 5. Due credit should be given to the Exolab Project
* (http://www.exolab.org/).
*
* THIS SOFTWARE IS PROVIDED BY EXOFFICE TECHNOLOGIES AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT
* NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
* EXOFFICE TECHNOLOGIES OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
*
* Copyright 2001-2005 (C) Exoffice Technologies Inc. All Rights Reserved.
*
* $Id: DurableConsumerEndpoint.java,v 1.2 2005/03/18 03:58:39 tanderson Exp $
*/
package org.exolab.jms.messagemgr;
import java.sql.Connection;
import java.util.Iterator;
import java.util.List;
import javax.jms.InvalidSelectorException;
import javax.jms.JMSException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.exolab.jms.client.JmsTopic;
import org.exolab.jms.persistence.DatabaseService;
import org.exolab.jms.persistence.SQLHelper;
import org.exolab.jms.scheduler.Scheduler;
import org.exolab.jms.server.JmsServerSession;
import org.exolab.jms.server.JmsServerSession;
/**
* A {@link ConsumerEndpoint} for durable topic consumers.
* The state of durable topic consumers is maintained across server
* invocations by the persistent layer.
*
* @author <a href="mailto:jima@comware.com.au">Jim Alateras</a>
* @author <a href="mailto:tma@netspace.net.au">Tim Anderson</a>
* @version $Revision: 1.2 $ $Date: 2005/03/18 03:58:39 $
*/
public class DurableConsumerEndpoint
extends AbstractTopicConsumerEndpoint {
/**
* The persistent name of the durable subscriber
*/
private final String _name;
/**
* The logger
*/
private static final Log _log
= LogFactory.getLog(DurableConsumerEndpoint.class);
/**
* Create an durable consumer endpoint. This is a well-known endpoint which
* can only be activated by one client at any one time.
* <p/>
* DurableConsumerEndpoints are always loaded in memory, whether they are
* active or inactive. When they are inactive they simply process persistent
* messages. Non-persistent message are ignored when the durable consumer is
* inactive.
*
* @param consumerId the identity of this consumer
* @param session the owning session
* @param topic the topic to access
* @param name the well known name of the durable subscriber
* @param selector the message selector. May be <code>null</code>
* @param noLocal if true, inhibits the delivery of messages published by
* its own connection.
* @param scheduler used to schedule asynchronous message delivery.
* @throws InvalidSelectorException if the selector is invalid
* @throws JMSException if the destination caches can't be
* constructed
*/
public DurableConsumerEndpoint(long consumerId, JmsServerSession session,
JmsTopic topic, String name, String selector,
boolean noLocal, Scheduler scheduler)
throws InvalidSelectorException, JMSException {
super(consumerId, session, topic, selector, noLocal, scheduler);
_name = name;
// call the persistence adapter to retrieve the state of this consumer
Connection connection = null;
try {
connection = DatabaseService.getConnection();
// remove expired messages
DatabaseService.getAdapter().removeExpiredMessageHandles(
connection, _name);
TopicDestinationCache cache = (TopicDestinationCache)
DestinationManager.instance().getDestinationCache(topic);
// @todo - broken for wildcard subscriptions
// getMessageHandles() needs to return all handles for a given
// subscription name
List handles = cache.getDurableMessageHandles(_name, connection);
connection.commit();
// iterate over each handle and add them to the list of messages
// for the durable consumer
Iterator iterator = handles.iterator();
while (iterator.hasNext()) {
MessageHandle handle = (MessageHandle) iterator.next();
TopicConsumerMessageHandle consumer =
new TopicConsumerMessageHandle(handle, this);
addMessage(consumer);
}
} catch (Exception exception) {
SQLHelper.rollback(connection);
String msg = "Failed to create durable consumer, name=" + name
+ ", for topic=" + topic.getName();
_log.error(msg, exception);
throw new JMSException(msg + ": " + exception.getMessage());
} finally {
SQLHelper.close(connection);
}
init();
}
/**
* Determines if this is a persistent or non-persistent consumer.
* <p/>
* If persistent, then the consumer is persistent accross subscriptions and
* server restarts, and {@link #getPersistentId} returns a non-null value
*
* @return <code>true</code>
*/
public boolean isPersistent() {
return true;
}
/**
* Returns the persistent identifier for this consumer.
* <p/>
* This is the identity of the consumer which is persistent across
* subscriptions and server restarts.
* <p/>
* This implementation returns the consumer name.
*
* @return the persistent identifier for this consumer
*/
public String getPersistentId() {
return _name;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -