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

Immutant 0.5.0 Released

We're as happy as June bugs in July to announce our third bi-monthly beta release of Immutant - version 0.5.0, hopefully culminating in a 1.0.0 version this fall. 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?

Most of the effort in this release has been bug fixes and internal refactoring. But it hasn't all been fun and games, we also have added a few new features:

  • We now expose MBeans for scheduled jobs, allowing you some control over them via JMX.
  • Speaking of jobs - you can now access the scheduler for your application via immutant.jobs/internal-scheduler. This is useful if you want to use an alternate Quartz-based scheduling library (quartzite, for example).
  • You can now control the locking mode for caches.
  • The immutant.dev namespace can now be used with Clojure 1.3 applications.
  • The leiningen project for your application is now available via: (immutant.registry/fetch :project)

During this cycle, we've also made a few improvements to the lein-immutant plugin, most notably the ability to run tests for a project within an Immutant.

Get It

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

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

  • [IMMUTANT-34] - Expose mbeans for jobs
  • [IMMUTANT-124] - remove logged messages when using immutant namespaces outside of the container
  • [IMMUTANT-125] - Update deployment docs to describe new args
  • [IMMUTANT-127] - Locally install public jars from assembly/clojars dir
  • [IMMUTANT-128] - Expose optimistic/pessimistic locking modes for immutant-cache
  • [IMMUTANT-129] - Must be able to stop JMS destinations with corrupt messages
  • [IMMUTANT-130] - immutant.web.session doesn't delete session when set :session to nil in the ring response
  • [IMMUTANT-131] - Make the project.clj map available from the registry
  • [IMMUTANT-133] - Dynamically add source paths to the classpath via dev ns
  • [IMMUTANT-134] - Add a new task to the plugin for running in-container tests
  • [IMMUTANT-136] - Expose internal Quartz scheduler for use with external libs like Quartzite
  • [IMMUTANT-140] - Need ability to re-daemonize a daemon by the same name
  • [IMMUTANT-142] - Use servlets instead of servlet filters
  • [IMMUTANT-143] - dev ns shouldn't be calling bootstrap directly
  • [IMMUTANT-144] - Error occurs when deploying two apps that both depend on io.netty/netty
  • [IMMUTANT-145] - context path should be "" for the root context