Alien-ActiveMQ
view release on metacpan or search on metacpan
lib/Alien/ActiveMQ.pm view on Meta::CPAN
our $VERSION = '0.00005';
# Note: Many of the methods in this class need to be usable as class methods.
# This means you can't use Moose attributes, because they try and store data
# on the class name, which fails. Only normal methods here.
# To make mocking easier.
sub _dist_dir {
return dir( dist_dir('Alien-ActiveMQ') );
}
method _output {
my $msg = "@_\n";
return warn($msg);
}
method startup_timeout {
return 300;
}
method get_installed_versions {
my @dirs = $self->_dist_dir->children;
my @versions = ();
foreach my $dir (@dirs) {
if ( $dir->basename =~ /^\d[\d.]+$/ ) {
push @versions, $dir->basename;
}
}
return ( sort { versioncmp( $b, $a ); } @versions );
}
method get_version_dir($version) {
if ( !$version ) {
$version = ( $self->get_installed_versions )[0];
}
if ($version) {
return dir( $self->_dist_dir, $version );
}
return;
}
method is_version_installed($version) {
return $self->get_version_dir($version)
&& ( -d $self->get_version_dir($version) );
}
method get_license_filename($version) {
my $dir = $self->get_version_dir($version);
return file( $dir, 'LICENSE' );
}
method get_licence_filename($version) {
return $self->get_license_filename($version);
}
method run_server($version) {
my $dir = $self->get_version_dir($version);
my @cmd = ( file( $dir, 'bin', 'activemq' ) );
# Check if we need to use the console verb to get the command to start.
my $consoleflag = $self->_check_output( [ @cmd, '--help' ], qr/(stop)/ );
if ($consoleflag) {
push @cmd, 'console';
}
# Start activemq in a subprocess
$self->_output("Running @cmd");
my $h = start \@cmd, \undef;
my $pid = $h->{KIDS}[0]{PID}; # FIXME!
# Spin until we can get a connection
my ( $stomp, $loop_count );
while ( !$stomp ) {
if ( $loop_count++ > $self->startup_timeout ) {
$h->signal("KILL");
die "Can't connect to ActiveMQ after trying "
. $self->startup_timeout
. " seconds.";
}
eval {
$stomp = Net::Stomp->new(
{
hostname => 'localhost',
port => 61613
}
);
};
if ($@) {
sleep 1;
}
}
return Scope::Guard->new(
sub {
$self->_output("Killing ApacheMQ...");
$h ? $h->signal ( "KILL" ) : kill $pid, 15;
}
);
}
method _check_output( $cmd, $output ) {
my $text = '';
run( $cmd, \undef, \$text );
if ( my @matches = $text =~ $output ) {
return @matches;
}
return;
}
1;
__END__
=for stopwords ActiveMQ MQ perl queueing TODO github Doran undef
=head1 NAME
Alien::ActiveMQ - Manages installs of versions of Apache ActiveMQ, and provides a standard
way to start an MQ server from perl.
=head1 SYNOPSIS
( run in 1.401 second using v1.01-cache-2.11-cpan-acebb50784d )