NAME

Reflexive::ZmqSocket - Provides a reflexy way to talk over ZeroMQ sockets

VERSION

version 1.130710

SYNOPSIS

package App::Test;
use Moose;
extends 'Reflex::Base';
use Reflex::Trait::Watched qw/ watches /;
use Reflexive::ZmqSocket::RequestSocket;
use ZeroMQ::Constants(':all');

watches request => (
    isa => 'Reflexive::ZmqSocket::RequestSocket',
    clearer => 'clear_request',
    predicate => 'has_request',
);

sub init {
    my ($self) = @_;

    my $req = Reflexive::ZmqSocket::RequestSocket->new(
        endpoints => [ 'tcp://127.0.0.1:54321' ],
        endpoint_action => 'bind',
        socket_options => {
            +ZMQ_LINGER ,=> 1,
        },
    );

    $self->request($req);
}

sub BUILD {
    my ($self) = @_;
    
    $self->init();
}

sub on_request_message {
    my ($self, $msg) = @_;
}

sub on_request_multipart_message {
    my ($self, $msg) = @_;
    my @parts = map { $_->data } $msg->all_parts;
}

sub on_request_socket_flushed {
    my ($self) = @_;
}

sub on_request_socket_error {
    my ($self, $msg) = @_;
}

sub on_request_connect_error {
    my ($self, $msg) = @_;
}

sub on_request_bind_error {
    my ($self, $msg) = @_;
}

__PACKAGE__->meta->make_immutable();

DESCRIPTION

Reflexive::ZmqSocket provides a reflexy way to participate in ZeroMQ driven applications. A number of events are emitted from the instantiated objects of this class and its subclasses. On successful reads, either "message" or "multipart_message" is emitted. For errors, "socket_error" is emitted. See "EMITTED_EVENTS" for more informations.

PUBLIC_ATTRIBUTES

socket_type

is: ro, isa: enum, lazy: 1

This attribute holds what type of ZeroMQ socket should be built. It must be one of the constants exported by the ZeroMQ::Constants package. The attribute is populated by default in the various subclasses.

endpoints

is: ro, isa: ArrayRef[Str], traits: Array, predicate: has_endpoints

This attribute holds an array reference of all of the endpoints to which the socket should either bind or connect.

The following methods are delegated to this attribute:

endpoints_count
all_endpoints

endpoint_action

is: ro, isa: enum(bind, connect), predicate: has_endpoint_action

This attribute determines the socket action to take against the provided endpoints. While ZeroMQ allows sockets to both connect and bind, this module limits it to either/or. Patches welcome :)

is: ro, isa: HashRef

This attribute has the options for the socket. Options are applied at BUILD time but before any action is taken on the end points. This allows for things like setting the ZMQ_IDENTITY

context

is: ro, isa: ZeroMQ::Context

This attribute holds the context that is required for building sockets.

socket

is: ro, isa: ZeroMQ::Socket

This attribute holds the actual ZeroMQ socket created. The following methods are delegated to this attribute:

recv
getsockopt
setsockopt
close
connect
bind

NOTE: close() is advised to stop polling the zmq_fd /before/ the call to the underlying zmq_close. This means that items in the "buffer" may not be sent or owned by zmq and you are responsible for managing these items.

PROTECTED_ATTRIBUTES

active

is: ro, isa: Bool, default: true

This attribute controls whether the socket is observed or not for reads/writes according to Reflex

is: ro, isa: FileHandle

This attribute contains a file handle built from the cloned file descriptor from inside the ZeroMQ::Socket. This is where the magic happens in how we poll for non-blocking IO.

buffer

is: ro, isa: ArrayRef, traits: Array

Thie attribute is an internal buffer used for non-blocking writes.

The following methods are delegated to this attribute:

buffer_count
dequeue_item
enqueue_item
putback_item

PUBLIC_METHODS

send

This method is for sending messages through the "socket". It is non-blocking and will return the current buffer count.

PROTECTED_METHODS

initialize_endpoints

This method attempts the defined "endpoint_action" against the provided "endpoints". This method is called at BUILD if "active" is true. To defer initialization, simply set "active" to false.

If the provided action against a particular endpoint fails, a connect_error event will be emitted

PRIVATE_METHODS

zmq_writable

This method is used internally to handle when the ZeroMQ socket is ready for writing. This method can emit socket_error for various issues.

zmq_readable

This method is used internally by reflex to actually read from the ZeroMQ socket when it is readable. This method can emit socket_error when problems occur. For successful reads, either message or multipart_message will be emitted.

do_read

This private method does the actual reading from the socket.

EMITTED_EVENTS

message

message is emitted when a successful read occurs on the socket. When this event is emitted, the payload is a single message (in terms of ZeroMQ this is the result of the other end sending a message wuthout using SNDMORE). See Reflexive::ZmqSocket::ZmqMessage for more information.

multipart_message

multipart_message is emitted when multipart message is read from the socket. See Reflexive::ZmqSocket::ZmqMultiPartMessage for more information.

ACKNOWLEDGEMENTS

This module was originally developed for Booking.com and through their gracious approval, we've released this module to CPAN.

AUTHORS

  • Nicholas R. Perez <nperez@cpan.org>

  • Steffen Mueller <smueller@cpan.org>

COPYRIGHT AND LICENSE

This software is copyright (c) 2012 by Nicholas R. Perez <nperez@cpan.org>.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.