Do it the way I did it with a my variable outside to hold your handler. Then you will get one per child (well i do anyway)
-- Clive > On 13 Oct 2017, at 19:07, Alfonso Pinto <alfonso.pi...@gmail.com> wrote: > > 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 <cl...@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.pi...@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@dancer.pm >>> http://lists.preshweb.co.uk/mailman/listinfo/dancer-users >> >> >> _______________________________________________ >> dancer-users mailing list >> dancer-users@dancer.pm >> http://lists.preshweb.co.uk/mailman/listinfo/dancer-users >> > > _______________________________________________ > dancer-users mailing list > dancer-users@dancer.pm > http://lists.preshweb.co.uk/mailman/listinfo/dancer-users
_______________________________________________ dancer-users mailing list dancer-users@dancer.pm http://lists.preshweb.co.uk/mailman/listinfo/dancer-users