[Did you clean the sink?]

We're as happy as a boy with two A's to announce another alpha release of Immutant: version 0.10.0. "Another alpha? I thought you guys would be in beta by now!" We hear you. But when you ignore accomplishments, you rob yourself of some very satisfying moments. 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.

Where is 1.0.0.Beta1?

We've been saying for a while that the release after 0.9.0 would be 1.0.0.Beta1, and that was our intention until last week. After reviewing some of the changes going in to this release, we decided to do at least one more alpha to let you warm up to them.

These changes include:

  • The immutant.messaging/listen function is now asynchronous, so you must deref its result to make it synchronous. The only reason you might need to do this is when publishing to a topic immediately after calling listen. [IMMUTANT-217]
  • We've deprecated the immutant.cache/cache function, replacing it with two functions: create (to which cache is aliased) and lookup. We also exposed some eviction-related options. [IMMUTANT-263] [IMMUTANT-265]
  • The Pedestal project inspired us to add the immutant.web/start-servlet function, providing a means to mount any servlet (not just a Ring handler) on a web context.
  • To match conventions established by ring-server, we renamed the :reload option for immutant.web/start to :auto-reload? and better still -- we fixed it! We also honor the :reload-paths and :stacktraces? options. And since their default values are based on whether the :dev profile is active, things should "just work". [IMMUTANT-241]
  • We've exposed some of the underlying session options. You can now control the session timeout via immutant.web.session/set-session-timeout!, and control the session cookie name & other attributes via immutant.web.session/set-session-cookie-attributes!. [IMMUTANT-267]
  • Previously, we only activated the :dev profile at deployment, by default. Now we activate :dev, :user, and :base. Use Leiningen's with-profile higher order task to override. [IMMUTANT-270]

If folks are happy with the changes in this release, we'll roll out a 1.0.0.Beta1 "soon".

What else is in this release?

Other notable changes include:

  • Singleton at-style jobs now behave properly in a cluster. [IMMUTANT-146]
  • Immutant will now add any checkout dependencies to the application's effective classpath. [IMMUTANT-257]
  • When you set the :nrepl-port option, we write its value to target/nrepl-port in your project. This enables you to automatically discover the nREPL port when you set :immutant {:nrepl-port 0} in ~/.lein/profiles.clj, obviating the need to add extra config to all of your projects. Keep an eye out for a blog post on this technique soon. [IMMUTANT-255]
  • 0.10.0 has been tested with and supports Clojure 1.3.0, 1.4.0, and 1.5.1, and we've made 1.5.1 the default version for applications that don't provide a Clojure dependency. IMMUTANT-246]

Get It

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

$ lein immutant install 0.10.0

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

Note: if you plan on installing the full distributuion of 0.10.0, you will need to upgrade your lein-immutant to 0.18.1 (the slim distribution is installed by default, so this shouldn't affect many of you).

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.10.0

  • [IMMUTANT-146] - singleton at jobs should behave properly in a cluster
  • [IMMUTANT-197] - Let xa/datasource accept a connection uri
  • [IMMUTANT-212] - add way to specify values that can go in a dd inside an archive at creation time
  • [IMMUTANT-217] - Have msg/listen wait for the old listener to drain its handlers
  • [IMMUTANT-227] - Give each runtime test an isolated classloader
  • [IMMUTANT-232] - Provide an HASingleon barrier per-job
  • [IMMUTANT-234] - Add --include-dependencies do deployment documentation
  • [IMMUTANT-235] - Update internal clojure version to 1.5.0
  • [IMMUTANT-236] - Stopping a shared JMS dest affects apps still using it
  • [IMMUTANT-237] - App doesn't resume after missing dependency is restored
  • [IMMUTANT-238] - document the :selector option on msg/start
  • [IMMUTANT-240] - Use clojure.tools.reader for 1.5 reader/edn features
  • [IMMUTANT-241] - Use ring-server's option names and default them according to dev mode
  • [IMMUTANT-242] - see if any of our subsystems can just become vanilla modules
  • [IMMUTANT-243] - Unscheduling a job immediately after scheduling it fails
  • [IMMUTANT-245] - Turn web/start into a macro that ensures the handler is wrapped in a var
  • [IMMUTANT-246] - Update bundled clojure to 1.5.1
  • [IMMUTANT-247] - add smoke tests for checking releases
  • [IMMUTANT-250] - clojurescript compiler fails under an ImmutantClassLoader
  • [IMMUTANT-251] - Update to leiningen-core 2.1.0
  • [IMMUTANT-252] - support loading dependencies from a private s3
  • [IMMUTANT-253] - Expose the ability to mount a servlet at a sub-context-path
  • [IMMUTANT-255] - Write nrepl port to target/repl-port (handy when port=0)
  • [IMMUTANT-257] - Treat symlinks in checkouts/ directory same way as leiningen
  • [IMMUTANT-258] - Reconfigure caches even if replication mode doesn't change
  • [IMMUTANT-259] - improperly named test ns causes stack overflow
  • [IMMUTANT-260] - support :keywords for job names in addition to strings
  • [IMMUTANT-262] - Passing records to pipeline results in invalid EDN-encoding exception
  • [IMMUTANT-263] - Expose :max-entries and :eviction options for caches
  • [IMMUTANT-264] - decode for :clojure messages shouldn't treat them as :edn
  • [IMMUTANT-265] - Deprecate cache fn in favor of two fns: create and lookup
  • [IMMUTANT-266] - listen should decode with the classloader in use when the listener was registered
  • [IMMUTANT-267] - metadata of the JSESSIONID cookie should be exposed, for setting HttpOnly, Expires etc.
  • [IMMUTANT-270] - Modify the default profile set to be [:dev, :base, :user] instead of [:dev]
  • [IMMUTANT-272] - Make an effort to eliminate duplicate session cookies
  • [IMMUTANT-273] - Update to leininingen-core 2.1.3