Immutant 1.1.1 Released

We're as happy as these twin girls to announce Immutant 1.1.1 - "BlueChicago".

This is primarily a bug fix release and, unless any new bugs are reported against it, possibly our last 1.x release. We are now focusing our efforts on The Deuce. We will make every reasonable effort to fix any bugs reported against 1.x, but we will only be adding features to 2.x. 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?

See the details below, but highlights include:

  • Previous versions of Immutant hang on boot under Java 8. This is now fixed.
  • Clojure 1.6.0 is now the default when not specified, and we dropped support for 1.3.1 (you can still use it, we just don't test against it).
  • We unregister JDBC drivers at undeployment now, reducing the potential for memory leaks.
  • Recreating an Immutant cache with different options wasn't actually reconfiguring it. This is now fixed.
  • Any plugins that "hook" leiningen.core.main tasks in an app's project.clj could fail to deploy, usually with a bultitude error. Now fixed.

Get It

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

$ lein immutant install 1.1.1

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

What's next?

As we said above, we'll be focusing on Immutant 2, with a tentative release season beginning this summer.

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 1.1.1

  • [IMMUTANT-324] - Cache lookup can return one in a TERMINATED state
  • [IMMUTANT-386] - Enable messaging to be XA aware outside of container
  • [IMMUTANT-400] - ring request body can't be read multiple times
  • [IMMUTANT-401] - errors during loading of ring options (handler/init/destroy) are ignored
  • [IMMUTANT-402] - Honor nrepl options in the project.clj :ring map
  • [IMMUTANT-403] - cache/swap! on an inexistent key blocks forever
  • [IMMUTANT-406] - :last-value-queue fails with default :address-full-message-policy of :page
  • [IMMUTANT-407] - Plugins in project.clj that hook any leiningen.core.main tasks cause deployment to fail
  • [IMMUTANT-408] - Pipelines that should return nil instead return the deref timeout value
  • [IMMUTANT-409] - log message when msg/unlisten is called
  • [IMMUTANT-411] - Mention in the docs that listening with :concurrency on a topic may be a bad idea
  • [IMMUTANT-412] - Unable to deploy ima multiple times using deployment descriptors
  • [IMMUTANT-413] - web/run fails when not passed a Var as the handler
  • [IMMUTANT-415] - Jobs: allow configuration of thread pool size
  • [IMMUTANT-416] - auto nrepl starting in dev mode can't be disabled
  • [IMMUTANT-417] - Permgen leaks due to JDBC
  • [IMMUTANT-418] - Support Java 8
  • [IMMUTANT-420] - api doc src links don't work for protocol functions
  • [IMMUTANT-421] - Update to clojure 1.6.0
  • [IMMUTANT-423] - cache/create doesn't reconfigure an existing cache
  • [IMMUTANT-425] - Deploying archives still resolves plugin dependencies
  • [IMMUTANT-426] - expose :max-redelivery-delay in hornetq/set-address-options

lein-immutant Plugin 1.2.1 Released

We just released version 1.2.1 of our Leiningen plugin. This release contains the following changes:

  • Archives that include their dependencies now have deploy-time dependency resolution disabled by default.
  • Archives that include their dependencies now also include any plugin dependencies as well, though they will only be recognized by Immutant 1.1.1 or newer.
  • The archive subtask now takes a --version flag, which will cause the project version to be appended to the artifact name.
  • The archive, deploy, server, and test subtasks now trigger execution of any :prep-tasks (which are, by default, javac and compile).

For the full list of changes, see the milestone.

Get it

If you're already using lein-immutant you probably already know how to do this, but just in case - to install it, add it to the :plugins list in your :user profile in ~/.lein/profiles.clj:

{:user {:plugins [[lein-immutant "1.2.1"]]}}

Get in touch

If you have any questions, issues, or other feedback, you can always find us on #immutant on freenode or you can file an issue on lein-immutant.

The Deuce - Plans for Immutant 2

We haven't blogged about anything in a few months because we've been thinking about how we'd like to improve Immutant. We've come up with a couple of high-level goals:

  • Fully-functional libraries; no container required
  • Applications using those libraries should be optionally deployable to a stock WildFly or EAP container

One goal we don't have is API compatibility with Immutant 1.x.

Just Libraries

For its second major release, Immutant will simply be a collection of libraries, one for each of the commodity services currently available to applications using an Immutant 1.x container: web, scheduling, messaging, caching, and transactions. These services will be provided by the following underlying components: Undertow, Quartz, HornetQ, Infinispan, and Narayana, respectively. All but Quartz are the same as those used in WildFly 8.

So when you embed any Immutant 2.x library in your app, it will not require a "container" to be fully-functional. There is no required "installation" step. There is no required "deployment" step.

Just libraries.

Just WildFly/EAP

Fully-functional libraries are great, but there are still good reasons to deploy an app to a container, e.g. security, monitoring, clustering, etc. We want developers to be able to run the exact same application either outside or inside an app server. When outside, all functions in the Immutant namespaces will work as expected. But inside, you get more, automatically, without any changes to your code:

  • Web session replication
  • Load-balanced message distribution
  • Highly-available "singleton" scheduled jobs
  • Flexible Infinispan cache replication
  • Multiple polyglot app deployments

Immutant 1.x consists of modules and subsystems repackaged on top of a now-quite-old, forked AS7 distribution. AS7 is no longer under active development. All of the innovation is occurring in WildFly, and it became increasingly difficult to cherry-pick relevant changes into our fork.

So we're going to eliminate that headache in 2.x. Immutant applications will be deployable into stock, vanilla WildFly/EAP servers. No modules or subsystems or special deployment descriptors required. Just a jar file with a little code to setup the classpath and engage the container's services.

This means no more using Leiningen to resolve dependencies at deployment, which has been a source of bugs from the more adventurous project.clj files.

This also obviates overlay, another source of bugs. TorqueBox 4.x apps will work like Immutant 2.x, simple jar files deployed to stock WildFly/EAP installations, achieving the same features available from overlay today, without the brittle complexity.

Same Features, Less Hassle

Development is occurring on our thedeuce branch right now, but we'll merge it to master once we cut a 1.1.1 release. And we're publishing incremental releases here. We'll include more detailed instructions on how to try them in a future post. We currently have basic ring and scheduling support implemented, with both working standalone and inside a WildFly container. We hope to cut our first 2.x release this summer.

Immutant was inspired by its sister project, TorqueBox, under active development for almost 6 years now. Embracing Clojure's REPL, we strove to make Immutant's libraries more dynamic than TorqueBox. This caused the API's in each project to diverge somewhat, even though we have a number of community members who use both together via messaging, caching, etc.

So Immutant 2.x and TorqueBox 4.x represent an opportunity for both teams to work together to realign and harden the service API's, with an eye toward supporting other languages and implementations in the future. Please join us in either #torquebox or #immutant on freenode, to express your opinions and desires.

Immutant 1.1.0 Released

We're as happy as this penguin to announce Immutant 1.1.0 - "CelloPudding".

This is a feature and bug fix release. 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've upgraded Infinispan to its latest version: 6.0.0.Final. This is primarily to support using Immutant as a data store for Datomic and offers more stability improvements over the previous release.
  • We've shaved a few seconds off the boot process during application deployment. Part of gaining this speedup was no longer loading clojure.tools.logging, so if your app relies on it, it needs to be listed among your dependencies.
  • We've tried to reduce the "noise" in our log output. This is part of an ongoing process to log appropriate information at the right severity level. Feedback always appreciated in this regard.
  • You can now alter the logging level for the console output (and server.log) by setting the jboss.logging.level system property or by passing --log-level to the immutant run task of our plugin (assuming you are running version 1.2.0 of the plugin or newer).
  • Keyword arguments to our functions are now validated, reducing the risk of unexpected behavior due to typos.
  • We've expanded our messaging api to include per-queue address settings, inspired by Chas' work.
  • Fressian is now a supported codec for messaging and caching, inspired by Ian's work.
  • Immutant now implements the URLClasspath protocol introduced in version 0.2.2 of java.classpath enabling an accurate view of your app's isolated classpath within Immutant via a Clojure core library.
  • In the interest of speeding up our incremental builds, we've dropped support for apps using Clojure 1.3. They may still work, but that version is no longer a part of our integration tests.
  • We've also dropped support for our full distribution. We only ship a slim distro now, providing only the minimal JBoss services required to support our Clojure libraries. Over time, Immutant has diverged significantly from the main trunk of JBoss AS development now known as WildFly. For those seeking a full, modern JEE stack, WildFly is the best option. We're expecting future versions of Immutant to more seamlessly integrate with it.

Get It

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

$ lein immutant install 1.1.0

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

What's next?

Our plans are to begin development on version 2.x of Immutant, with a specific emphasis on the ability to optionally embed Immutant libraries within your app, as opposed to deploying them to a container. The latter will continue to be supported, of course, as there are applications for which it makes sense, but we want to explore the idea of embedding not only web features but messaging, caching and scheduling as well. We plan to devote time in the next few weeks figuring out what this will look like. Expect a blog post with more details soon.

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 1.1.0

  • [IMMUTANT-261] - add cluster tests
  • [IMMUTANT-320] - Consider supporting per-queue address-settings
  • [IMMUTANT-338] - Loading runtime/bootstrap is slower than a turtle drinking molasses on christmas
  • [IMMUTANT-359] - Remove deprecated functions
  • [IMMUTANT-373] - Upgrade Infinispan to 6.0.0
  • [IMMUTANT-376] - Bump up immutant.web's ring dep to 1.2.1
  • [IMMUTANT-379] - loading immutant.xa before runtime initialization causes immutant.xa.transactions/manager to be nil
  • [IMMUTANT-380] - Support data.fressian as a codec
  • [IMMUTANT-381] - Update to leiningen-core 2.3.4
  • [IMMUTANT-382] - Update HornetQ to 2.3.1.Final
  • [IMMUTANT-383] - at-exit fn seems to execute at point where clojure runtime not available
  • [IMMUTANT-387] - Drop support for clojure 1.3.0
  • [IMMUTANT-389] - AbstractMethodError when using transactions (database)
  • [IMMUTANT-391] - messaging.core/delayed shouldn't call the given fn on a realized? call
  • [IMMUTANT-392] - Disable the full build, and adjust for having just a slim build
  • [IMMUTANT-393] - Spruce up docs around running Immutant
  • [IMMUTANT-394] - Enable org.clojure/java.classpath to work inside Immutant
  • [IMMUTANT-395] - Support fn definitions in :nrepl-middleware
  • [IMMUTANT-396] - msg/start docs should mention that :durable and :selector are only for queues
  • [IMMUTANT-397] - Consider validating options passed to various fns
  • [IMMUTANT-398] - Reduce logging noise

lein-immutant Plugin 1.2.0 Released

We just released version 1.2.0 of our Leiningen plugin. This release contains the following changes:

  • You can now pass --log-level to the immutant run task to adjust the logging level for the console and server.log output. This only works with Immutant 1.1.0 or newer.
  • The immutant run task also now takes --offset and --node-name options as shortcuts for using a port offset and for setting the node name when in a cluster.
  • There is now an immutant server task that is analogous to ring server. It will install Immutant (if not already installed), deploy the current application, run Immutant, and open the first web handler registered by the app in a browser (this latter step requires Immutant 1.1.0).
  • Tasks that require Immutant to be installed (deploy, run, server, test) will now automatically install the latest versioned release if no Immutant is available.
  • A few minor fixes around the overlay task, including preserving proper executable permissions on scripts in the overlaid install.

For the full list of changes, see the milestone.

Get it

If you're already using lein-immutant you probably already know how to do this, but just in case - to install it, add it to the :plugins list in your :user profile in ~/.lein/profiles.clj:

{:user {:plugins [[lein-immutant "1.2.0"]]}}

Get in touch

If you have any questions, issues, or other feedback, you can always find us on #immutant on freenode or you can file an issue on lein-immutant.