We're as happy as a cat getting vacuumed to announce our second alpha release of The Deuce, Immutant 2.0.0-alpha2.

Big, special thanks to all our early adopters who provided invaluable feedback on alpha1 and our 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.

A few highlights of The Deuce compared to the previous 1.x series:

  • It uses the Undertow web server -- it's much faster, with WebSocket support
  • The source is licensed under the Apache Software License rather than LPGL
  • It's completely functional "embedded" in your app, i.e. no app server required
  • It may be deployed to latest WildFly for extra clustering features

What's changed in this release?

  • Though not strictly part of the release, we've significantly rearranged our documentation. The "tutorials" are now called "guides", and we publish them right along with the apidoc. This gives us a "one-stop doc shop" with better, cross-referenced content.
  • We've introduced an org.immutant/transactions library to provide support for XA distributed transactions, a feature we had in Immutant 1.x, but only recently made available in The Deuce, both within WildFly and out of the container as well. The API is similar, with a few minor namespace changes, and all Immutant caches and messaging destinations are XA capable.
  • We're now exposing flexible SSL configuration options through our immutant.web.undertow namespace, allowing you to set up an HTTPS listener with some valid combination of SSLContext, KeyStore, TrustStore, KeyManagers, or TrustManagers.
  • We've made a large, breaking change to our messaging API. Namely, we've removed the connection and session abstractions, and replaced them with a single one: context. This is somewhat motivated by our implementation using the new JMS 2.0 api's.
  • Datomic can now be used with an Immutant application when inside of WildFly without having to modify the WildFly configuration or add any exclusions. Unfortunately, you still cannot use Datomic with an application that uses org.immutant/messaging outside of WildFly, due to conflicts between the HornetQ version we depend on and the version Datomic depends on. See IMMUTANT-497 for more details.
  • HornetQ is now configured via standard configuration files instead of via static Java code, allowing you to alter that configuration if need be. See the messaging guide for details.

We've also released a new version of the lein-immutant plugin (2.0.0-alpha2). You'll need to upgrade to that release if you will use alpha2 of Immutant with WildFly.

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

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.

What's next?

We expect to release a beta fairly soon, once we ensure that everything works well with the upcoming WildFly 9 release.

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-alpha2

  • [IMMUTANT-466] - App using datomic can't find javax.net.ssl.SSLException class in WildFly
  • [IMMUTANT-467] - Datomic HornetQ Conflicts with WildFly
  • [IMMUTANT-473] - web/run only works at deployment inside wildfly
  • [IMMUTANT-474] - See if we need to bring over any of the shutdown code from 1.x to use inside the container
  • [IMMUTANT-475] - Write tutorial on overriding logging settings in-container
  • [IMMUTANT-477] - Figure out how to get the web-context inside WildFly
  • [IMMUTANT-478] - Consider wrapping scheduled jobs in bound-fn
  • [IMMUTANT-479] - Get XA working in (and possibly out of) container
  • [IMMUTANT-480] - Immutant running out of a container does not handle laptop suspend gracefully
  • [IMMUTANT-481] - Expose way to set the global log level
  • [IMMUTANT-482] - Destinations with leading slashes fail to deploy in WildFly
  • [IMMUTANT-483] - Allow nil :body in ring response
  • [IMMUTANT-484] - app-uri has a trailing slash
  • [IMMUTANT-485] - The wunderboss-core jar file has a logback.xml file packaged inside of it which competes with a locally configured logback.xml
  • [IMMUTANT-487] - Enable explicit control of an embedded web server
  • [IMMUTANT-488] - Provide better SSL support than just through the Undertow.Builder
  • [IMMUTANT-489] - Re-running servlets yields IllegalStateException
  • [IMMUTANT-490] - Don't register fressian codec by default
  • [IMMUTANT-491] - at-exit handlers can fail if they refer to any wboss components
  • [IMMUTANT-492] - Expose HornetQ broker configuration options
  • [IMMUTANT-493] - Revert back to :host instead of :interface for nrepl options
  • [IMMUTANT-494] - Expose controlling the context mode to listen
  • [IMMUTANT-496] - Expose way to override HornetQ data directories
  • [IMMUTANT-498] - Replace connection and session with a single context abstraction
  • [IMMUTANT-499] - Consider renaming :client-id on context to :subscription-name
  • [IMMUTANT-500] - Throw if listen, queue, or topic is given a non-remote context
  • [IMMUTANT-501] - Running the standalone JAR with default "/" context path requires extra slash for inner routes
  • [IMMUTANT-502] - Rename caching/compare-and-swap! to swap-in!