NAME¶
Net::Stomp - A Streaming Text Orientated Messaging Protocol Client
SYNOPSIS¶
# send a message to the queue 'foo'
use Net::Stomp;
my $stomp = Net::Stomp->new( { hostname => 'localhost', port => '61613' } );
$stomp->connect( { login => 'hello', passcode => 'there' } );
$stomp->send(
{ destination => '/queue/foo', body => 'test message' } );
$stomp->disconnect;
# subscribe to messages from the queue 'foo'
use Net::Stomp;
my $stomp = Net::Stomp->new( { hostname => 'localhost', port => '61613' } );
$stomp->connect( { login => 'hello', passcode => 'there' } );
$stomp->subscribe(
{ destination => '/queue/foo',
'ack' => 'client',
'activemq.prefetchSize' => 1
}
);
while (1) {
my $frame = $stomp->receive_frame;
warn $frame->body; # do something here
$stomp->ack( { frame => $frame } );
}
$stomp->disconnect;
# write your own frame
my $frame = Net::Stomp::Frame->new(
{ command => $command, headers => $conf, body => $body } );
$self->send_frame($frame);
# connect with failover supporting similar URI to ActiveMQ
$stomp = Net::Stomp->new({ failover => "failover://tcp://primary:61616" })
# "?randomize=..." and other parameters are ignored currently
$stomp = Net::Stomp->new({ failover => "failover:(tcp://primary:61616,tcp://secondary:61616)?randomize=false" })
# Or in a more natural perl way
$stomp = Net::Stomp->new({ hosts => [
{ hostname => 'primary', port => 61616 },
{ hostname => 'secondary', port => 61616 },
] });
DESCRIPTION¶
This module allows you to write a Stomp client. Stomp is the Streaming Text
Orientated Messaging Protocol (or the Protocol Briefly Known as TTMP and
Represented by the symbol :ttmp). It's a simple and easy to implement protocol
for working with Message Orientated Middleware from any language. Net::Stomp
is useful for talking to Apache ActiveMQ, an open source (Apache 2.0 licensed)
Java Message Service 1.1 (JMS) message broker packed with many enterprise
features.
A Stomp frame consists of a command, a series of headers and a body - see
Net::Stomp::Frame for more details.
For details on the protocol see <
http://stomp.codehaus.org/Protocol>.
To enable the ActiveMQ Broker for Stomp add the following to the activemq.xml
configuration inside the <transportConnectors> section:
<transportConnector name="stomp" uri="stomp://localhost:61613"/>
To enable the ActiveMQ Broker for Stomp and SSL add the following inside the
<transportConnectors> section:
<transportConnector name="stomp+ssl" uri="stomp+ssl://localhost:61612"/>
For details on Stomp in ActiveMQ See
<
http://activemq.apache.org/stomp.html>.
METHODS¶
new¶
The constructor creates a new object. You must pass in a hostname and a port or
set a failover configuration:
my $stomp = Net::Stomp->new( { hostname => 'localhost', port => '61613' } );
If you want to use SSL, make sure you have IO::Socket::SSL and pass in the SSL
flag:
my $stomp = Net::Stomp->new( {
hostname => 'localhost',
port => '61612',
ssl => 1,
} );
If you want to pass in IO::Socket::SSL options:
my $stomp = Net::Stomp->new( {
hostname => 'localhost',
port => '61612',
ssl => 1,
ssl_options => { SSL_cipher_list => 'ALL:!EXPORT' },
} );
Failover
There is experiemental failover support in Net::Stomp. You can specify failover
in a similar maner to ActiveMQ
(
http://activemq.apache.org/failover-transport-reference.html
<
http://activemq.apache.org/failover-transport-reference.html>) for
similarity with Java configs or using a more natural method to perl of passing
in an array-of-hashrefs in the "hosts" parameter.
Currently when ever Net::Stomp connects or reconnects it will simply try the
next host in the list.
Reconnect on "fork"
By default Net::Stomp will reconnect, using a different socket, if the process
"fork"s. This avoids problems when parent & child write to the
socket at the same time. If, for whatever reason, you don't want this to
happen, set "reconnect_on_fork" to 0 (either as a constructor
parameter, or by calling the method).
connect¶
This connects to the Stomp server. You may pass in a "login" and
"passcode" options.
You may also pass in 'client-id', which specifies the JMS Client ID which is
used in combination to the activemqq.subscriptionName to denote a durable
subscriber.
$stomp->connect( { login => 'hello', passcode => 'there' } );
send¶
This sends a message to a queue or topic. You must pass in a destination and a
body.
$stomp->send(
{ destination => '/queue/foo', body => 'test message' } );
To send a BytesMessage, you should set the field 'bytes_message' to 1.
send_transactional¶
This sends a message in transactional mode and fails if the receipt of the
message is not acknowledged by the server:
$stomp->send_transactional(
{ destination => '/queue/foo', body => 'test message' }
) or die "Couldn't send the message!";
If using ActiveMQ, you might also want to make the message persistent:
$stomp->send_transactional(
{ destination => '/queue/foo', body => 'test message', persistent => 'true' }
) or die "Couldn't send the message!";
disconnect¶
This disconnects from the Stomp server:
$stomp->disconnect;
subscribe¶
This subscribes you to a queue or topic. You must pass in a destination.
The acknowledge mode defaults to 'auto', which means that frames will be
considered delivered after they have been sent to a client. The other option
is 'client', which means that messages will only be considered delivered after
the client specifically acknowledges them with an ACK frame.
Other options:
'selector': which specifies a JMS Selector using SQL 92 syntax as specified in
the JMS 1.1 specificiation. This allows a filter to be applied to each message
as part of the subscription.
'activemq.dispatchAsync': should messages be dispatched synchronously or
asynchronously from the producer thread for non-durable topics in the broker.
For fast consumers set this to false. For slow consumers set it to true so
that dispatching will not block fast consumers.
'activemq.exclusive': Would I like to be an Exclusive Consumer on a queue.
'activemq.maximumPendingMessageLimit': For Slow Consumer Handlingon non-durable
topics by dropping old messages - we can set a maximum pending limit which
once a slow consumer backs up to this high water mark we begin to discard old
messages.
'activemq.noLocal': Specifies whether or not locally sent messages should be
ignored for subscriptions. Set to true to filter out locally sent messages.
'activemq.prefetchSize': Specifies the maximum number of pending messages that
will be dispatched to the client. Once this maximum is reached no more
messages are dispatched until the client acknowledges a message. Set to 1 for
very fair distribution of messages across consumers where processing messages
can be slow.
'activemq.priority': Sets the priority of the consumer so that dispatching can
be weighted in priority order.
'activemq.retroactive': For non-durable topics do you wish this subscription to
the retroactive.
'activemq.subscriptionName': For durable topic subscriptions you must specify
the same clientId on the connection and subscriberName on the subscribe.
$stomp->subscribe(
{ destination => '/queue/foo',
'ack' => 'client',
'activemq.prefetchSize' => 1
}
);
unsubscribe¶
This unsubscribes you to a queue or topic. You must pass in a destination:
$stomp->unsubcribe({ destination => '/queue/foo' });
receive_frame¶
This blocks and returns you the next Stomp frame.
my $frame = $stomp->receive_frame;
warn $frame->body; # do something here
The header bytes_message is 1 if the message was a BytesMessage.
By default this method will block until a frame can be returned. If you wish to
wait for a specified time pass a "timeout" argument:
# Wait half a second for a frame, else return undef
$stomp->receive_frame({ timeout => 0.5 })
can_read¶
This returns whether there is new data is waiting to be read from the STOMP
server. Optionally takes a timeout in seconds:
my $can_read = $stomp->can_read;
my $can_read = $stomp->can_read({ timeout => '0.1' });
"undef" says block until something can be read, 0 says to poll and
return immediately.
ack¶
This acknowledges that you have received and processed a frame (if you are using
client acknowledgements):
$stomp->ack( { frame => $frame } );
send_frame¶
If this module does not provide enough help for sending frames, you may
construct your own frame and send it:
# write your own frame
my $frame = Net::Stomp::Frame->new(
{ command => $command, headers => $conf, body => $body } );
$self->send_frame($frame);
SEE ALSO¶
Net::Stomp::Frame.
AUTHORS¶
Leon Brocard <acme@astray.com>, Thom May <thom.may@betfair.com>,
Michael S. Fischer <michael@dynamine.net>, Ash Berlin
<ash_github@firemirror.com>
CONTRIBUTORS¶
Paul Driver <frodwith@cpan.org>, Andreas Faafeng <aff@cpan.org>,
Vigith Maurice <vigith@yahoo-inc.com>, Stephen Fralich
<sjf4@uw.edu>, Squeeks <squeek@cpan.org>, Chisel Wright
<chisel@chizography.net>,
COPYRIGHT¶
Copyright (C) 2006-9, Leon Brocard Copyright (C) 2009, Thom May, Betfair.com
Copyright (C) 2010, Ash Berlin, Net-a-Porter.com Copyright (C) 2010, Michael
S. Fischer
This module is free software; you can redistribute it or modify it under the
same terms as Perl itself.