476 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			Markdown
		
	
	
	
			
		
		
	
	
			476 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			Markdown
		
	
	
	
| This release introduces new features, changes to RabbitMQ distribution (e.g. what plugins ship
 | |
| with it), and bug fixes. It also includes all the changes from the [3.6.x release series](https://www.rabbitmq.com/changelog.html) unless stated otherwise.
 | |
| 
 | |
| Documentation for this release is available at [the RabbitMQ website](https://www.rabbitmq.com).
 | |
| 
 | |
| 
 | |
| ## Breaking Changes
 | |
| 
 | |
|  * Minimum required Erlang/OTP version is now 19.3. Recent Erlang versions can be obtained from [Erlang Solutions](https://www.erlang-solutions.com/resources/download.html), [RabbitMQ zero dependency Erlang RPM](https://github.com/rabbitmq/erlang-rpm), as well as main and backports repositories of recent Ubuntu and Debian releases.
 | |
| 
 | |
|    GitHub issues: [rabbitmq-server#1305](https://github.com/rabbitmq/rabbitmq-server/issues/1305), [rabbitmq-server#1307](https://github.com/rabbitmq/rabbitmq-server/issues/1307), [rabbitmq-common#234](https://github.com/rabbitmq/rabbitmq-common/pull/234).
 | |
| 
 | |
|  * HTTP API has minor breaking changes in several endpoints (see below).
 | |
| 
 | |
|  * .NET client is now [.NET Core-compatible](https://github.com/rabbitmq/rabbitmq-dotnet-client/issues/148).
 | |
|    Starting with `3.7.0`, [.NET client releases](https://github.com/rabbitmq/rabbitmq-dotnet-client/releases) are decoupled from RabbitMQ server releases and exclusively distributed via the [RabbitMQ.Client NuGet package](https://www.nuget.org/packages/RabbitMQ.Client/).
 | |
| 
 | |
|  * Starting with `3.7.0`, [Java client releases](https://github.com/rabbitmq/rabbitmq-java-client/releases) are decoupled from RabbitMQ server releases and exclusively distributed via Maven: [RabbitMQ Milestones Maven repository](https://bintray.com/rabbitmq/maven-milestones), [RabbitMQ Maven repository](https://bintray.com/rabbitmq/maven), as well as Maven Central.
 | |
| 
 | |
|  * Users tagged with `administrator` now implicitly have access to most operations in all vhosts,
 | |
|    including those they don't have explicit permissions for.
 | |
| 
 | |
|    GitHub issue: [rabbitmq-management#461](https://github.com/rabbitmq/rabbitmq-management/issues/461)
 | |
| 
 | |
|  * Plugins now must depend on the `rabbit` application [in order to be recognised as such by `rabbitmq-plugins list`](https://github.com/rabbitmq/rabbitmq-server/issues/1124).
 | |
|    Plugins that do not have the dependency will still function, can be enabled or disabled but won't appear
 | |
|    in `rabbitmq-plugins list` output.
 | |
| 
 | |
|  * `rabbitmq_management_visualiser` plugin [no longer ships with RabbitMQ](https://groups.google.com/forum/#!searchin/rabbitmq-users/ANN$20rabbitmq_management_visualiser%7Csort:relevance/rabbitmq-users/WiHmPcmzNtI/YJ356EW4BAAJ) and is considered to be deprecated. Installations that have this plugin enabled **must disable it before upgrading**. This can
 | |
|     be done using `rabbitmq-plugins disable` (which supports offline modifications)
 | |
|     or by updating the list of plugins in `RABBITMQ_ENABLED_PLUGINS_FILE`.
 | |
| 
 | |
| 
 | |
| ### Erlang/OTP 20 Support
 | |
| 
 | |
| Erlang/OTP 20 has [breaking changes](https://groups.google.com/d/msg/rabbitmq-users/_imbAavBYjY/xHzMiGgMAgAJ) that affected RabbitMQ.
 | |
| 
 | |
| 3.7.0 supports OTP 20, including upgrades of existing installations to OTP 20. This required changes to the core and multiple plugins that ship with RabbitMQ.
 | |
| 
 | |
| GitHub issues: [rabbitmq-server#1243](https://github.com/rabbitmq/rabbitmq-server/issues/1243), [rabbitmq-server#1250](https://github.com/rabbitmq/rabbitmq-server/pull/1250), [rabbitmq-server#1268](https://github.com/rabbitmq/rabbitmq-server/pull/1268),
 | |
| 	       [rabbitmq-server#1272](https://github.com/rabbitmq/rabbitmq-server/issues/1272), [rabbitmq-federation#58](https://github.com/rabbitmq/rabbitmq-federation/pull/58), [rabbitmq-management-agent#47](https://github.com/rabbitmq/rabbitmq-management-agent/pull/47),
 | |
| 	       [rabbitmq-management#415](https://github.com/rabbitmq/rabbitmq-management/pull/415), [rabbitmq-stomp#115](https://github.com/rabbitmq/rabbitmq-stomp/issues/115)
 | |
| 
 | |
| 
 | |
| ### Core Server
 | |
| 
 | |
| #### Enhancements
 | |
| 
 | |
|  * New configuration file format
 | |
| 
 | |
|    RabbitMQ now supports a [new configuration file format](http://next.rabbitmq.com/configure.html#config-file).
 | |
|    The format is [based on sysctl](https://github.com/basho/cuttlefish/wiki/Cuttlefish-for-Application-Users)
 | |
|    and is similar to `.ini` files. Erlang term configuration files are still supported, it is also
 | |
|    possible to combine the two formats (use both `rabbitmq.conf` and `advanced.config`).
 | |
| 
 | |
|    Most documentation examples were updated to use both new and classic config formats. See the docs
 | |
|    at [next.rabbitmq.com](http://next.rabbitmq.com), in particular [the configuration guide](http://next.rabbitmq.com/configure.html),
 | |
|    for more information.
 | |
| 
 | |
|    GitHub issues: [rabbitmq-server#550](https://github.com/rabbitmq/rabbitmq-server/issues/550),
 | |
|    		  [rabbitmq-server#1103](https://github.com/rabbitmq/rabbitmq-server/pull/1103),
 | |
|                   [rabbitmq-auth-backend-ldap#59](https://github.com/rabbitmq/rabbitmq-auth-backend-ldap/issues/59)
 | |
| 
 | |
|  * Pluggable cluster peer discovery
 | |
| 
 | |
|    Automatic clustering for blank (without an existing database) nodes now can discover
 | |
|    peers using pluggable backends. This is a set of features adopted from the [rabbitmq-autocluster](https://github.com/rabbitmq/rabbitmq-autocluster/) plugin by Gavin Roy.
 | |
|    Two implementations are available out of the box: one uses a config file- and another DNS A records.
 | |
|    Several more are available via plugins:
 | |
| 
 | |
|     * [AWS](https://github.com/rabbitmq/rabbitmq-peer-discovery-aws)
 | |
|     * [Consul](https://github.com/rabbitmq/rabbitmq-peer-discovery-consul)
 | |
|     * [etcd](https://github.com/rabbitmq/rabbitmq-peer-discovery-etcd)
 | |
|     * [Kubernetes](https://github.com/rabbitmq/rabbitmq-peer-discovery-k8s)
 | |
| 
 | |
|    GitHub issues: [rabbitmq-server#486](https://github.com/rabbitmq/rabbitmq-server/issues/486), [rabbitmq-server#988](https://github.com/rabbitmq/rabbitmq-server/issues/988), [rabbitmq-server#1143](https://github.com/rabbitmq/rabbitmq-server/issues/1143)
 | |
| 		  [rabbitmq-server#1202](https://github.com/rabbitmq/rabbitmq-server/issues/1202), [rabbitmq-server#1171](https://github.com/rabbitmq/rabbitmq-server/issues/1171), [rabbitmq-server#1257](https://github.com/rabbitmq/rabbitmq-server/issues/1257), [rabbitmq-server#1247](https://github.com/rabbitmq/rabbitmq-server/issues/1247)
 | |
| 
 | |
|  * Nodes in a cluster now can be restared in arbitrary order. They will attempt to contact
 | |
|    one of the previously seen peers periodically (10 times with 30 second intervals by default).
 | |
| 
 | |
|    GitHub issue: [rabbitmq-server#1022](https://github.com/rabbitmq/rabbitmq-server/issues/1022),
 | |
|                  [rabbitmq-server#487](https://github.com/rabbitmq/rabbitmq-server/issues/487)
 | |
| 
 | |
|  * Every virtual host now has separate message stores.
 | |
|    This improves resiliency and reduces contention in multitenant environments,
 | |
|    plus makes development of tools that perform backups and recovery of resting data easier
 | |
|    in the future.
 | |
| 
 | |
|    During the upgrade nodes will migrate data to this new layout. This can take some time.
 | |
|    To reduce the amount of time, drain as many queues as possible before upgrading, e.g.
 | |
|    by stopping publishers without stopping consumers for a period of time.
 | |
| 
 | |
|    GitHub issues: [rabbitmq-server#567](https://github.com/rabbitmq/rabbitmq-server/issues/567), [rabbitmq-server#1146](https://github.com/rabbitmq/rabbitmq-server/issues/1146), [rabbitmq-server#1280](https://github.com/rabbitmq/rabbitmq-server/issues/1280),
 | |
| 		  [rabbitmq-management#446](https://github.com/rabbitmq/rabbitmq-management/issues/446), [rabbitmq-server#1303](https://github.com/rabbitmq/rabbitmq-server/issues/1303), [rabbitmq-management#460](https://github.com/rabbitmq/rabbitmq-management/issues/460), [rabbitmq-server#1321](https://github.com/rabbitmq/rabbitmq-server/issues/1321)
 | |
| 
 | |
|  * New [LevelDB-based message store index plugin](https://github.com/rabbitmq/rabbitmq-msg-store-index-eleveldb).
 | |
| 
 | |
|    GitHub issue: [rabbitmq-server#838](https://github.com/rabbitmq/rabbitmq-server/issues/838)
 | |
| 
 | |
|  * Support config file path values with and without file extensions
 | |
| 
 | |
|    RabbitMQ no longer *requires* `RABBITMQ_CONFIG_FILE` values to not have a `.config` or `.conf` suffix. It will try appending both suffixes as needed when searching for suitable config file(s) to load.
 | |
| 
 | |
|    GitHub Issue: [rabbitmq-server#691](https://github.com/rabbitmq/rabbitmq-server/issues/691)
 | |
| 
 | |
|  * Operators now can configure how many concurrent connections are allowed in a vhost.
 | |
| 
 | |
|    GitHub issue: [rabbitmq-server#500](https://github.com/rabbitmq/rabbitmq-server/issues/500)
 | |
| 
 | |
|  * Operators now can configure how many queues can exist in a vhost.
 | |
| 
 | |
|    GitHub issue: [rabbitmq-server#501](https://github.com/rabbitmq/rabbitmq-server/issues/501)
 | |
| 
 | |
|  * Operator policies: their definitions are merged with the standard (user) policies and allow operators put global
 | |
|    limits in place, e.g. max queue length or message TTL.
 | |
| 
 | |
|    GitHub issue: [rabbitmq-server#930](https://github.com/rabbitmq/rabbitmq-server/issues/930)
 | |
| 
 | |
|  * It is now possible to configure a limited [prefetch value](https://www.rabbitmq.com/confirms.html) for all newly opened channels by default.
 | |
|    This helps prevent consumers that never acknowledge deliveries from exhausting server resources.
 | |
|    It is important to make sure that consumers that use [manual acknowledgements](https://www.rabbitmq.com/confirms.html) can cope with this
 | |
|    change before enabling it.
 | |
| 
 | |
|    GitHub issue: [rabbitmq-server#1367](https://github.com/rabbitmq/rabbitmq-server/issues/1367)
 | |
| 
 | |
|  * Plugin version constraints
 | |
| 
 | |
|    RabbitMQ now has a mechanism for plugin authors to indicate what versions a plugin is compatible with.
 | |
|    Incompatible plugins are logged and ignored.
 | |
| 
 | |
|    GitHub issues: [rabbitmq-server#591](https://github.com/rabbitmq/rabbitmq-server/issues/591), [rabbitmq-server#735](https://github.com/rabbitmq/rabbitmq-server/issues/735), [rabbitmq-server#1090](https://github.com/rabbitmq/rabbitmq-server/issues/1090)
 | |
| 
 | |
|  * Lager-based logging: less [not prone to overload](https://s3.us-east-2.amazonaws.com/ferd.erlang-in-anger/text.v1.1.0.pdf), pluggable backends, debug log level, more flexibility in configuration.
 | |
| 
 | |
|    RabbitMQ now uses [Lager](https://github.com/basho/lager) for its logging subsystem.
 | |
|    This brings a group of benefits: (quite verbose) debug log level, pluggable logging
 | |
|    backends (will require Lager plugins), and much
 | |
|    more flexibility in logging configuration.
 | |
| 
 | |
|    See [RabbitMQ 3.7.0 logging guide](http://next.rabbitmq.com/logging.html), [rabbitmq.conf.example](https://github.com/rabbitmq/rabbitmq-server/blob/master/docs/rabbitmq.conf.example) (new style config)
 | |
|    and [rabbitmq.config.example](https://github.com/rabbitmq/rabbitmq-server/blob/v3.7.x/docs/rabbitmq.config.example) (classic/advanced config format) to learn more.
 | |
| 
 | |
|    GitHub issues: [rabbitmq-server#94](https://github.com/rabbitmq/rabbitmq-server/issues/94), [rabbitmq-website#418](https://github.com/rabbitmq/rabbitmq-website/issues/418)
 | |
| 
 | |
|  * Topic authorisation built around topic exchanges. This includes support for certain variables,
 | |
|    such as virtual host and username.
 | |
| 
 | |
|    GitHub issues: [rabbitmq-server#505](https://github.com/rabbitmq/rabbitmq-server/issues/505), [rabbitmq-server#1085](https://github.com/rabbitmq/rabbitmq-server/issues/1085), [rabbitmq-server#1099](https://github.com/rabbitmq/rabbitmq-server/issues/1099), [rabbitmq-server#1229](https://github.com/rabbitmq/rabbitmq-server/issues/1229)
 | |
| 
 | |
|  * When queue length limit is exceeded, publishers of messages that did not fit
 | |
|    now can opt-in to receive a nack by opting in (configuring an overflow behavior).
 | |
|    When the behavior is configured to reject, messages are also discarded more efficiently.
 | |
| 
 | |
|    GitHub issue: [rabbitmq-server#995](https://github.com/rabbitmq/rabbitmq-server/issues/995)
 | |
| 
 | |
|  * [Proxy Protocol](http://www.haproxy.org/download/1.8/doc/proxy-protocol.txt) support.
 | |
| 
 | |
|    GitHub issue: [rabbitmq-server#589](https://github.com/rabbitmq/rabbitmq-server/issues/589)
 | |
| 
 | |
|  * Deleting a vhost now will force close all connections in it.
 | |
| 
 | |
|    GitHub issue: [rabbitmq-server#627](https://github.com/rabbitmq/rabbitmq-server/issues/627)
 | |
| 
 | |
|  * Deleting a user account now will force close all of its connections.
 | |
| 
 | |
|    GitHub issue: [rabbitmq-server#628](https://github.com/rabbitmq/rabbitmq-server/issues/628)
 | |
| 
 | |
|  * OpenSUSE RPM package now supports systemd and requires Leap 42.2.
 | |
| 
 | |
|    GitHub issue: [rabbitmq-server-release#31](https://github.com/rabbitmq/rabbitmq-server-release/pull/31)
 | |
| 
 | |
|  * Standalone MacOS release now bundles Erlang 19.x.
 | |
| 
 | |
|    GitHub issue: [rabbitmq-server-release#10](https://github.com/rabbitmq/rabbitmq-server-release/issues/10)
 | |
| 
 | |
|  * First dead-lettering event now injects a separate set of top-level headers — `x-first-death-queue`, `x-first-death-reason`,
 | |
|    and `x-first-death-exchange` — in addition to the `x-deaths` entries.
 | |
| 
 | |
|    GitHub issue: [rabbitmq-server#1332](https://github.com/rabbitmq/rabbitmq-server/issues/1332)
 | |
| 
 | |
|  * LF and CR are now stripped off of names of queues and exchanges
 | |
| 
 | |
|    Although line feeds in names are permitted under the AMQP 0-9-1 spec,
 | |
|    in practice they can make it very difficult to work with queues and exchanges.
 | |
|    Stripping them out makes life much easier for developers.
 | |
| 
 | |
|    GitHub issue: [rabbitmq-server#710](https://github.com/rabbitmq/rabbitmq-server/issues/710)
 | |
| 
 | |
|  * Deletion of auto-delete and exclusive queues now leaves (debug) log entries
 | |
| 
 | |
|    GitHub issue: [rabbitmq-server#590](https://github.com/rabbitmq/rabbitmq-server/issues/590)
 | |
| 
 | |
|  * `rabbitmqctl set_vm_high_watermark` now produces more useful error messages when
 | |
|     relative values provided are outside of the `0..1.0` range.
 | |
| 
 | |
|     GitHub issue: [rabbitmq-cli#157](https://github.com/rabbitmq/rabbitmq-cli/issues/157)
 | |
| 
 | |
| #### Bug Fixes
 | |
| 
 | |
|  * Mirrored queue could terminate if a policy is re-applied concurrently after promotion
 | |
| 
 | |
|    GitHub issue: [rabbitmq-server#803](https://github.com/rabbitmq/rabbitmq-server/issues/803)
 | |
| 
 | |
|  * Old incarnations of queue mirrors are stopped before new ones start
 | |
| 
 | |
|    GitHub issue: [rabbitmq-server#863](https://github.com/rabbitmq/rabbitmq-server/issues/863)
 | |
| 
 | |
|  * Channel interceptors are enabled/disabled together with plugins
 | |
| 
 | |
|    GitHub issue: [rabbitmq-server#559](https://github.com/rabbitmq/rabbitmq-server/issues/559)
 | |
| 
 | |
| 
 | |
| ### CLI Tools
 | |
| 
 | |
| CLI tools were [significatnly redesigned](https://groups.google.com/forum/#!searchin/rabbitmq-users/ANN$20New$20CLI$20tools%7Csort:relevance/rabbitmq-users/x0XugmBt-IE/t2wdjIdSBgAJ),
 | |
| now can be extended from plugins and support command
 | |
| aliases (à la Git). There's also a new tool, `rabbitmq-diagnostics`, and several new commands available.
 | |
| 
 | |
| GitHub issues: [rabbitmq-server#577](https://github.com/rabbitmq/rabbitmq-server/issues/577), [rabbitmq-cli#38](https://github.com/rabbitmq/rabbitmq-cli/issues/38), [rabbitmq-server#1085](https://github.com/rabbitmq/rabbitmq-server/issues/1085),
 | |
| 		  [rabbitmq-cli#10](https://github.com/rabbitmq/rabbitmq-cli/issues/10), [rabbitmq-cli#178](https://github.com/rabbitmq/rabbitmq-cli/issues/178), [rabbitmq-cli#180](https://github.com/rabbitmq/rabbitmq-cli/issues/180).
 | |
| 
 | |
| #### Enhancements
 | |
| 
 | |
|  * New CLI command for closing connections in bulk (e.g. a specific vhost).
 | |
| 
 | |
|    GitHub issue: [rabbitmq-server#849](https://github.com/rabbitmq/rabbitmq-server/issues/849)
 | |
| 
 | |
|  * New CLI command for detecting potentially stuck
 | |
|    processes (previously invoked as `rabbit_diagnostics:maybe_stuck/0` via `rabbitmqctl eval`).
 | |
| 
 | |
|    GitHub issue: [rabbitmq-cli#144](https://github.com/rabbitmq/rabbitmq-cli/issues/144)
 | |
| 
 | |
|  * New CLI command that lists non-AMQP connections (e.g. MQTT).
 | |
| 
 | |
|    GitHub issue: [rabbitmq-cli#121](https://github.com/rabbitmq/rabbitmq-cli/issues/121)
 | |
| 
 | |
|  * New CLI command that outputs effective Erlang cookie hash.
 | |
| 
 | |
|    GitHub issue: [rabbitmq-cli#151](https://github.com/rabbitmq/rabbitmq-cli/issues/151)
 | |
| 
 | |
|  * `rabbitmq-plugins list` will now only recognise Erlang applications that depend on
 | |
|    `rabbit` as plugins. Plugins that lacks the dependency will still function and
 | |
|    can be enabled or disabled but won't be listed.
 | |
| 
 | |
|    GitHub issue: [rabbitmq-server#1124](https://github.com/rabbitmq/rabbitmq-server/issues/1124)
 | |
| 
 | |
| 
 | |
| 
 | |
| ### Management plugin
 | |
| 
 | |
| #### Enhancements
 | |
| 
 | |
|  * Statistics database is now distributed across the cluster: each nodes stores its own stats.
 | |
| 
 | |
|    GitHub issue: [rabbitmq-management#236](https://github.com/rabbitmq/rabbitmq-management/issues/236)
 | |
| 
 | |
| * Migration to Cowboy REST
 | |
| 
 | |
|    RabbitMQ management plugin as well as its extensions (e.g. those of
 | |
|    Federation and Shovel, `rabbitmq-top`) now uses [Cowboy REST](http://ninenines.eu/docs/en/cowboy/HEAD/guide/rest_handlers/)
 | |
|    instead of Webmachine. Cowboy is a state-of-the-art open source Erlang HTTP 1.1 server and REST micro framework
 | |
|    that is also used in the plugins that provide WebSocket support.
 | |
| 
 | |
|    The change is largely invisible to management UI and HTTP API
 | |
|    clients but there are minor changes that can affect test suites: for example,
 | |
|    `POST` and `PUT` responses now use `201 Created` instead of `204 No Content`.
 | |
| 
 | |
|    Plugins that extend management UI need to be ported to Cowboy REST and Cowboy 2.
 | |
| 
 | |
|    GitHub issue: [rabbitmq-management#63](https://github.com/rabbitmq/rabbitmq-management/issues/63)
 | |
| 
 | |
|  * Users tagged with `administrator` now implicitly have access to most operations in all vhosts,
 | |
|    including those they don't have explicit permissions for.
 | |
| 
 | |
|    GitHub issue: [rabbitmq-management#461](https://github.com/rabbitmq/rabbitmq-management/issues/461)
 | |
| 
 | |
|  * User that creates a vhost is automatically granted full permissions in it. This is a usability
 | |
|    improvement to the management UI. Note that this assumes that a user that has the permissions to create
 | |
|    vhosts also has the permission to grant themselves permissions to any vhost, so this changes nothing in
 | |
|    terms of security.
 | |
| 
 | |
|    GitHub issue: [rabbitmq-management#445](https://github.com/rabbitmq/rabbitmq-management/issues/445)
 | |
| 
 | |
|  * New HTTP API endpoint allows for bulk deletion of users.
 | |
| 
 | |
|    GitHub issue: [rabbitmq-management#448](https://github.com/rabbitmq/rabbitmq-management/issues/448)
 | |
| 
 | |
|  * Node endpoint now returns more information about [memory use breakdown](http://next.rabbitmq.com/memory-use.html).
 | |
|    This is **breaking change**.
 | |
| 
 | |
|    GitHub issue: [rabbitmq-management#499](https://github.com/rabbitmq/rabbitmq-management/issues/499)
 | |
| 
 | |
|  * Report more TLS-related values via HTTP API
 | |
| 
 | |
| 	The HTTP API now reports all SSL/TLS options available for the RabbitMQ server as well as for the management plugin.
 | |
| 
 | |
| 	GitHub issue: [rabbitmq-management#163](https://github.com/rabbitmq/rabbitmq-management/issues/163)
 | |
| 
 | |
|  * Topic authorisation permission management.
 | |
| 
 | |
|    GitHub issue: [rabbitmq-management#405](https://github.com/rabbitmq/rabbitmq-management/issues/405)
 | |
| 
 | |
|  * Dual IP Stack Support
 | |
| 
 | |
|    Management plugin now can be configured to use IPv6 or both IPv6 and IPv4.
 | |
| 
 | |
|    GitHub issue: [rabbitmq-management#64](https://github.com/rabbitmq/rabbitmq-management/issues/64)
 | |
| 
 | |
|  * "Get messages" in the UI now offers more requeueing options. This is a **breaking change** for HTTP API
 | |
|     clients as the list of accepted `ackmode` field values has [changed](https://rawcdn.githack.com/rabbitmq/rabbitmq-management/v3.7.0/priv/www/api/index.html).
 | |
| 
 | |
|    GitHub issue: [rabbitmq-management#68](https://github.com/rabbitmq/rabbitmq-management/issues/68)
 | |
| 
 | |
| 
 | |
| ### Java client
 | |
| 
 | |
| These release notes are for the 4.0 release. Please see [Java client release notes](https://github.com/rabbitmq/rabbitmq-java-client/releases)
 | |
| for information about later releases.
 | |
| 
 | |
| #### Enhancements
 | |
| 
 | |
|  * Bump default TLS version to v1.2 with a fallback for older JDKs
 | |
| 
 | |
|    The Java client now attempts to use TLS v1.2 by default (which many RabbitMQ servers prefer due to vulnerabilities in TLS v1)
 | |
|    but falls back to TLS v1 for older JDKs such as JDK 6.
 | |
| 
 | |
|    GitHub issue: [rabbitmq-java-client#139](https://github.com/rabbitmq/rabbitmq-java-client/issues/139)
 | |
| 
 | |
|  * Begin recovery after all shutdown listeners have been given a chance to run
 | |
| 
 | |
|    GitHub issue: [rabbitmq-java-client#135](https://github.com/rabbitmq/rabbitmq-java-client/issues/135)
 | |
| 
 | |
|  * `com.rabbitmq.client.Connection` and `com.rabbitmq.client.Channel` now implement `java.io.Closeable`
 | |
| 
 | |
|    GitHub issue: [rabbitmq-java-client#131](https://github.com/rabbitmq/rabbitmq-java-client/issues/131)
 | |
| 
 | |
| 
 | |
| ### .NET Client
 | |
| 
 | |
| These release notes are for the 4.0 release. Please see [.NET client release notes](https://github.com/rabbitmq/rabbitmq-dotnet-client/releases)
 | |
| for information about later releases.
 | |
| 
 | |
| #### Enhancements
 | |
| 
 | |
|  * .NET Core support (as of .NET client `4.0.0`).
 | |
| 
 | |
|    GitHub issues: [rabbitmq-dotnet-client#148](https://github.com/rabbitmq/rabbitmq-dotnet-client/issues/148), [rabbitmq-dotnet-client#213](https://github.com/rabbitmq/rabbitmq-dotnet-client/issues/213), [rabbitmq-dotnet-client#206](https://github.com/rabbitmq/rabbitmq-dotnet-client/issues/206)
 | |
| 
 | |
|  * AppVeyor CI and NuGet feed of Nightly Builds
 | |
| 
 | |
|    GitHub issue: [rabbitmq-dotnet-client#206](https://github.com/rabbitmq/rabbitmq-dotnet-client/issues/206)
 | |
| 
 | |
| 
 | |
| ### MQTT plugin
 | |
| 
 | |
| #### Enhancements
 | |
| 
 | |
|  * Topic authorisation.
 | |
| 
 | |
|    GitHub issues: [rabbitmq-mqtt#95](https://github.com/rabbitmq/rabbitmq-mqtt/issues/95), [rabbitmq-server#505](https://github.com/rabbitmq/rabbitmq-server/issues/505), [rabbitmq-mqtt#114](https://github.com/rabbitmq/rabbitmq-mqtt/issues/114).
 | |
| 
 | |
|  * Client ID is propagated to [authentication backends](http://rabbitmq.com/access-control.html).
 | |
| 
 | |
|    GitHub issue: [rabbitmq-mqtt#139](https://github.com/rabbitmq/rabbitmq-mqtt/issues/139)
 | |
| 
 | |
|  * QoS 2 subscriptions are downgraded to QoS 1
 | |
| 
 | |
|    GitHub issue: [rabbitmq-mqtt#21](https://github.com/rabbitmq/rabbitmq-mqtt/issues/21)
 | |
| 
 | |
| 
 | |
| ### Shovel Plugin
 | |
| 
 | |
| #### Enhancements
 | |
| 
 | |
|  * Support for AMQP 1.0 and a foundation for more protocols supported in the future.
 | |
|    This means cross-protocol shoveling (AMQP 0-9-1 to AMQP 1.0 or the other way around) is now
 | |
|    supported. [Erlang client for AMQP 1.0](https://github.com/rabbitmq/rabbitmq-amqp1.0-client) is now also available
 | |
|    as a standalone project.
 | |
| 
 | |
|    GitHub issue: [rabbitmq-shovel#26](https://github.com/rabbitmq/rabbitmq-shovel/issues/26)
 | |
| 
 | |
|  * Message timestamping.
 | |
| 
 | |
|    Shovel now adds an extra header that contains the timestamp
 | |
|    indicating when message was shovelled.
 | |
| 
 | |
|    GitHub issue: [rabbitmq-shovel#2](https://github.com/rabbitmq/rabbitmq-shovel/issues/2)
 | |
| 
 | |
| 
 | |
| ### Federation Plugin
 | |
| 
 | |
| #### Enhancements
 | |
| 
 | |
|  * New CLI command that restarts a link.
 | |
| 
 | |
|    GitHub issue: [rabbitmq-federation#45](https://github.com/rabbitmq/rabbitmq-federation/issues/45)
 | |
| 
 | |
| #### Bug Fixes
 | |
| 
 | |
|  * Internal exchanges and queues are now cleaned up if the policy goes out of effect or the plugin is disabled.
 | |
| 
 | |
|    GitHub issue: [rabbitmq-federation#63](https://github.com/rabbitmq/rabbitmq-federation/issues/63)
 | |
| 
 | |
| ### Event Exchange Plugin
 | |
| 
 | |
| #### Enhancements
 | |
| 
 | |
|  * Acting user information is now included into the emitted events where possible.
 | |
| 
 | |
|    GitHub issue: [rabbitmq-event-exchange#10](https://github.com/rabbitmq/rabbitmq-event-exchange/issues/10)
 | |
| 
 | |
| 
 | |
| ### AMQP 1.0 Plugin
 | |
| 
 | |
| This release introduces a new sub-project, an [Erlang client for AMQP 1.0](https://github.com/rabbitmq/rabbitmq-amqp1.0-client), and AMQP 1.0 support
 | |
| in the Shovel plugin.
 | |
| 
 | |
| #### Bug Fixes
 | |
| 
 | |
|  * Transfer frames are no longer sent before credit has been granted.
 | |
| 
 | |
|     GitHub issue: [rabbitmq-amqp1.0#43](https://github.com/rabbitmq/rabbitmq-amqp1.0/issues/43)
 | |
| 
 | |
|  * Ensure messages with `uint` TTL can round trip.
 | |
| 
 | |
|    GitHub issue: [rabbitmq-amqp1.0#13](https://github.com/rabbitmq/rabbitmq-amqp1.0/issues/13)
 | |
| 
 | |
| 
 | |
| ### LDAP Authn/Authz Backend
 | |
| 
 | |
| #### Enhancements
 | |
| 
 | |
|  * Topic authorisation support with variable expansion.
 | |
| 
 | |
|    GitHub issue: [rabbitmq-auth-backend-ldap#71](https://github.com/rabbitmq/rabbitmq-auth-backend-ldap/issues/71)
 | |
| 
 | |
| 
 | |
| ### Delayed Message Exchange Plugin
 | |
| 
 | |
| #### Enhancements
 | |
| 
 | |
|  * It is now possible to see how many messages are delayed in management UI
 | |
| 
 | |
|    GitHub issue: [rabbitmq-delayed-message-exchange#3](https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/issues/3)
 | |
| 
 | |
| 
 | |
| ### Erlang Client
 | |
| 
 | |
| #### Bug Fixes
 | |
| 
 | |
|  * Connection operations now use a reasonable timeout.
 | |
| 
 | |
|    GitHub issue: [rabbitmq-erlang-client#85](https://github.com/rabbitmq/rabbitmq-erlang-client/issues/85)
 | |
| 
 | |
| 
 | |
| ### AMQP 0-9-1 Authn/Authz Backend
 | |
| 
 | |
|  * Topic authorisation support with variable expansion.
 | |
| 
 | |
|    GitHub issue: [rabbitmq-auth-backend-amqp#16](https://github.com/rabbitmq/rabbitmq-auth-backend-amqp/issues/16)
 | |
| 
 | |
| 
 | |
| ## Upgrading
 | |
| 
 | |
| To upgrade a non-clustered RabbitMQ simply install the new version. All configuration and persistent message data are retained.
 | |
| When upgrading using definitions export/import from versions earlier than 3.6.0, see http://rabbitmq.com/passwords.html.
 | |
| 
 | |
| To upgrade a RabbitMQ cluster, follow the instructions [in RabbitMQ documentation](https://www.rabbitmq.com/clustering.html#upgrading).
 | |
| 
 | |
| ## Source code archives
 | |
| 
 | |
| **Warning**: The source code archive provided by GitHub only contains the source of the broker,
 | |
| not the plugins, CLI tools or other sub-projects. Please download the archive named `rabbitmq-server-<version>.tar.xz` from this release
 | |
| page.
 |