Mercurial > projects > ldc
diff tango/tango/net/cluster/NetworkQueue.d @ 132:1700239cab2e trunk
[svn r136] MAJOR UNSTABLE UPDATE!!!
Initial commit after moving to Tango instead of Phobos.
Lots of bugfixes...
This build is not suitable for most things.
author | lindquist |
---|---|
date | Fri, 11 Jan 2008 17:57:40 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/net/cluster/NetworkQueue.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,112 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: July 2004: Initial release + + author: Kris + +*******************************************************************************/ + +module tango.net.cluster.NetworkQueue; + +private import tango.net.cluster.NetworkClient; + +/******************************************************************************* + + Exposes a gateway to the cluster queues, which collect ICached + objects until they are removed. Because there is a finite limit + to the quantity of entries stored, the put() method may throw a + ClusterFullException if it cannot add a new entry. + +*******************************************************************************/ + +class NetworkQueue : NetworkClient, IConsumer +{ + private IChannel reply; + private IConsumer consumer; + + /*********************************************************************** + + Construct a NetworkMessage gateway on the provided QOS cluster + for the specified channel. Each subsequent queue operation + will take place over the given channel. + + You can listen for cluster replies by providing an optional + ChannelListener. Outgoing messages will be tagged appropriately + such that a consumer can respond using IEvent.reply + + ***********************************************************************/ + + this (ICluster cluster, char[] channel, ChannelListener listener = null) + { + super (cluster, channel); + + if (listener) + { + reply = cluster.createChannel (channel ~ ".reply"); + consumer = reply.createConsumer (listener); + } + } + + /*********************************************************************** + + Add an IMessage entry to the corresponding queue. This + will throw a ClusterFullException if there is no space + left in the clustered queue. + + ***********************************************************************/ + + void put (IMessage message) + { + assert (message); + + if (reply) + message.reply = reply.name; + + channel.putQueue (message); + } + + /*********************************************************************** + + Query the cluster for queued entries on our corresponding + channel. Returns, and removes, a matching entry from the + cluster. This is the synchronous (polling) approach; you + should use createConsumer() instead for asynchronous style + notification instead. + + ***********************************************************************/ + + IMessage get () + { + return channel.getQueue; + } + + /*********************************************************************** + + Cancel the listener. No more events will be dispatched to + the reply ChannelListener. + + ***********************************************************************/ + + void cancel() + { + if (consumer) + consumer.cancel; + consumer = null; + } + + /*********************************************************************** + + Create a listener for this channel. Listeners are invoked + when new content is placed into a corresponding queue. + + ***********************************************************************/ + + IConsumer createConsumer (ChannelListener listener) + { + return channel.createConsumer (listener); + } +}