[dancer-users] Problems writing a Plugin

Alfonso Pinto alfonso.pinto at gmail.com
Fri Oct 13 19:07:36 BST 2017


Hi Clive,

Thanks for the answer. I found 2 things:
-  $client->set_identity = $plugin->config->{identity} . "-$$"; should
be  $client->set_identity($plugin->config->{identity}
. "-$$");
- Using builders for the properties doesn't work, I've to use BUILD as you
suggested.

Now I've this:

package Dancer2::Plugin::ZMQ;


> use Dancer2::Plugin;


> our $version = '0.01';


> use ZMQ::FFI;

use ZMQ::FFI::Constants qw(ZMQ_REQ);


> has _context => (is => 'rw');

has _client => (is => 'rw', plugin_keyword => 'zmq');


> sub BUILD {

    my $plugin = shift;

    my $args = shift;


>     $plugin->_context(ZMQ::FFI->new());

    $plugin->_client($plugin->_context->socket(ZMQ_REQ));

    $plugin->_client->set_identity($plugin->config->{identity} . "-$$");

    $plugin->_client->connect($plugin->config->{host});

}


> 1;



This works if you run the dancer app as a standalone process. If I run it
with Starman that initialises several workers, it doesn't work as it tries
to share the same instance between all the workers (you can't share ZMQ
context between processes/threads).
Is there any way to create one instance per process?

Regards,
Alfonso.

On Fri, Oct 13, 2017 at 4:32 PM, Clive Eisen <clive at hildebrand.co.uk> wrote:

> I do a very similar thing for a custom redis plugin I wrote
>
> You have to declare the object outside the BUILD and set it inside
>
> eg
> package Dredis;
> use Redis::Fast;
> use Dancer2::Plugin;
>
> my $redii;
>
> sub BUILD {
>         my ($plugin) = @_;
> <snip lots of setup stuff>
> $redii->{$r}{$i} = Redis::Fast->new( %opts );
> }
>
> Then use $redi-> in the get/set methods
> eg
> sub dredis {
>         my( $called, $plugin, $method, @args ) = @_;
>
>         return $redii->{$called}->$method(@args);
> }
> 1;
>
> --
> Clive Eisen
> GPG: 75056DD0
>
>
>
>
>
>
> On 13 Oct 2017, at 14:29, Alfonso Pinto <alfonso.pinto at gmail.com> wrote:
>
> Dear all,
>
> I'm trying to write a Dancer2::Plugin to maintain ZMQ socket and send some
> information to a backend when a request is received.
>
> This is the plugin :
>
>> package Dancer2::Plugin::ZMQ;
>>
>>
>> use Dancer2::Plugin;
>>
>>
>> use ZMQ::FFI;
>>
>> use ZMQ::FFI::Constants qw(ZMQ_REQ);
>>
>>
>> has host => (is => 'ro');
>>
>> has identity => (is => 'ro');
>>
>>
>> has _context => (is => 'ro', lazy_build => 1);
>>
>> sub _build_context {
>>
>>     my $plugin = shift;
>>
>>     return ZMQ::FFI->new();
>>
>> }
>>
>>
>> has client => (is => 'ro', lazy_build => 1, plugin_keyword => 'zmq');
>>
>> sub _build_client {
>>
>>     my $plugin = shift;
>>
>>
>>     my $client = $plugin->_context->socket(ZMQ_REQ);
>>
>>     $client->set_identity = $plugin->config->{identity} . "-$$";
>>
>>     $client->connect($plugin->config->{host});
>>
>>     return $client;
>>
>> }
>>
>>
>> 1;
>>
>
>  This is my config.yml:
>
> plugins:
>>     ZMQ:
>>         identity: "api-gw"
>>         host: "tcp://proxy:6660"
>
>
>
> And this is how I use it in one route:
>
> post '/' => sub {
>
>     my $message = body_parameters->get('message');
>
>     zmq->send(message =>$message);
>
>     my $reply = zmq->recv();
>
>     return {"reply" => $reply};
>
> };
>
>
>
>
> The issue is that I get this error:
>
>> Router exception: Can't call method "send" on an undefined
>
>
> I don't understand why it's not keeping the client instantiated. What is
> wrong withmy approach? What I don't want is to create a socket for each
> request received.
>
> And before someone asks, the backend is working and replying. A simple
> script like this one works in my setup:
>
> use v5.10;
>> use ZMQ::FFI qw(ZMQ_REQ);
>>
>
>
> my $endpoint = "tcp://proxy:6660";
>> my $ctx      = ZMQ::FFI->new();
>>
>
>
> my $s1 = $ctx->socket(ZMQ_REQ);
>> $s1->connect($endpoint);
>>
>
>
> $s1->send('ohhai');
>> print $s1->recv();
>
>
> Thanks in advance.
> Regards,
> Alfonso
> _______________________________________________
> dancer-users mailing list
> dancer-users at dancer.pm
> http://lists.preshweb.co.uk/mailman/listinfo/dancer-users
>
>
>
> _______________________________________________
> dancer-users mailing list
> dancer-users at dancer.pm
> http://lists.preshweb.co.uk/mailman/listinfo/dancer-users
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.preshweb.co.uk/pipermail/dancer-users/attachments/20171013/783ab645/attachment.html>


More information about the dancer-users mailing list