⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 managedconnectionhandle.java

📁 OpenJMS是一个开源的Java Message Service API 1.0.2 规范的实现,它包含有以下特性: *. 它既支持点到点(point-to-point)(PTP)模型和发布/订
💻 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 2004-2005 (C) Exoffice Technologies Inc. All Rights Reserved. * * $Id: ManagedConnectionHandle.java,v 1.8 2006/12/16 12:37:17 tanderson Exp $ */package org.exolab.jms.net.connector;import org.exolab.jms.net.uri.URI;import java.security.Principal;/** * A handle to a {@link ManagedConnection} that tracks its utilisation. * * @author <a href="mailto:tma@netspace.net.au">Tim Anderson</a> * @version $Revision: 1.8 $ $Date: 2006/12/16 12:37:17 $ */final class ManagedConnectionHandle implements ManagedConnection {    /**     * The connection pool that owns this.     */    private final DefaultConnectionPool _pool;    /**     * The connection to delegate all requests to.     */    private final ManagedConnection _connection;    /**     * The connection factory for resolving connections via their URI.     */    private final ConnectionFactory _resolver;    /**     * The no. of active ConnectionHandle instances.     */    private int _connectionCount = 0;    /**     * Determines if the connection has been since {@link #clearUsed} was     * last invoked.     */    private boolean _used = false;    /**     * Determines if a ping is in progress.     */    private boolean _pinging = false;    /**     * The no. of times {@link #incPingWaits} has been invoked since the last     * {@link #ping}.     */    private int _pingWaits;    /**     * Construct a new <code>ManagedConnectionHandle</code>.     *     * @param pool       the pool that owns this     * @param connection the connection to delegate requests to     * @param resolver   the connection factory for resolving connections via     *                   their URI.     */    public ManagedConnectionHandle(DefaultConnectionPool pool,                                   ManagedConnection connection,                                   ConnectionFactory resolver) {        _pool = pool;        _connection = connection;        _resolver = resolver;    }    /**     * Registers a handler for handling invocations on objects exported via this     * connection. Once a handler is registered, it cannot be de-registered.     *     * @param handler the invocation handler     * @throws IllegalStateException if a handler is already registered     * @throws ResourceException     for any error     */    public void setInvocationHandler(InvocationHandler handler)            throws ResourceException {        _connection.setInvocationHandler(handler);    }    /**     * Registers a connection event listener.     *     * @param listener the connection event listener     * @throws ResourceException for any error     */    public void setConnectionEventListener(ManagedConnectionListener listener)            throws ResourceException {        _connection.setConnectionEventListener(listener);    }    /**     * Creates a new connection handle for the underlying physical connection.     *     * @return a new connection handle     * @throws IllegalStateException if an <code>InvocationHandler</code> hasn't     *                               been registered     * @throws ResourceException     for any error     */    public Connection getConnection() throws ResourceException {        Connection connection = _connection.getConnection();        return new ConnectionHandle(connection);    }    /**     * Ping the connection. The connection event listener will be notified     * if the ping succeeds.     *     * @throws ResourceException for any error     */    public synchronized void ping() throws ResourceException {        try {            _pinging = true;            _pingWaits = 0;            _connection.ping();        } catch (ResourceException exception) {            _pinging = false;            throw exception;        }    }    /**     * Determines if a ping has been sent.     *     * @return <code>true</code> if a ping has been sent     */    public synchronized boolean pinging() {        return _pinging;    }    /**     * Notifies of a ping response.     * Clears the ping status, and resets the ping wait to <code>0</code>.     */    public synchronized void pinged() {        _pinging = false;        _pingWaits = 0;    }    /**     * Increments the no. of times this connection has waited for a ping     * response.     *     * @return the no. of times this connection has waited for a ping response     */    public synchronized int incPingWaits() {        return ++_pingWaits;    }    /**     * Returns the remote address to which this is connected.     *     * @return the remote address to which this is connected     * @throws ResourceException for any error     */    public URI getRemoteURI() throws ResourceException {        return _connection.getRemoteURI();    }    /**     * Returns the local address that this connection is bound to.     *     * @return the local address that this connection is bound to     * @throws ResourceException for any error     */    public URI getLocalURI() throws ResourceException {        return _connection.getLocalURI();    }    /**     * Returns the principal associated with this connection.     *     * @return the principal associated with this connection,     *         or <code>null<code> if none is set     * @throws ResourceException for any error     */    public Principal getPrincipal() throws ResourceException {        return _connection.getPrincipal();    }    /**     * Destroys the physical connection.     *     * @throws ResourceException for any error     */    public void destroy() throws ResourceException {        _connection.destroy();    }    /**     * Marks the connection as being used.     */    public synchronized void setUsed() {        _used = true;    }    /**     * Determines if the connection has been used since {@link #clearUsed}     * was last invoked.     */    public synchronized boolean used() {        return _used;    }    /**     * Marks the connection as being unused.     */    public synchronized void clearUsed() {        _used = false;    }    /**     * Determines if the connection can be destroyed. The connection     * can be destroyed if there are no associated {@link Connection} instances,     * and it has been used since {@link #clearUsed} was invoked.     *     * @return <code>true</code> if the connection may be destroyed     */    public synchronized boolean canDestroy() {        return (_connectionCount == 0) && (!_used);    }    /**     * Increment the no. of references to this connection.     */    private synchronized void incActiveConnections() {        ++_connectionCount;    }    /**     * Decrement the no. of references to this connection.     */    private synchronized void decActiveConnections() {        --_connectionCount;        if (_connectionCount <= 0) {            _pool.idle(this);        }    }    public boolean usedSinceLastPing() {        return false;  //To change body of created methods use File | Settings | File Templates.    }    /**     * Helper class reference count a {@link Connection} instance.     */    private class ConnectionHandle implements Connection {        /**         * The connection to delegate all requests to.         */        private Connection _connection;        /**         * Construct a new <code>ConnectionHandle</code>.         *         * @param connection the connection to delegate requests to         */        public ConnectionHandle(Connection connection) {            _connection = connection;            incActiveConnections();        }        /**         * Invoke a method on a remote object.         *         * @param request the request         * @return the result of the invocation         * @throws Throwable for any transport error         */        public Response invoke(Request request) throws Throwable {            Response response = null;            setUsed();            try {                ConnectionContext.push(getPrincipal(), _resolver);                response = _connection.invoke(request);            } finally {                ConnectionContext.pop();            }            return response;        }        /**         * Returns the remote address to which this is connected.         *         * @return the remote address to which this is connected         * @throws ResourceException for any error         */        public URI getRemoteURI() throws ResourceException {            return _connection.getRemoteURI();        }        /**         * Returns the local address that this connection is bound to.         *         * @return the local address that this connection is bound to         * @throws ResourceException for any error         */        public URI getLocalURI() throws ResourceException {            return _connection.getLocalURI();        }        /**         * Close this connection, releasing any allocated resources.         *         * @throws ResourceException for any error.         */        public void close() throws ResourceException {            try {                _connection.close();            } finally {                _connection = null;                decActiveConnections();            }        }        /**         * Called by the garbage collector when there are no more references to         * the object.         */        protected void finalize() throws Throwable {            if (_connection != null) {                decActiveConnections();            }            super.finalize();        }    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -