IPC::PubSub3pm
Interprocess publish/subscribe channels
Usage
# A new message bus with the DBM::Deep backend# (Other possible backends include Memcached and PlainHash)my $bus = IPC::PubSub->new(DBM_Deep => '/tmp/pubsub.db');# A channel is any arbitrary stringmy $channel = '#perl6';# Register a new publisher (you can publish to multiple channels)my $pub = $bus->new_publisher("#perl6", "#moose");# Publish a message (may be a complex object) to those channels$pub->msg("This is a message");# Register a new subscriber (you can subscribe to multiple channels)my $sub = $bus->new_subscriber("#moose");# Publish an object to channels$pub->msg("This is another message");# Set all subsequent messages from this publisher to expire in 30 seconds$pub->expiry(30);$pub->msg("This message will go away in 30 seconds");# Simple get: Returns the messages sent since the previous get,# but only for the first channel.my @msgs = $sub->get;# Simple get, with an explicit channel key (must be among the ones# it initially subscribed to)my @moose_msgs = $sub->get("#moose");# Complex get: Returns a hash reference from channels to array# references of [timestamp, message].my $hash_ref = $sub->get_all;# Changing the list of channels we subscribe to$sub->subscribe('some-other-channel');$sub->unsubscribe('some-other-channel');# Changing the list of channels we publish to$pub->publish('some-other-channel');$pub->unpublish('some-other-channel');# Listing and checking if we are in a channelmy @sub_channels = $sub->channels;my @pub_channels = $pub->channels;print "Sub is in #moose" if $sub->channels->{'#moose'};print "Pub is in #moose" if $pub->channels->{'#moose'};# Raw cache manipulation APIs (not advised; use ->modify instead)$bus->lock('channel');$bus->unlock('channel');my @timed_msgs = $bus->fetch('key1', 'key2', 'key3');$bus->store('key', 'value', time, 30);# Atomic updating of cache content; $_ is stored back on the# end of the callback.my $rv = $bus->modify('key' => sub { delete $_->{foo} });# Shorthand for $bus->modify('key' => sub { $_ = 'val' });$bus->modify('key' => 'val');# Shorthand for $bus->modify('key' => sub { $_ });$bus->modify('key');# Disconnect the backend connection explicitly$bus->disconnect;
Overview
This module provides a simple API for publishing messages to channels and for subscribing to them.
When a message is published on a channel, all subscribers currently in that channel will get it on their next "get" or "get_all" call.
Currently, it offers four backends: "DBM_Deep" for on-disk storage, "Memcached" for possibly multi-host storage, "Jifty::DBI" for database-backed storage, and "PlainHash" for single-process storage.
Please see the tests in t/ for this distribution, as well as "SYNOPSIS" above, for some usage examples; detailed documentation is not yet available.
Releases
9 releases since Debian 5.0 (Lenny); the text changed 3 times.