001: /*
002: * JacORB - a free Java ORB
003: *
004: * Copyright (C) 1997-2004 Gerald Brose.
005: *
006: * This library is free software; you can redistribute it and/or
007: * modify it under the terms of the GNU Library General Public
008: * License as published by the Free Software Foundation; either
009: * version 2 of the License, or (at your option) any later version.
010: *
011: * This library is distributed in the hope that it will be useful,
012: * but WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * Library General Public License for more details.
015: *
016: * You should have received a copy of the GNU Library General Public
017: * License along with this library; if not, write to the Free
018: * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
019: */
020:
021: package org.jacorb.orb.giop;
022:
023: import org.apache.avalon.framework.configuration.*;
024:
025: /**
026: * @author Nicolas Noffke
027: * @version $Id: ClientGIOPConnection.java,v 1.17 2006/06/28 12:41:43 alphonse.bendt Exp $
028: */
029: public class ClientGIOPConnection extends GIOPConnection implements
030: Configurable {
031: private boolean ignore_pending_messages_on_timeout = false;
032:
033: public ClientGIOPConnection(org.omg.ETF.Profile profile,
034: org.omg.ETF.Connection transport,
035: RequestListener request_listener,
036: ReplyListener reply_listener,
037: StatisticsProvider statistics_provider) {
038: super (profile, transport, request_listener, reply_listener,
039: statistics_provider);
040: }
041:
042: public void configure(Configuration configuration)
043: throws ConfigurationException {
044: super .configure(configuration);
045:
046: ignore_pending_messages_on_timeout = configuration
047: .getAttribute(
048: "jacorb.connection.client.timeout_ignores_pending_messages",
049: "off").equals("on");
050: }
051:
052: /**
053: * Client-side implementation what to do when a read on the
054: * underlying transport times out. If we have no pending messages
055: * for which we haven't received a reply yet, or if the property
056: * jacorb.connection.client.timeout_ignores_pending_messages is on,
057: * then we close the transport, but allow it to be reopened later.
058: * If we have pending message and are not allowed to ignore that,
059: * do nothing.
060: */
061: protected void readTimedOut() {
062: if (logger.isDebugEnabled()) {
063: logger.debug(this .toString() + ": readTimedOut()");
064: }
065:
066: synchronized (pendingUndecidedSync) {
067: if (ignore_pending_messages_on_timeout) {
068: this .streamClosed();
069: } else if (!hasPendingMessages()) {
070: closeAllowReopen();
071: } else {
072: if (logger.isDebugEnabled()) {
073: logger
074: .debug(this .toString()
075: + ": cannot close because there are pending messages");
076: }
077: }
078: }
079: }
080:
081: /**
082: * Client-side implementation what to do when the underlying transport
083: * is closed during a read operation. We mark the transport as closed
084: * and allow it to be reopened later, when the client retries.
085: */
086: protected void streamClosed() {
087: if (logger.isDebugEnabled()) {
088: logger.debug(this .toString() + ": streamClosed()");
089: }
090:
091: closeAllowReopen();
092:
093: if (connection_listener != null) {
094: connection_listener.streamClosed();
095: }
096: }
097:
098: /**
099: * Closes the underlying transport, but keeps this ClientGIOPConnection
100: * alive. If, subsequently, another request is sent to this connection,
101: * it will try to reopen the transport.
102: */
103: public void closeAllowReopen() {
104: if (logger.isDebugEnabled()) {
105: logger.debug(this .toString() + ": closeAllowReopen()");
106: }
107:
108: try {
109: synchronized (connect_sync) {
110: getWriteLock();
111: transport.close();
112: // We expect that the same transport can be reconnected
113: // after a close, something that the ETF draft isn't
114: // particularly clear about.
115: }
116: } finally {
117: releaseWriteLock();
118: }
119: }
120:
121: public String toString() {
122: return "ClientGIOPConnection to " + profile.toString() + " ("
123: + Integer.toHexString(this .hashCode()) + ")";
124: }
125:
126: }// ClientGIOPConnection
|