com.rabbitmq.utility
Class BlockingCell<T>

java.lang.Object
  extended by com.rabbitmq.utility.BlockingCell<T>
Direct Known Subclasses:
BlockingValueOrException

public class BlockingCell<T>
extends java.lang.Object

Simple one-shot IPC mechanism. Essentially a one-place buffer that cannot be emptied once filled.


Constructor Summary
BlockingCell()
          Instantiate a new BlockingCell waiting for a value of the specified type.
 
Method Summary
 T get()
          Wait for a value, and when one arrives, return it (without clearing it).
 T get(long timeout)
          Wait for a value, and when one arrives, return it (without clearing it).
 void set(T newValue)
          Store a value in this BlockingCell, throwing AssertionError if the cell already has a value.
 boolean setIfUnset(T newValue)
          Store a value in this BlockingCell if it doesn't already have a value.
 T uninterruptibleGet()
          As get(), but catches and ignores InterruptedException, retrying until a value appears.
 T uninterruptibleGet(int timeout)
          As get(long timeout), but catches and ignores InterruptedException, retrying until a value appears or until specified timeout is reached.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

BlockingCell

public BlockingCell()
Instantiate a new BlockingCell waiting for a value of the specified type.

Method Detail

get

public T get()
      throws java.lang.InterruptedException
Wait for a value, and when one arrives, return it (without clearing it). If there's already a value present, there's no need to wait - the existing value is returned.

Returns:
the waited-for value
Throws:
java.lang.InterruptedException - if this thread is interrupted

get

public T get(long timeout)
      throws java.lang.InterruptedException,
             java.util.concurrent.TimeoutException
Wait for a value, and when one arrives, return it (without clearing it). If there's already a value present, there's no need to wait - the existing value is returned. If timeout is reached and value hasn't arrived, TimeoutException is thrown.

Parameters:
timeout - timeout in milliseconds. -1 effectively means infinity
Returns:
the waited-for value
Throws:
java.lang.InterruptedException - if this thread is interrupted
java.util.concurrent.TimeoutException

uninterruptibleGet

public T uninterruptibleGet()
As get(), but catches and ignores InterruptedException, retrying until a value appears.

Returns:
the waited-for value

uninterruptibleGet

public T uninterruptibleGet(int timeout)
                     throws java.util.concurrent.TimeoutException
As get(long timeout), but catches and ignores InterruptedException, retrying until a value appears or until specified timeout is reached. If timeout is reached, TimeoutException is thrown. We also use System.nanoTime() to behave correctly when system clock jumps around.

Parameters:
timeout - timeout in milliseconds. -1 means 'infinity': never time out
Returns:
the waited-for value
Throws:
java.util.concurrent.TimeoutException

set

public void set(T newValue)
Store a value in this BlockingCell, throwing AssertionError if the cell already has a value.

Parameters:
newValue - the new value to store

setIfUnset

public boolean setIfUnset(T newValue)
Store a value in this BlockingCell if it doesn't already have a value.

Parameters:
newValue - the new value to store
Returns:
true if this call to setIfUnset actually updated the BlockingCell; false if the cell already had a value.