WaitingThread.java
/*
** Module : WaitingThread.java
** Abstract : represents a waiting thread
**
** Copyright (c) 2005-2017, Golden Code Development Corporation.
**
** -#- -I- --Date-- --JPRM-- ----------------Description-----------------
** 001 SIY 20050113 @19509 Created initial version.
** 002 SIY 20050207 @19711 Allow delivering of the exception in case of
** protocol error or queue termination.
** 003 SIY 20050315 @20396 Minor cleanups.
** 004 NVS 20060208 @24476 Added control flow calls. Changed
** constructor.
** 005 GES 20060728 @28211 Reduced footprint and changed signatures to
** pass some state that is easily available in
** the caller and which greatly improves our
** performance.
** 006 GES 20060811 @28568 Moved Control push/pop back to the caller
** to eliminate a race condition.
** 007 CA 20120227 Do not wait if either the exception (or the
** message) is already received.
*/
/*
** This program is free software: you can redistribute it and/or modify
** it under the terms of the GNU Affero General Public License as
** published by the Free Software Foundation, either version 3 of the
** License, or (at your option) any later version.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU Affero General Public License for more details.
**
** You may find a copy of the GNU Affero GPL version 3 at the following
** location: https://www.gnu.org/licenses/agpl-3.0.en.html
**
** Additional terms under GNU Affero GPL version 3 section 7:
**
** Under Section 7 of the GNU Affero GPL version 3, the following additional
** terms apply to the works covered under the License. These additional terms
** are non-permissive additional terms allowed under Section 7 of the GNU
** Affero GPL version 3 and may not be removed by you.
**
** 0. Attribution Requirement.
**
** You must preserve all legal notices or author attributions in the covered
** work or Appropriate Legal Notices displayed by works containing the covered
** work. You may not remove from the covered work any author or developer
** credit already included within the covered work.
**
** 1. No License To Use Trademarks.
**
** This license does not grant any license or rights to use the trademarks
** Golden Code, FWD, any Golden Code or FWD logo, or any other trademarks
** of Golden Code Development Corporation. You are not authorized to use the
** name Golden Code, FWD, or the names of any author or contributor, for
** publicity purposes without written authorization.
**
** 2. No Misrepresentation of Affiliation.
**
** You may not represent yourself as Golden Code Development Corporation or FWD.
**
** You may not represent yourself for publicity purposes as associated with
** Golden Code Development Corporation, FWD, or any author or contributor to
** the covered work, without written authorization.
**
** 3. No Misrepresentation of Source or Origin.
**
** You may not represent the covered work as solely your work. All modified
** versions of the covered work must be marked in a reasonable way to make it
** clear that the modified work is not originating from Golden Code Development
** Corporation or FWD. All modified versions must contain the notices of
** attribution required in this license.
*/
package com.goldencode.p2j.net;
/**
* This class represents an container which is placed into Pool of Waiting
* Threads (PWT). It also used as an object instance on which thread is put
* into waiting state.
*
* @author SIY
* @version 1.0
*/
class WaitingThread
{
/** A reference to an exception which indicates a failure. */
private Exception exception = null;
/** A reference to the reply message. */
private Message message = null;
/**
* Constructs an empty instance.
*/
WaitingThread()
{
}
/**
* Notify waiting thread that a failure occurred.
*
* @param exception
* An exception to deliver. If it is <code>null</code> then
* thread is awakened but an exception will not be thrown.
*/
synchronized void notifyException(Exception exception)
{
this.exception = exception;
notify();
}
/**
* Notify waiting thread that the reply message that matched the request
* message's ID has arrived.
*
* @param message
* The reply message that was received.
*/
synchronized void notifyMessage(Message message)
{
this.message = message;
notify();
}
/**
* Suspend calling thread and wait until a matching reply message is
* received, an exception is thrown, an interruption occurs or there is
* a timeout. If the timeout parameter is not 0 then the waiting time is
* limited to at least that specified amount of time. If time is 0 then
* the thread waits indefinitely (or until the application or the user's
* session ends). A reply matches if the request ID is the same as the
* given request ID.
*
* @param timeout
* Time to wait for reply message (milliseconds).
*
* @return The reply message or <code>null</code> if no reply is
* received.
*
* @throws InterruptedException
* Forwarded from <code>Object.wait()</code>.
* @throws Exception
* Any other failure.
*/
synchronized Message waitMessage(int timeout)
throws InterruptedException,
Exception
{
// check if the reply has already arrived, if we wait in that case then
// the notify() will never occur because that has already been
// processed
if (message == null && exception == null)
wait(timeout);
if (exception != null)
throw exception;
return message;
}
}