NAME
Net::Stomp::Producer::Transactional - subclass of Net::Stomp::Producer with transaction-like behaviour
VERSION
version 2.005
SYNOPSIS
my $p = Net::Stomp::Producer::Transactional->new({
servers => [ { hostname => 'localhost', port => 61613, } ],
});
$p->txn_begin();
$p->send('/queue/somewhere',
{ type => 'my_message' },
'body contents');
# nothing sent yet
# some time later
$p->txn_commit();
# all messages are sent now
Also:
$p->txn_do(sub{
# do something...
$p->send(@msg1);
# do something else...
$p->send(@msg2);
});
# all messages are sent now, unless an exception was thrown
DESCRIPTION
A subclass of Net::Stomp::Producer, this class adds some transaction-like behaviour.
If you call "txn_begin", the messages sent through this object will be kept in memory instead of being actually sent to the STOMP connection. They will be sent when you call "txn_commit",
There is also a "txn_do" method, which takes a coderef and executes it between a "txn_begin" and a "txn_commit". If the coderef throws an exception, the messages are forgotten.
Please remember that this has nothing to do with STOMP transactions, nor with the "transactional_sending" in Net::Stomp::Producer attribute. We could, in future, re-implement this to delegate transactional behaviour to the broker via STOMP's BEGIN
and COMMIT
frames. At the moment we do everything client-side.
METHODS
in_transaction
If true, we are inside a "transaction". You can change this with "txn_begin", "txn_commit" and "txn_rollback".
txn_begin
Start a transaction, so that subsequent calls to send
or transform_and_send
won't really send messages to the connection, but keep them in memory.
You can call this method multiple times; the transaction will end (and messages will be sent) when you call "txn_commit" as many times as you called txn_begin
.
Calling "txn_rollback" will destroy the messages sent since the most recent txn_begin
. In other words, transactions are properly re-entrant.
txn_commit
Commit the current transaction. If this was the outer-most transaction, send all buffered messages.
If you call this method outside of a transaction, you'll get a Net::Stomp::Producer::Exceptions::Transactional exception.
txn_rollback
Roll back the current transaction, destroying all messages "sent" inside it.
If you call this method outside of a transaction, you'll get a Net::Stomp::Producer::Exceptions::Transactional exception.
send
If not "in_transaction", send the message normally; otherwise, add it to the in-memory buffer. See the base method for more details.
txn_do
$p->txn_do(sub {
$p->send(@something);
});
This method executes the given coderef between a "txn_begin" and a "txn_commit".
If the coderef throws an exception, "txn_rollback" will be called, and the exception re-thrown.
This method is re-entrant:
$p->txn_do(sub {
$p->send(@msg1);
eval {
$p->txn_do(sub {
$p->send(@msg2);
die "boom\n";
});
};
$p->send(@msg3);
});
The first and thind messages will be sent, the second one will not.
AUTHOR
Gianni Ceccarelli <gianni.ceccarelli@net-a-porter.com>
COPYRIGHT AND LICENSE
This software is copyright (c) 2012 by Net-a-porter.com.
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.