The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

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.