We're as excited as this puppy to announce The Deuce's very last (we hope!) beta release: Immutant 2.0.0-beta3! We intend to release our final 2.0.0 next Monday during Clojure/West.

We would appreciate all interested parties to try out this release and submit whatever issues you find ASAP. And, as always, big thanks to all our early adopters who provided invaluable feedback on the alpha, beta, and incremental releases.

What is Immutant?

Immutant is an integrated suite of Clojure libraries backed by Undertow for web, HornetQ for messaging, Infinispan for caching, Quartz for scheduling, and Narayana for transactions. Applications built with Immutant can optionally be deployed to a WildFly cluster for enhanced features. Its fundamental goal is to reduce the inherent incidental complexity in real world applications.

What's changed in this release?

We have quite a few fixes in this release, as well as changes to a few things in the API that we wanted to get right before 2.0.0. The notable API changes are:

  • The concurrency for queue listeners now defaults to the number of cores to provide better messaging throughput out of the box (it was 1). The default for topic listeners remains at 1.
  • The :subscription-name option to immutant.messaging/context has been renamed to :client-id to remove confusion with the :subscription-name option to immutant.messaging/subscribe. Both are only used for durable topic subscribers.
  • immutant.messaging.pipeline/pipeline error handlers now get passed the decoded message instead of the Message object, and there is now a immutant.messaging.pipeline/retry function to ease retrying messages from the error handler.
  • You can now set the headers and status of an async HTTP channel response when calling immutant.web.async/send!. You can also now provide any valid Ring body type in addition to String and byte[] to send!.
  • The :on-complete option to immutant.web.async/send! has been replaced with two separate callback options: :on-success and :on-error.
  • immutant.transactions/manager is now a function instead of a value. If you were using the manager directly, you'll now need to invoke it.

For a full list of changes, see the issue list below.

lein-immutant 2.0.0

We've moved lein-immutant out of beta. The only changes in 2.0.0 over 2.0.0-beta1 are:

  • lein immutant war now properly honors a :main that points to a fully-qualified function in addition to a namespace
  • The test profile is now active when running lein immutant test

How to try it

If you're already familiar with Immutant 1.x, you should take a look at our migration guide. It's our attempt at keeping track of what we changed in the Clojure namespaces.

The guides are another good source of information, along with the rest of the apidoc.

For a working example, check out our Feature Demo application!

Get It

There is no longer any "installation" step as there was in 1.x. Simply add the relevant dependency to your project as shown on Clojars. See the installation guide for more details.

Get In Touch

If you have any questions, issues, or other feedback about Immutant, you can always find us on #immutant on freenode or our mailing lists.

Issues resolved in 2.0.0-beta3

  • [IMMUTANT-261] - add cluster tests
  • [IMMUTANT-360] - Consider defaulting listener :concurrency based on the number of cores
  • [IMMUTANT-514] - Notes for improving the migration guide
  • [IMMUTANT-525] - wrap-resource from ring 1.3.2 breaks requests to / in WildFly
  • [IMMUTANT-527] - Session cookie attributes ignored in-container
  • [IMMUTANT-528] - Update docs to cover the whys and hows of destination creation in WF
  • [IMMUTANT-529] - Websocket On-Close is Not Called in All Cases
  • [IMMUTANT-531] - Expose Undertow's AJP listener
  • [IMMUTANT-532] - HTTP streams close after 30 seconds inside WildFly
  • [IMMUTANT-533] - ring request maps fail when used with clojure.core/find
  • [IMMUTANT-534] - Fix web/run options when they are passed as strings (ala lein run)
  • [IMMUTANT-535] - Completed scheduled jobs never go away
  • [IMMUTANT-536] - WildFly module should transitively depend on tools.nrepl
  • [IMMUTANT-537] - request/response times out when used against multiple remote servers with the same queue name
  • [IMMUTANT-538] - Review guides before release
  • [IMMUTANT-539] - Multiple schedulers with different options cannot be created
  • [IMMUTANT-540] - Expose internal quartz scheduler
  • [IMMUTANT-543] - :on-close callback for web.async channel not firing when client disappears
  • [IMMUTANT-544] - Throw when immutant.messaging.hornetq/set-address-settings is called in-container
  • [IMMUTANT-545] - Rename msg/context's :subscription-name back to :client-id
  • [IMMUTANT-546] - Calling immutant.scheduling/stop with no args throws NPE
  • [IMMUTANT-547] - Allow setting status and headers from async/send!
  • [IMMUTANT-548] - Transactions don't work from an uberjar
  • [IMMUTANT-549] - Allow sending ring bodies to channels
  • [IMMUTANT-550] - Replace :on-complete with :on-success & :on-error for async/send!
  • [IMMUTANT-553] - Don't create a transaction manager at compile time
  • [IMMUTANT-554] - Concurrent ws requests can cause a channel to be used for multiple clients in-container
  • [IMMUTANT-555] - pipeline error-handlers should be passed the decoded mesage
  • [IMMUTANT-556] - pipeline error-handlers should be able to retry a message and still deliver to the caller's future