Revision history for Net-Async-AMQP 2.000 2016-12-27 20:44:32+08:00 Asia/Kuala_Lumpur Features: * RPC server/client implementation, should be compatible with http://www.rabbitmq.com/tutorials/tutorial-six-python.html * Connection blocked support * Custom headers and delivery mode * Correlation and reply_to fields are available in ->publish and also passed to the consumer via the {properties} information 1.000 2015-09-14 02:21:19+01:00 Europe/London API changes: The close events now use 'code' and 'reason' more consistently - previously the code had reply_code / message in some places. This may affect any "close" event handlers in existing code (for channels or connections). Features: * Queue declare now resolves with number of messages and consumers as well as the queue instance. * Futures are now labelled for easier tracing * amqp_frame_info() provides more information on known frame types * Net::Async::AMQP::Queue now has a ->consumer wrapper, which is slightly more userfriendly than the ->listen method. Bugs fixed: * Various connection handling issues when client/server close a channel or the entire connection. Also updated the list of alternative AMQP implementations. This version has only been tested up to 80k channels across 80 connections, with a pair of consumer and publisher for each of those channels - so although it should be possible to run with more active channels, given sufficient memory/CPU, that's as far as this version has been tested. 0.031 2015-08-20 02:50:43+01:00 Europe/London Features: * Support more options when publishing messages (including message expiration, thanks to Naveen Nathan for the patch) * ->unbind_exchange method Bugs fixed: * Don't send a CloseOk frame if we were the ones closing the channel. * More cleanup in Net::Async::ConnectionManager when channels and/or connections are closed. 0.030 2015-05-01 19:29:16+01:00 Europe/London Features: * Support more options when publishing messages (including message expiration, thanks to Naveen Nathan for the patch) 0.029 2015-04-20 01:11:17+01:00 Europe/London Features: * Helper functions in Net::Async::AMQP::Utils for converting status codes to message/description Bugs fixed: * On connection close, do a better job of cleaning up, and include a test to verify that we can dispose the Net::Async::AMQP instance after loop removal (thanks to snappy for reporting + providing a test case for tracing). 0.028 2015-04-15 23:31:34+01:00 Europe/London Features: * Supports messages which have been split into multiple frames - currently there's no streaming support, but this should now handle arbitrarily-large messages as long as you have the memory available. Bugs fixed: * Better channel close detection and handling - we now also record when a ::Channel instance has been closed, so we know to report an error if any further requests are attempted. Internal API changes: * ->send_frame on Net::Async::AMQP and Net::Async::AMQP::Channel now return a Future instead of $self, since parts of the code need to know when we've attempted to send the frame. 0.027 2015-03-22 15:11:03+00:00 Europe/London No new features. Test fixes: * fixed typo in t/conman-memory.t 0.026 2015-03-17 16:57:07+00:00 Europe/London No new features. Bugs fixed: * Connections are removed from the full list when closed by the server Test fixes: * Test::MemoryGrowth is currently Linux-only, so make it optional (RT102681) 0.025 2015-02-04 17:05:39+00:00 Europe/London No new features. Bugs fixed: * ConnectionManager updated to use List::UtilsBy::extract_by, not Scalar::Utils::extract_by, since the former has the advantage of actually being a real thing. 0.024 2015-02-04 14:26:38+00:00 Europe/London No new features. Bugs fixed: * In some cases would raise an exception due to attempting to unsubscribe from an event that had already been unsubscribed (close, for example). 0.023 2015-01-23 12:34:48+00:00 Europe/London New features: * Proper timeout/retry support in ::ConnectionManager 0.022 2015-01-20 11:00:03+00:00 Europe/London New features: * SSL support, pass ssl => 1 in $amqp->connect 0.021 2015-01-06 12:18:20+00:00 Europe/London API CHANGES: The undocumented Queue methods now all take a channel parameter, so that we don't retain a channel on the queue instance. This is unlikely to change again before 1.0 so the methods are now documented. Queues are no longer notifier subclasses. Bugs fixed: * Memory leak due to ::Queue instances being held by the loop, and channels being retained by the queue instances (caught by Test::MemoryGrowth, analysed by Devel::MAT, a handy pair of tools indeed) 0.020 2015-01-05 12:54:17+00:00 Europe/London No new features. Bugs fixed: * Don't call ->on_ready on a Future that's already been cleaned up, and handle cases where the Future is passed to ->closure_protection in a ready state 0.019 2014-12-30 11:47:16+00:00 Europe/London No new features. Test fixes: * conman-channels.t was attempting to load a specific IO::Async::Loop subclass, causing dependency failures. 0.018 2014-12-28 17:41:10+00:00 Europe/London Same code as previous version, this time with updated Changes file. 0.017 2014-12-28 17:31:35+00:00 Europe/London API CHANGES: The ->write method on Net::Async::AMQP::Channel was not used by anything in this code, and has been dropped. You probably shouldn't call ->write directly on Net::Async::AMQP either. New features: * Reports frames sent/received when IO_ASYNC_DEBUG is enabled * Methods on Net::Async::AMQP::Queue now hold on to the Future instances, bringing this in line with other classes - this means methods such as $queue->delete in void context no longer raise warnings about ->then in void context Bugs fixed: * Various issues around reopening channels now resolved, in particular earlier versions were likely to report a "second channel.open" error (tested with RabbitMQ only so far) * Hardcoded "warn" removed 0.016 2014-12-26 13:10:19+00:00 Europe/London No new features. Bugs fixed: * Test::HexString test dependency was not declared 0.015 2014-12-26 07:02:06+00:00 Europe/London New features: * Support exchange-to-exchange binding (RabbitMQ-specific feature) Bugs fixed: * Header frames have no ->method_frame, amqp_frame_type in Utils.pm was not handling them correctly * Heartbeat failure now uses the ->close method rather than just sending a close frame, for consistency with other close handling 0.014 2014-12-25 14:31:23+00:00 Europe/London New features: * Support max_channels in connection manager * When requesting a channel, attempt a new connection if all existing connections are full (was only partially implemented previously) 0.013 2014-12-25 11:33:37+00:00 Europe/London This release raises the minimum Perl version requirement to 5.14, for the ${^GLOBAL_PHASE} variable. New features: * Support reusing closed channel IDs by default in Net::Async::AMQP * Remove connection from available pool when no channels are available * Hardcoded connection manager channel assignment retry count moved to a method so that it's easier to override if required * Server implementation now supports channel opening (still a long way from a usable server) Bugs fixed: * Prevent ->confirm_mode on an existing ConnectionManager channel * Call cleanup tasks when releasing a managed channel 0.012 2014-12-11 11:04:10+00:00 Europe/London No new features. Bugs fixed: * Heartbeat handling overhaul - the send/receive heartbeat timers are independent, so we can now pick up heartbeat failure when we're not actively sending. * Fixes for channel/connection close handling - all Futures representing channel activities will now be marked as failed on channel closure * Default values for user+password (guest/guest) are now applied - this avoids the following RabbitMQ error: "AMQPLAIN auth info [{<<76,79,71,73,78>>,void,undefined},{<<80,65,83,83,87,79,82,68>>,void,undefined}] is missing LOGIN or PASSWORD field" Internal changes: * Timers and stream are now children of the top-level Net::Async::AMQP object rather than attached directly to the loop 0.011 2014-12-03 13:20:39+00:00 Europe/London New features: * Pass Basic.CancelOk notifications through as a cancel event: $ch->bus->subscribe_to_event(cancel => sub { my ($ev, $ctag) = @_; warn "cancel ctag $ctag" }); Needs the client property set for RabbitMQ to start sending these messages - http://www.rabbitmq.com/consumer-cancel.html: client_properties => { capabilities => { consumer_cancel_notify => Net::AMQP::Value->true, } } in ->connect() or ConnectionManager->add() Bugs fixed: * Header and body frame type detection fixed * Outgoing heartbeat timer reset on expiry 0.010 2014-12-02 10:14:25+00:00 Europe/London New features: * Support for passing heartbeat as a server parameter when calling ->add() on a Net::Async::AMQP::ConnectionManager. 0.009 2014-12-01 14:41:04+00:00 Europe/London No new features. Bugs fixed: * No longer attempts to call ->frame_method on heartbeat frames 0.008 2014-08-30 00:33:42+01:00 Europe/London New features: * Debugging uses ->debug_printf() everywhere, and is controlled by the standard IO_ASYNC_DEBUG env var * Basic server implementation, still not usable but clients can at least connect now * All channel frames are now handled by the relevant ::Channel instance, should provide slightly better performance and less chance for things to go out of sync Bugs fixed: * Expect publish ACK even when we get a NO_ROUTE response * Explicit string type enforced on all queue/exchange/routing key/ctag fields, to allow numeric-looking values - a precaution against issues like https://rt.cpan.org/Ticket/Display.html?id=81733 * Avoid excessive warnings in global destruction when the Net::Async::AMQP::ConnectionManager objects go out of scope. 0.007 2014-08-27 03:27:09+01:00 Europe/London No new features. Bugs fixed: * Channel traffic is independent. As such, the global pending frame handling was broken: instead, we now track pending frames on a per-channel basis. * Cancelling a ->listen request between the Consume.Start and Consume.Ok frames meant that you'd end up with an active listener - we now explicitly cancel this listener when the Consume.Ok frame turns up. * Connection manager now applies the managed channel to queue objects * Unnecessary extra connections were being opened, this has been fixed. 0.006 2014-08-25 18:01:14+01:00 Europe/London No new features. Bugs fixed: * Handle channel close correctly * Pass type information from messages - previously we were using the 'type' header instead. 0.005 2014-08-18 05:11:08+01:00 Europe/London No new featues. Tests fixed: * Don't try to connect to a 'default' AMQP server, skip if env vars were not provided 0.004 2014-08-17 18:40:45+01:00 Europe/London API CHANGES: * The Net::Async::AMQP class is now an IO::Async::Notifier, to bring it in line with other IO::Aync code. One side effect of this change is that events are now raised through a message bus rather than directly on the Net::Async::AMQP instance itself. Existing code will need to change this: my $amqp = Net::Async::AMQP->new(loop => $loop); to this: $loop->add->(my $amqp = Net::Async::AMQP->new); and this: $amqp->subscribe_to_event(...); to this: $amqp->bus->subscribe_to_event(...); New features: * Connection manager for automatically connecting and assigning channels * Some loadtesting scripts, for performance+stability testing on the server implementation (not available yet, should be in the next release) Bugs fixed: * If we establish TCP connection but fail to negotiate auth with server, previously this would leave the connection future unresolved. It will now fail with a message indicating that the remote closed the connection. * Net::AMQP was generating an invalid initial connection header (AMQP\x01\x01$major$minor rather than AMQP\x00$major$minor$rev as the AMQP 0.9.1 spec seems to require), we now generate our own header. RabbitMQ seems happy with either. 0.003 2014-02-27 07:56:25+00:00 Europe/London Bugs fixed: * Connection close sends a real connection close, rather than a channel close request 0.002 2014-02-27 07:10:14+00:00 Europe/London New features: * Support parameters when declaring queues (passive, durable, exclusive) 0.001 2014-01-05 04:52:26 Europe/London Initial CPAN release