We're as happy as this parrot to announce our latest release of Immutant - version 0.9.0, hopefully culminating in a 1.0.0 version mid-spring. As always, view our road map here.

What is Immutant?

Immutant is an application server for Clojure. It's an integrated platform built on JBoss AS7 that aims to reduce the inherent incidental complexity in real world applications.

What's in this release?

  • We finally tackled one of our oldest outstanding issues - support for "at-style" jobs. Because we now accept either a hash or a cron spec in our schedule function, the order of its args changed, so read the at-jobs article for details.
  • We cut our distribution size in half and doubled the number of distributions we release. So there are now two Immutant distributions available: slim and full. Both support all the Immutant clojure libraries, but only full includes the JavaEE libraries as well.
  • We exposed an :encoding option for the Immutant caches and enhanced the caching library for TorqueBox so that Ruby and Clojure applications deployed to a TorqueBox-overlaid Immutant may share Infinispan caches. Expect a blog post demonstrating this soon.
  • With this release, Immutant will now honor :ring options in your project.clj in the absence of an :init function or immutant.init namespace. So, for example, a Luminus app created using lein new luminus myapp should deploy to Immutant without any further config.
  • One other change worth noting is that we upgraded the version of JBoss AS7 we depend on. Other than bug fixes, the primary motivation was HornetQ's new use of JGroups for clustering. This should facilitate auto-scaling on OpenShift, but there is still some work to do on that front.

Next: 1.0.0.Beta1

We're hoping to begin our beta cycle with our next release. This will mark the coagulation of our API's.

Get It

The simplest way to install or upgrade to 0.9.0 is via our Leiningen plugin:

$ lein immutant install 0.9.0

See our install page for more details. Once you have it installed, take a look at our tutorials.

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 0.9.0

  • [IMMUTANT-24] - Add 'at' support to jobs
  • [IMMUTANT-112] - Fix release job to retain build/clojars/
  • [IMMUTANT-135] - Share caches with TorqueBox apps
  • [IMMUTANT-138] - Honor :repl-options when starting nrepl servers
  • [IMMUTANT-147] - app may report it is fully deployed before initialization has finished creating web endpoints
  • [IMMUTANT-192] - Ability to define client reconnection and session reattachment options to factory
  • [IMMUTANT-203] - Non-normal priority messages can result in duplicate sends
  • [IMMUTANT-205] - *read-eval* should be false for decoding :edn and :clojure
  • [IMMUTANT-206] - Set the HTTP port via system property
  • [IMMUTANT-207] - msg/start fails for destinations that were started by another app
  • [IMMUTANT-208] - context-paths should be normalized
  • [IMMUTANT-209] - update to leiningen-core 2.0.0
  • [IMMUTANT-210] - msg/respond should set a :ttl for its messages
  • [IMMUTANT-211] - App bootstrap should be in its own module to isolate leiningen-core and its deps
  • [IMMUTANT-214] - Intermittent error invoking tests via fntest/nrepl
  • [IMMUTANT-215] - :test-paths should be on the effective classpath
  • [IMMUTANT-216] - ClojureRuntimeService gets shutdown before a Daemon's stop function is called
  • [IMMUTANT-218] - Update to the 7.2 AS line
  • [IMMUTANT-220] - we shouldn't be applying the :provided profile by default
  • [IMMUTANT-222] - Expose the encoding type used for cached items
  • [IMMUTANT-223] - Remote listeners don't ack delivery so messages remain in queue
  • [IMMUTANT-224] - Honor :ring options in lieu of any standard Immutant bootstrap options
  • [IMMUTANT-225] - Immutant rejects URLS with %2F
  • [IMMUTANT-226] - Add :init and :destroy optional callbacks to web/start
  • [IMMUTANT-228] - Create two distributions - 'slim' & 'full'
  • [IMMUTANT-231] - singleton and non-singleton jobs can't exist in the same application