- [Fix] Fix getStoreUsage() returning an invalid percentage for persistent stores
- [Fix] Fix listener JMX domain
- [Feature] JMX : also serve plateform MBeans when available
- [Fix] Java 1.4 runtime compatibility was broken in several places !
- [Fix] Make sure UUIDProvider does not crash on startup if the localhost address is not available
for whatever reason (no available network interface or misconfigured hostname).
- [Fix] Transport endpoint : make sure we do not recycle an old response if the transport is concurrently closed.
This fixes a race condition were a commit could return successfully although no acknowledge was received.
- [Feature] New remote admin command : purgeQueue
- [Feature] New configurable topic subscriber policy feature in case of subscriber failure or queue full. (See 'subscriberFailurePolicy' and 'subscriberOverflowPolicy' topic properties)
- [Feature] Support for network interface address auto-discovery using special notation 'auto:eth0' for example
- [Feature] More JMX support : expired message count, store usage
- [Fix] Fixed SentToQueueCount counter behavior
- [Fix] Various cleanups and tunings
- [Feature] Disabled automatic overflow to persistent store by default (not a JMS compliant feature : breaks message ordering). Added new setting to re-enable it.
- [Feature] Added some javabean properties to connection factories to improve usability in third-party JMS tools.
- [Fix]Fixed BytesMessage reset() only working the first time.
- [Feature] Feature to auto-retry message put if remote queue is full
- [Fix] Do not clear pending messages if commit fails
- [Fix] Fixed invalid read/write lock usage
- [Feature] Tuned message serialization (changed protocol version)
- [Feature] Journal files recycling
- [Feature] Auto prune unnecessary journal operations to improve performance
- [Feature] Even more JMX
- [Fix] Synchronized message stores random access files more to avoid subtle concurrency bugs
- [Fix] Reworked destination locking during commit/rollback operations
- [Feature] More JMX support
- [Feature] Turned off journal files pre-allocation by default (this was a bit agressive for common use-cases)
- [Feature] More documentation
- [Fix] Fixed ping responses being filtered out, causing client timeouts when idle
- [Fix] Made endpoints more re-active on connection close
- [Fix] Various cleanups
- [Feature] Improved journaling store write concurrency
- [Feature] Lazily create journal files on first write
- [Feature] Added setting to choose the disk sync method (defaults to channel.force(false))
- [Feature] Journal files are now pre-allocated by default to improve performance
- [Fix] Messages received through local listeners were not properly de-serialized
- [Fix] Removing a message from store could corrupt the priority table
- [Fix] Shutdown on SIGINT was not properly waiting for the engine to stop, causing full recovery on next startup
- [Feature] Reworked the internal notification pipeline to improve throughput
- [Feature] Do not reply to async network requests to save bandwidth
- [Feature] Improved remote client prefetching
- [Feature] Lot of cleanups
- [Feature] New synchronization architecture to handle concurrent closing of resources
- [Fix] Reworked transaction boundaries : make sure everything is synced before
waking up consumers
- [Fix] Correctly re-acquire durable subscriptions (preventing a subscription leak).
- [Feature] Lot of performance tunings
- [Feature] Rewrote the persistence layer (journal-based, asynchronous)
- [Feature] Asynchronous acknowledgment of delivered messages
- [Feature] Improved architecture, easier to embed
Fixed BytesMessage reset() only working the first time.
Fixed a bug in datastore delete() that could lead to index corruption for
certain message and block sizes.
Correctly re-acquire durable subscriptions (preventing a subscription leak).
Changed default max message size (was too low for a default value).
Fixed CopyOnWriteList synchronization (could crash under heavy consumer re-connect load).
Fixed a race condition in the session updated queues list that would cause some messages not to be properly committed
in some situations.
Fixed some cases where an exception could abort an object close() too early
In-memory datastore had a different behavior from the persistent one when full.
If a volatile message was persisted bceause the in-memory datastore is full, the persistent store would not be properly synced.
Fixed a race-condition in the consumer round-robin dispatch algorithm that would cause starvation in some situations.
Fixed fairness of the consumer round-robin dispatch algorithm under heavy load.
Do not try to forward messages to consumers on a stopped connection.
Reworked locking in various places to fix concurrency issues
Workaround an issue with NIO and socket options on some platforms
Improved queue creation speed for volatile and/or temporary queues.
API cleanups, more javadoc.
Fixed various possible deadlocks when closing resources concurrently.
Increased default asynchronous queue max size.
Support for a redelivery delay after rollback.
(See deliver.redeliverDelay setting)
Some JMS specification compliance fixes.
Drop clients that did not create a first session quickly enough. (Improves server robustness regarding buggy clients)
Display listener's clients in JMX.
Reverted 2.0.9 change. Did not work with generic JMX consoles.
Reworked transaction demarcation : prefetching did not work well with multiple session consumers.
Improved deferred file deletion to workaround JVM limitations with memory mapped files.
Fixed an issue with JMX over RMI on localhost that prevented clients to connect.
Fixed rollback issue when persistent storage is disabled.
Made the server more robust regarding rogue connections stalled before authentication.
Support for tcp listener limit : do no accept more connections than specified by the listener capacity.
Made client properly close its connection when authentication fails.
Fixed spurious exception when a connection is auto-closed by garbage collection.
Context.SECURITY_PRINCIPAL and Context.SECURITY_CREDENTIALS were not taken into account when set in JDNI context.
Do not enforce initial packet size restriction on the client side. This was swallowing error messages returned by the server.
Fixed StreamMessage still read-only after calling clearBody().
Allow null objects to be stored in StreamMessage.
Fixed ObjectMessage not being read-only upon reception.
Fixed int to long conversion in queue size/offset computation that would overflow
very large queues.
Fixed exception handling in NIO Tcp multiplexer initialization.
Made async processor threads daemon so they don't block server or client JVM exit
Use shorter UUIDs for producer/consumers to save some bandwidth.
Fallback to persistent store if possible when a volatile store is full.
Made the server more robust regarding invalid protocol packets
Fixed possible deadlock in activity watchdog
ByteMessage implementation was broken
Made the server shutdown script more portable (Thanks Nick)
Rare deadlock when closing a connection while the watchdog is active
Fixed possible deadlock when stopping a JMS Bridge
Auto-close connection on transport failure
Fixed crash when remotely deleting a temporary queue or topic
Fix issue with temporary topic name being too long
New message-push architecture for remote consumers with even-better latency
Reworked the asynchronous dispatch system for better scalability with increasing number of consumers
Use NIO memory map features to improve performance
New optional NIO based packet transport option with improved scalability.
Available both on the server and client-side.
JMS Bridging support
Messages prefetching features for remote listeners to improve throughput
Reworked the JMX model.
Ping timeout support on remote connections to detect stalled consumers
Fixed a race condition in remote connection start
Do not dispatch messages if connection is not started
Fixed a socket leak on client disconnect
Issues with complex message selectors
Support for JMSRedelivered flag
Various small cleanups and specification compliance fixes
Fixed various bugs with messages priority that caused persisted messages priority to get messed up when the queuer was restarted,
and other invalid ordering behaviors
Report network errors to exception listeners so they have a chance to reconnect
Don't allow multiple templates with the same name
Trim values in properties files to avoid issues with white space in config. values
Better server behavior regarding stalled remote consumers
Reworked all thrown JMS exceptions : they now contain an error code
Added a shutdown hook to allow for graceful server shutdown on SIGINT/SIGTERM
Fixed a bug causing the queue store to be corrupted when the queue is almost full and you put a message that won't fit
Take FFMQ_BASE system property into account when looking for a default config file
Added support for FFMQ_HOME and FFMQ_BASE system properties to spawn multiple server instances using the same installation
Added support for system property replacement in settings and descriptor files
(JMX) Enforce use of 'management.jmx.agent.rmi.listenAddr' for exported MBean servers too
(was only used for the RMI registry)
(JMX) Added a workaround to close the MBeans RMI sockets when shutting down the JMX agent
Do not synchronize on client-provided message listeners to avoid possible deadlocks with
Fixed localTopicExists() returning invalid values (thanks to snappyh)
Purge administrative queues before starting the remote administration agent
Fix the admin client so it doesn't wait for a server reply when issuing a shutdown command
The purge() method on a LocalQueue no longer removes locked message to avoid concurrency issues
mx4j is now an optional runtime dependency
Support for asynchronous delivery of notifications to MessageListeners using a thread pool.
Slow message listeners no longer hang the whole server.
Detect unsupported delivery mode earlier when sending on a topic.
Destroying a temporary queue did not clear the associated pending changes in the current
transaction, thus causing store exceptions on the next commit/rollback operation.
Temporary queues cleanup failed if lock files were present.
Lock files are also deleted now.
Catch exceptions produced by invalid topic subscribers so they do not
break the put operation.
JMS expiration was not taken into account. Expired messages are now lazily removed when reading or browsing a queue.
Redelivered flag is now correctly set on rollbacked messages. (It still does not survive a server shutdown, though)
Destinations can now be looked up in JNDI under the names :
"queue/<queueName>" for queues and
"topic/<topicName>" for topics.
Queue browsers are now implemented.
A new class allows for an easy integration in the spring framework :
Pending get operations were incorrectly associated to their consumers
instead of the parent session : closing a consumer would then
rollback all pending get operations for that consumer.
The consumer can now be closed independently of the session lifecycle.
Closing a remote consumer/producer would not close the associated
objects on the server-side, causing a temporary leak until the
session was finally closed.