The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

NAME

POEx::ZMQ - Asynchronous ZeroMQ sockets for POE

SYNOPSIS

  # An example ZMQ_ROUTER socket ->
  use POE;
  use POEx::ZMQ;

  POE::Session->create(
    inline_states => +{
      _start => sub {
        # Set up a ROUTER; save our Context for creating other sockets later:
        $_[HEAP]->{ctx} = POEx::ZMQ->context;

        $_[HEAP]->{rtr} = POEx::ZMQ->socket(
          context => $_[HEAP]->{ctx},
          type    => ZMQ_ROUTER,
        );

        $_[HEAP]->{rtr}->start;

        $_[HEAP]->{rtr}->bind( 'tcp://127.0.0.1:1234' );
      },

      zmq_recv_multipart => sub {
        # ROUTER got message from REQ; sender identity is prefixed,
        # parts are available as a List::Objects::WithUtils::Array ->
        my $parts = $_[ARG0];
        my ($id, undef, $content) = $parts->all;

        my $response;
        # ...

        # $_[SENDER] was the ROUTER socket, send a response back:
        $_[KERNEL]->post( $_[SENDER], send_multipart =>
          $id, '', $response
        );
      },
    },
  );

  POE::Kernel->run;

DESCRIPTION

A POE component providing non-blocking ZeroMQ (versions 3.x & 4.x) integration.

See POEx::ZMQ::Socket for details on using sockets.

Each ZeroMQ socket is an event emitter powered by MooX::Role::POE::Emitter; the documentation for that distribution is likely to be helpful.

This is early-development software, as indicated by the 0.x version number. The test suite is incomplete, bugs are sure to be lurking, documentation is not yet especially verbose, and the API is not completely guaranteed. Issues & pull requests are welcome, of course: http://www.github.com/avenj/poex-zmq

If you are not using POE, try ZMQ::FFI for an excellent loop-agnostic ZeroMQ implementation.

import

Importing this package brings in the full set of POEx::ZMQ::Constants, and ensures POEx::ZMQ::Socket is loaded.

context

  my $ctx = POEx::ZMQ->context(max_sockets => 512);

Returns a new POEx::ZMQ::FFI::Context. @_ is passed through.

The context object should be shared between sockets belonging to the same process; a forked child process should create a new context with its own set of sockets.

socket

  my $sock = POEx::ZMQ->socket(context => $ctx, type => ZMQ_ROUTER);

Returns a new POEx::ZMQ::Socket. @_ is passed through.

AUTHOR

Jon Portnoy <avenj@cobaltirc.org>

Significant portions of the POEx::ZMQ::FFI backend are inspired by or derived from ZMQ::FFI (version 0.14) by Dylan Cali (CPAN: CALID).

Licensed under the same terms as Perl.