Immutant 0.10.0 Released

[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

Immutant 0.9.0 Released

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

Immutant 0.8.0 Released

We're as happy as Walter after Smokey marks it zero to announce our latest release of Immutant - version 0.8.0, hopefully culminating in a 1.0.0 version late winter/early 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?

The most exciting feature included in this release is our new Pipelines library, inspired by Rich Hickey's Clojure/Conj 2012 keynote and Zach Tellman's Lamina project.

In addition to Pipelines: caches can now be optionally persisted to disk, static asset middleware is context-aware, and idempotent behavior for messaging destinations should be more predictable.

We also upgraded a few runtime dependencies (nREPL, leiningen-core) and added a new one (cheshire). Plus we switched to codox for our API docs.

We know of no breaking API changes from 0.7.0, but we're sure you'll let us know if we missed something. ;-)

Get It

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

$ lein immutant install 0.8.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.8.0

  • [IMMUTANT-114] - support async servlet API
  • [IMMUTANT-115] - Make bultitude.core/namespaces-on-classpath work
  • [IMMUTANT-116] - Expose support for Infinispan cache loaders
  • [IMMUTANT-171] - Add messaging pipeline
  • [IMMUTANT-188] - AOT compiling immutant.init breaks: web/start – not registering ring handlers
  • [IMMUTANT-189] - Switch from autodoc to codox for api docs.
  • [IMMUTANT-190] - jar mounts need to be under the deployment root for some of the AS's deployment scanners to work
  • [IMMUTANT-193] - file-store session persistence not working
  • [IMMUTANT-191] - Let xa/datasource accept :subprotocol and :subname as aliases
  • [IMMUTANT-195] - Immutant rejects URLs with %5C
  • [IMMUTANT-196] - Serve static assets for apps not mounted at root context
  • [IMMUTANT-198] - Replace queue listeners and append topic listeners by default
  • [IMMUTANT-199] - Expose the base url for a deployed webapp
  • [IMMUTANT-200] - replace data.json with cheshire
  • [IMMUTANT-201] - msg/request should return a IBlockingDeref instead of taking a :timeout parameter
  • [IMMUTANT-202] - update to leiningen-core 2.0.0-RC2
  • [IMMUTANT-204] - update to nrepl 0.2.1

Immutant 0.7.0 Released

We're as happy as something something to announce our latest release of Immutant - version 0.7.0, hopefully culminating in a 1.0.0 version late winter. 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?

Since 0.6.0, we've made a couple of changes that could potentially break your applications:

  • Immutant no longer looks in the root of the application for an immutant.clj initialization file. Instead, it looks on the classpath for an 'immutant.init' namespace. For your apps to run under 0.7.0, you'll need to move immutant.clj to src/immutant/init.clj and change its ns declaration to immutant.init. See the mailing list for more information.
  • Deployment descriptors are now evaluated instead of just being read in. This allows for dynamic configuration within the descriptor based on external data (system properties, environment variables). If you are using the plugin to deploy and have upgraded it to 0.14.0, this will not affect you. If you are creating descriptors via some other method, you will now need to quote any symbols in it.

We've also added a few new features:

  • If you are working with queues or topics that don't match the Immutant naming convention of containing 'queue' or 'topic', you can now mark them as queues or topics using the immutant.messaging/as-queue or immutant.messaging/as-topic functions.
  • Messages can now be encoded as edn, which is great for interoperating with other systems/languages. If you are working with ruby applications, TorqueBox 2.2.0 and up can natively consume and produce edn messages.

Get It

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

$ lein immutant install 0.7.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.7.0

  • [IMMUTANT-122] - nrepl socket remains open after undeploy
  • [IMMUTANT-132] - Move immutant.clj to an immutant.init ns
  • [IMMUTANT-168] - Document HornetQ destination and listener mbeans
  • [IMMUTANT-169] - strip immutant dependencies from the app's dep list
  • [IMMUTANT-170] - support edn as a message encoding
  • [IMMUTANT-173] - Get the build working with a 1.5.0-beta
  • [IMMUTANT-176] - resource dirs in the app root should have classpath precendence over dependency jars
  • [IMMUTANT-178] - Ability to explicitly declare queue vs topic instead of forcing naming
  • [IMMUTANT-180] - Don't rely on jboss.home.dir to find clojure.jar
  • [IMMUTANT-181] - Eval deployment descriptors
  • [IMMUTANT-183] - Listening to a remote destination from inside the container does not work
  • [IMMUTANT-184] - Can not schedule job from nREPL
  • [IMMUTANT-185] - PUT and DELETE requests are always rejected
  • [IMMUTANT-186] - move .tmp_jar_mounts out of the project root and to a real tmp dir

Immutant 0.6.0 Released

We're as happy as Burt Reynolds in the 70's to announce our latest release of Immutant - version 0.6.0, hopefully culminating in a 1.0.0 version this fallwinter. 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?

This is the second release in a row where we have focused on bug fixes and internal refactoring to clean things up as we approach 1.0.0. Our goal is to have a stable API by the first 1.0.0 beta.

Since 0.5.0, we've made a few API changes, some of which are breaking changes:

  • The immutant.utilities namespace has been renamed to immutant.util.
  • The immutant.daemons namespace has been reorganized - the most noticeable change being the run function has been changed to daemonize.
  • immutant.registry/fetch has been deprecated and replaced with immutant.registry/get.

We've also added a few new features in this release:

  • We now expose MBeans for HornetQ destinations and listeners.
  • immutant.dev/reload-project! will now load any data-readers specified by newly added dependencies.

With this release, we're bucking our trend of increasing the size of the distribution - 0.6.0 is 17Mb smaller than 0.5.0.

Get It

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

$ lein immutant install 0.6.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.

Jim and Toby will both be at Clojure/Conj later this week, so if you are there say 'hi' and watch Jim's talk on REPL driven development with Immutant (AKA "Immutant, I am in You!").

Issues resolved in 0.6.0

  • [IMMUTANT-141] - Expose mbeans for HornetQ destinations
  • [IMMUTANT-151] - include clojure-complete to allow nrepl completion to work
  • [IMMUTANT-154] - dev ns should load new data-readers
  • [IMMUTANT-153] - Don't allow HornetQ to shutdown while processors and queues are still up
  • [IMMUTANT-155] - web/start should be idempotent
  • [IMMUTANT-156] - msg/stop no longer fully stops destinations
  • [IMMUTANT-157] - non-root sub-contexts require a trailing slash
  • [IMMUTANT-158] - it's possible to get message listeners in an inconsistent state
  • [IMMUTANT-159] - msg/start & msg/stop should be synchronous
  • [IMMUTANT-160] - :path-info should be consistent
  • [IMMUTANT-161] - Update the web docs to be clearer about context-paths and path-info
  • [IMMUTANT-162] - Reduce jar duplication within our modules
  • [IMMUTANT-163] - msg/start should be idempotent
  • [IMMUTANT-164] - update docs to mention var quoting to achieve reloadability
  • [IMMUTANT-165] - Deprecate registry/fetch and prefer registry/get instead
  • [IMMUTANT-166] - Rename immutant.utilities to immutant.util
  • [IMMUTANT-167] - Rename daemons functions to be more clear