Software AG

Universal Messaging 9.6 Release Notes

Universal Messaging

The market-leading universal messaging platform for real-time streaming across Enterprise, Web and Mobile.

Software AG Universal Messaging 9.6 Release Notes

Table of Contents

Universal Messaging 9.6 ...... 4 Java Transport API ...... 4 New Security Features ...... 4 MQTT Virtual Payload Types ...... 4 Universal Messaging 9.5.2 ...... 5 Off Heap Stores ...... 5 RDMA ...... 5 Multicast ...... 6 Individual Message Acknowledgement ...... 6 9.5 Additional Enhancements ...... 6 UM 9.1 (12019) to UM 9.1 12191 ...... 7 Bug Fixes And Enhancements ...... 7 UM 9.1 (Build 12091) ...... 8 Bug Fixes And Enhancements ...... 8 Universal Messaging 9.0 ...... 9 Priority Messaging ...... 9 Security Groups ...... 9 Shared Durable Subscription ...... 9 Software AG Installer ...... 9 Software AG License Key...... 10 Nirvana 7.0 (11318) to Nirvana 7.0 (11750) ...... 11 Bug Fixes And Enhancements ...... 11 Nirvana 7.0 Feature Summary ...... 15 Nirvana 7.0 EA2 (11091) to Nirvana 7.0 Release ...... 15 Enhancements ...... 15 Nirvana Server ...... 15 Enterprise Manager ...... 16 Javascript API ...... 16 Nirvana 7.0 EA1 (10869) to Nirvana 7.0 EA2 ...... 17 Shared Memory ...... 18 Data Group Fanout ...... 18 New JavaScript API ...... 18 Enterprise Manager ...... 18 Nirvana 7.0 Early Access 1 (EA1) – What’s New ...... 19 Multicast Support ...... 19 MQTT Support ...... 19 HTML 5 JavaScript ...... 20 Performance Improvements ...... 20 Data Routing Between Nirvana Clusters ...... 20 Nirvana Admin API Enhancements ...... 20 Nirvana Client API Enhancements ...... 20 Nirvana 6.1 Build 10802 to Nirvana 7.0 EA1 ...... 21 Bug Fixes And Enhancements ...... 21 Nirvana 6.1 Build 10750 to Nirvana 6.1 10802 ...... 22 Bug Fixes And Enhancements ...... 22 Nirvana 6.1 Build 10584 to Nirvana 6.1 Build 10750 ...... 23 Bug Fixes And Enhancements ...... 23 Release Date: 07/02/2014 Page: 2 of 38

Software AG Universal Messaging 9.6 Release Notes

Nirvana 6.0 Build 10438 to Nirvana 6.1 10584 ...... 25 Bug Fixes And Enhancements ...... 25 Nirvana 6.0 Build 10150 to 10438 ...... 28 New In This Release ...... 28 Bug Fixes And Enhancements ...... 29 Nirvana 6.0 Build 10130 to 10150 ...... 33 Bug Fixes & Enhancements ...... 33 Nirvana 6.0 – What’s New ...... 34 Data Streams & Data Groups ...... 34 Session Subscriber ...... 34 Nirvana .Net Extension API and Reactive Framework Support ...... 35 Nirvana JavaScript ...... 36 Nirvana 6.0 Build 10022 (RC1) to 6.0 Production Release ...... 37 Bug Fixes & Enhancements ...... 37

Release Date: 07/02/2014 Page: 3 of 38

Software AG Universal Messaging 9.6 Release Notes

Universal Messaging 9.6 Universal Messaging 9.6 includes additional new features. These are described below.

Java Transport API In order to allow a broker less style of messaging, Universal Messaging now contains a new API : com.softwareag.um.io, which exposes the underlying communication drivers used within the UM client and server and enables direct communication between client applications using either tcp/ssl sockets, shm (shared memory) or RDMA protocols.

This simple to use API comes with examples found within the java/examples directory, which demonstrate how to use the synchronous and asynchronous style of delivery.

New Security Features Universal messaging now provides new security authentication features which offer password authentication (Plain and Cram-MD5) via SASL. The UM server now accepts user & password credentials from the client and enables administrators to lock down servers according to the type of pluggable providers configured on the UM server. Examples of the type of pluggable directory providers available are User File based (similar to htaccess like files), and LDAP.

MQTT Virtual Payload Types Universal messaging now provides MQTT users with the ability to define namespace roots where advanced namespace semantics can be applied. Specifically the last part of the full topic namespace address can be used to publish / subscribe indicating your preferred virtual payload type. Current supported types are

-1: UnspecifiedType (default), binary, equivalent to no type indicator 0: BaseMessageType, Unsupported 1: MapMessageType, UTF-8 JSON on MQTT, JMS MapMessage on native UM 2: BytesMessageType, binary, but identified as JMS BytesMessage 3: ObjectMessageType, java serialized bytes identified as JMS ObjectMessage 4: StreamMessageType, binary on MQTT, JMS StreamMessage on native UM 5: TextMessageType, UTF-8 string on MQTT, JMS TextMessage on native UM

Release Date: 07/02/2014 Page: 4 of 38

Software AG Universal Messaging 9.6 Release Notes

Universal Messaging 9.5.2 Universal 9.5 includes new features and improvements to Universal Messaging 9.0 and 9.1. It also contains all previous fixes applied to 9.0 and 9.1. These are described below.

Off Heap Stores UM 9.5.2 introduces a new store type for channels and queues – Off Heap. Off Heap Store is a new Topic or Queue store mechanism that uses memory that is not within the Java Heap space, but rather, its allocated directly from the host’s memory.

Any memory allocated within the JVM is subject to Garbage Collection inspection. This inspection allows the JVM to release unused memory and move memory that has been used for a while into different memory partitions. It also adds a level of jitter to the JVM, as it needs to pause while it does this inspection and potential move. The use of Off Heap memory stops the GC from inspecting and moving these regions since they are outside of the JVMs memory domain and, thus, reducing additional jitter within the Universal Messaging Server.

Since the events are stored in memory, access to the data is still extremely fast, so you get fast memory access with no impact from GC within the Server. This is extremely useful when using stores that can potentially contain data that will exist for a prolonged period of time which would otherwise impact GC pause times.

RDMA Remote direct memory access is a direct memory access from the memory of one computer into that of another without involving either one's . This permits high-throughput, low-latency networking, which is especially useful in massively parallel computer clusters.

With Shared Memory drivers built into Universal Messaging and supported in #, C++ and Java we can achieve very fast, high throughput messaging on the same machine. With conventional networking standards like TCP/IP all messages are pushed through the kernels network stack and back again. There are some off loaded drivers allowing the application code direct access to the Network card but these still require a layer of TCP above to interpret and manage. RDMA removes this restriction and allows an area of application memory to be mapped and then written to from a remote computer with no Operating System involvement at all, just the Interface card and driver marshalling the incoming event and putting the data directly to the applications memory. This achieves close to Shared Memory speeds but between 2 separate computers.

RDMA requires Infiniband to work. This could mean the use of Infiniband cards like those from Mellanox or use of Inifiniband Over Ethernet using RoCE

Release Date: 07/02/2014 Page: 5 of 38

Software AG Universal Messaging 9.6 Release Notes

Currently RDMA is supported in and the Java API. Windows, C++ and C# will follow soon.

Multicast Version 7.0 of Universal Messaging (formerly Nirvana) introduced IP Multicast delivery for Data Group and Inter-Cluster communication. In the 9.5 release of Universal Messaging we are pleased to announce the additional support for Multicast in channel / topic delivery. As multicast is a broadcast mechanism, the consumers will only be able to supported for Multicast when they do not use selectors in their subscriptions to channels.

Individual Message Acknowledgement With both topic and queue delivery in JMS, the acknowledge model implies that if you consume messages 1 through 10, but acknowledge message 5 only, then this automatically acknowledges messages 1 to 4 also. This is fine in most cases, however sometimes there is the requirement for applications to distribute the consumed messages across different threads or other components which makes this model a difficult fit.

In 9.5 we have now provided support for acknowledging individual messages, which ensures that only the specific message will be acknowledged.

9.5 Additional Enhancements Universal Messaging 9.5 also includes some additional enhancements to version 9.0. These are listed below.

- C++ platform support expansion (Linux 32 & 64 bit, Windows 32 & 64 bit) - Java / C# / C++ SHM performance enhancements - Persistent storage performance improvements

Release Date: 07/02/2014 Page: 6 of 38

Software AG Universal Messaging 9.6 Release Notes

UM 9.1 (12019) to UM 9.1 12191

Bug Fixes And Enhancements

Server i. License manager changed to use SoftwareAG licensing. ii. Resolve issue with Fanout executor threads where they would not yield resulting in higher than expected CPU spin under extreme load. iii. Improve performance of persistent & mixed stores by using ByteBuffer to map directly to the storage file. iv. Resolve issue with purges not getting propagated across the cluster. v. Enable conflation thread pool to be configurable. vi. Resolve problem with selector being dropped during recovery. vii. Fix issue that could cause realm permission corruption during websocket authentication. viii. Ensure events are always propagated to joins & not cleaned up if a remote realm is not connected. ix. Resolve issue with remote join restart that caused joins to fail. x. Modify the default cache age for events from 1 day to 1 minute to ensure faster cleanup up memory if events are not consumed.

Client API i. Resolve bug with batched publish of multiple events to a channel / queue. ii. Support Error codes in Java API exceptions.

JMS API i. Resolve problem when using unbound publishing with multiple destinations and transactional sessions. Multiple destinations are now correctly handled when using transactional sessions and unbound publishing. ii. Provide debug / tracing throughout the JMS API. iii. Fix default delivery mode on an unbound producer. iv. Immediately throw an exception when a destination is full, which can be handled more gracefully by the client. v. Provide caching within the JNDI context for improved lookup performance.

Admin API i. Resolve XML export problem with security groups. ii. Ensure the ACL is maintained when a Queue is copied.

Release Date: 07/02/2014 Page: 7 of 38

Software AG Universal Messaging 9.6 Release Notes

UM 9.1 (Build 12091) Universal Messaging 9.1 contains a small number of fixes and enhancements to version 9.0. These are described below.

Bug Fixes And Enhancements

Server i. License manager changes to support the new Terracotta License Management ii. Corrected issue when server under extreme load that caused an event to be delivered twice to the client iii. Extended the Server Embedded API to control more initial parameters via an API method. iv. Resolve incorrectly configured buffer size in the persistent store, which allowed large events to be written but not reloaded correctly. v. Resolve issue with client flow control on JMS Engine channels, which could result in message loss with slow consumers under load.

Enterprise Manager i. Corrected event snoop panel to display the ASCII panel in the correct order ii. Resolve some tab labels to have correct wording so they are more readable after name change.

Client API i. Support for Shared Memory IPC in C#, framework 3.5 ii. Improve latency and performance for all Shared Memory drivers in all languages. iii. Ensure server times out Shared Memory connected clients in a timely manner.

JMS API i. Resolve issue with clearBody and clearProperties methods in the Message implementations that caused not writeable exceptions to be thrown incorrectly.

Release Date: 07/02/2014 Page: 8 of 38

Software AG Universal Messaging 9.6 Release Notes

Universal Messaging 9.0 Universal Messaging 9.0 introduces some new and important features. These features are described below.

Priority Messaging Nirvana 9.0 includes support for Priority Messaging. This is the ability to process higher priority messages before lower priority messages in the client and server. The priority handling mechanism within the Universal Messaging server exists at various levels such that when messages are placed into a client's queue, they will be processed according to the priority, i.e. if there are already 5 messages with priorities 0-4 in the queue, and another message with priority 9 is added to the queue, then the next message to be pulled from the queue will be the priority 9 message. The internals of the prioritization mechanism have been written so they are also used within the client , such that the client APIs will also attempt to deliver messages to the client applications based on their priority.

Security Groups Security Groups have been introduced in Universal Messaging 9.0. Security groups offer the ability to create groups of users that can then be assigned permissions on Universal Messaging resources, such as realm ACLs & channel/queue ACLs. This reduces resource usage and simplifies the setup required by applications that use Universal Messaging to create their user permissions. For example, if a user required access to the realm, and say 100 channels, typically, there would need to be a realm ACL entry and 100 separate ACL entries (one per channel) created using the administration API. Using security groups, applications can instead add a security group (or groups) to the realm API as well as the 100 channels, and simply make one admin API call to add a user to the security group. Membership of the security groups then implies permission on all resources the security group has been added to.

Shared Durable Subscription Universal Messaging 9.0 introduces the concept of Shared Durable subscriptions. Durable subscriptions are topic based, meaning that all events on a topic are delivered to all consumers, however only one active consumer is typically permitted to bind itself to a durable subscription name. In Universal Messaging 9.0 there is now the ability for multiple active subscribers to bind to a subscription name, and each message will be delivered to only one of these consumers.

Software AG Installer Universal Messaging can now be installed using Software AG Installer in the same was as all other webMethods Products. This greatly simplifies installation and initial configuration of Universal Messaging in combination with other webMethods products and brings Universal Messaging in line with the proven Software AG Installation framework. Release Date: 07/02/2014 Page: 9 of 38

Software AG Universal Messaging 9.6 Release Notes

Software AG License Key Universal Messaging now uses the standard Software AG license key for authorizing the use of the product. A license key can be provided at installation-time or added later. If one is not provided during installation, then a trial license key will be installed that allows unrestricted use for 90 days. Existing Universal Messaging customers can request a license key by email from [email protected].

Release Date: 07/02/2014 Page: 10 of 38

Software AG Universal Messaging 9.6 Release Notes

Nirvana 7.0 (11318) to Nirvana 7.0 (11750)

Bug Fixes And Enhancements

Server

i. Resolve the cleanup of events on a channel / topic when using the JMS Engine for fanout to synchronous consumers. There was an issue where synchronous consumers connected to a topic would not be removed correctly resulting in events being stored but never cleaned up once consumed. ii. Improve performance of named object handling to use a faster collection for lookup and collection iterations. iii. Improve performance of synchronous channel consumers by enabling a batch / window size to be specified enabling faster delivery to client connections. iv. Resolve issue where cluster to cluster joins were not correctly handled in some situations where the join destination resource name exists on the source cluster. v. Improve nested group check during addStream calls so that only parent group arrays are checked. This issue caused additional time to be unnecessarily spent looping through data groups, which now does not happen. vi. Resolve resource leak when using data group listeners, where the listeners were not being correctly removed from data groups. vii. Ensure channel purge operations trigger status updates to keep admin APIs updated. viii. Fix a data group bug that could result in streams being incorrectly removed from a parent group when removed from a child group. ix. Fix a REST plugin bug where certain attributes in XML representations sent for publishing or purging events where always required and could not be omitted. x. Fix for batched create / delete of channels and queues when in a cluster. Depending on which node in the cluster the operation was performed, the stores were not always created or deleted on all realms. xi. Fix possibility of null entries being placed into an internal structure during data group flow control. xii. Ensure the default data group cannot be removed. xiii. Fix for recovery of events where incorrect membership could be reported from the channel subscriptions list resulting in events not being delivered correctly. xiv. Fix incorrect counter values for events consumed & received. xv. Resolve an issue that caused the setSubscriberName functionality to be lost during cluster event passing, resulting in all subscribers receiving the event from slave nodes.

Release Date: 07/02/2014 Page: 11 of 38

Software AG Universal Messaging 9.6 Release Notes

xvi. Identified and resolved an issue on Solaris/SPARC that was caused by the use of a high performance SpinLock mechanism that was problematic on SPARC architecture. xvii. Ensure snapshots for resources are delivered to new Admin API clients on connection to ensure information is up to date and correct. xviii. Resolve REST / SOAP / XML plugin delayed responses. xix. Resolve SOAP responses so that when a non standard port is used, this is reflected in the server response. xx. Resolve a thread synchronisation issue during inter realm disconnect that could prevent reconnection occurring.

Server / Java Client

i. Fixed an issue with our internal dictionary. It was possible for a key to falsely match an existing key and therefore change the value associated with the existing key. ii. Ensure batched deletions remove channels from the internal cache. iii. Correctly enable/disable updates for listeners attached to the default datagroup

Admin API

i. Resolve issue where status updates were not handled when the flag was set to not send all data groups on initial connection. Caused Admin API clients to not receive status updates for data groups with this flag set. ii. Resolved an issue that resulted in clusters not being connected to correctly. iii. Fix timing issue on reconnected connections during the setting up of listeners that could cause notifications to be missed. iv. nLinkNodes are now correctly used for realms with a mounted namespace. v. Fixed issue with nRealm object reuse which could cause non-mounted nRealmNode objects to appear mounted. vi. Fixed issue with nRealmNode reuse in joins or mountpoints where original nRealmNode is closed. vii. Fix setting Interface attributes through the Admin API. viii. Ensure all federated realms show up in the known realms list.

Enterprise Manager

i. Resolve issue where status updates were not handled when the flag was set to not send all data groups on initial data stream connection. Caused Admin API clients to not receive status updates for data groups with this flag set. ii. Fixed sorting of tables where sorting is enabled. iii. Performance improvements on startup and in general.

Release Date: 07/02/2014 Page: 12 of 38

Software AG Universal Messaging 9.6 Release Notes

iv. Log streaming modified to use the Save dialog enabling creation of folders. v. Fix interface delete dialog where closing the delete dialog still removed the interface. vi. Fix channel connections where if a user disconnected and reconnected, the connection would not reappear on the channel connections table. vii. Ensure when realms are disconnected, the node is displayed correctly as disconnected in the tree without the node being clicked on.

.Net / Silverlight

i. Fix asynchronous socket error handling so any async exceptions from the socket are handled and passed back through to the calling client code. ii. Expose the socket send / receive buffer sizes to provide better throughput if required. iii. Implement .Net multicast ack modes.

C++

i. Implement encryption key rotation in multicast communication. ii. Upgraded Poco to 1.4.3p1 to resolve poco bug on windows XP 32bit which meant it would not run. iii. C++/IOS resolve potential null pointer on session reconnection. iv. Added ability to add a log listener v. Resolve potential missed events or duplicates in multicast vi. Fix the string representation of fSubject

JavaScript

i. Fixed chunking protocols which allowed stream corruption (XDR Streaming and XHR CORS Streaming). ii. Performance improvements on all protocols. iii. Fixed latency issues with initial connections. iv. Fixed IE8 post message drivers issue. v. Removal of EA2 string from version comment. vi. Modified getData, setData so they are consistent with different variations of payload data. vii. Fix handling of byte arrays viii. Fix to allow websocket connections through reverse proxies that support it. ix. Fix to allow channel/queue names to be case-sensitive and include underscores x. Make session initialisation timeout a user-configurable value xi. Bug fix - batch re-subscription now uses the correct last eid. xii. Resolve various issues with session.stop(). xiii. Ensure a session, once stopped with stop(), can be started again with .start(). Release Date: 07/02/2014 Page: 13 of 38

Software AG Universal Messaging 9.6 Release Notes

xiv. If a session is in a stopped or non-started state, then developer code can create a new session with a different configuration. xv. If a session start fails because of a cross-domain server configuration setting, failover to another driver is now much faster. xvi. Fix an issue where stopped sessions that used the JSONP_LONGPOLL driver may receive old events from a presumed timed out response. xvii. Improved the XDR_STREAMING driver to handle bugs in some versions of IE9. xviii. Fix an issue with sessions not being startable when nirvana.js is loaded dynamically *after* the containing page has already loaded. xix. Improved low level debug output.

Release Date: 07/02/2014 Page: 14 of 38

Software AG Universal Messaging 9.6 Release Notes

Nirvana 7.0 Feature Summary

This release is the first production release of Nirvana 7.0. It contains all new features that were included in both EA1 and EA2, as well as additional improvements and features since the EA2 release. A quick summary of what is included in 7.0 is shown in the list below. Details of these can be found further down in this document.

 New ultra low latency Multicast functionality for inter-server cluster communications and Data Group client server communications.  Shared memory driver support for ultra fast intra host  Full support for the MQTT messaging standard.  HTML5 JavaScript API re-engineering & entirely new API  Improved performance giving lower latencies and higher throughput with updates to data group and channel fanout engines.  Enhancements to data routing between Nirvana clusters  Lightweight Synchronous Administration API  Improved batching client API features

Nirvana 7.0 EA2 (11091) to Nirvana 7.0 Release

Enhancements

The release provides a number of changes including feature additions and performance improvements. The three main areas of change are:

 Nirvana Server  Nirvana Enterprise Manager  Nirvana Javascript API

Nirvana Server

The Nirvana server has been updated so that a lock free executor pattern is now in use for channels and datagroups, providing a highly optimized fanout mechanism for event delivery. The same pattern is now also used to enable protocol request pipelining through multiple executors resulting in performance improvements and efficiency improvements in the server’s protocol processing modules. The new lock free executor comes with a configurable wait strategy to suit your appropriate deployment environment. At the moment, Nirvana provides spin, micro wait or block strategies.

Quite a few bugs have been fixed in the inter-cluster join functionality resulting in a reliability improvement and consistent behavior across joined clusters.

Release Date: 07/02/2014 Page: 15 of 38

Software AG Universal Messaging 9.6 Release Notes

Please note that this release will only allow cluster-wide to cluster-wide and local to local stores to be joined together. Using different store types will be supported in future releases.

The Nirvana server and Admin API have been modified to use hidden system datagroups to deliver status updates. This means that if a multicast configuration exists for the interface used to monitor / administer a Nirvana server, it can be automatically used hugely reducing the server overhead for delivering status updates. Additionally, the SHM driver has been optimized for performance and the Admin API has been enriched with GC statistics.

Finally, the Nirvana server has undergone optimizations in several areas such as String to Byte conversion, HTTP header parsing and ACL storage and management. All of these also result in reduced object creation, smaller memory footprint and therefore reduced GC calls and overall latency.

Enterprise Manager

The Nirvana Enterprise Manager has received several bug fixes and enhancements, specifically in areas where tree controls are being used such as the namespace tree and the JNDI tree. Both these trees now present nodes alphabetically sorted while pressing the * key toggles between expand / collapse of the currently selected sub tree.

Additionally, the namespace tree now supports rendering of a filtered subset so that users can only display a subset of the namespace that is relevant to their application, a great enhancement for Nirvana servers used for multiple applications. It is also possible to select multiple nodes of the same type in order to delete them in one click.

Finally, the JNDI tree now supports XA Connection factories and automatically expands sub trees.

Javascript API

The following new features have been added to the Nirvana Javascript API:

 New transport drivers have been added (EventSource and IFrame Streaming with postMessage proxying).  Added ability to programmatically check if a driver is supported in the current browser runtime.  Enhanced session creation configuration object with additional parameters (see API documentation for details).  Removed support for P2P to align API with focus on channels, queues and datagroups.  AlreadySubscribed exceptions now contain the resource that caused them to be raised. Release Date: 07/02/2014 Page: 16 of 38

Software AG Universal Messaging 9.6 Release Notes

The following performance improvements have been added to the Nirvana Javascript API:

 Improved DOM memory footprint  Introduced stricter comparison / type checks throughout the API  HTTP chunked encoding used where appropriate in all transport drivers (where this is supported)  Changed HTTP GET methods to HTTP POST wherever was more appropriate  No longer rely on cookies for session management  Dynamically load JSON parsing code only if browser does not support JSON  Modification of timeout logic to improve failover between transport drivers

The following security improvements have been added to the Nirvana Javascript API:

• Processing of postMessage requests is only allowed if they originate from a permitted domain • Publishing to a channel without a valid ACL now correctly throws a SecurityException

The following bugs have been fixed in the Nirvana Javascript API:

• Correctly detect CTRL-ALT-D debug window functionality for Internet Explorer browsers • Fixed an issue with subscribing to channels that were in the root of the namespace (not in a container) • Fixed an issue with encoding message selectors correctly • Fixed an issue with LP drivers where upon a session restart, multiple requests were made to the server

Nirvana 7.0 EA1 (10869) to Nirvana 7.0 EA2

This release is the 2nd Early Access version of Nirvana 7.0. As well as fixing minor bugs there is also some major additions between EA1 and EA2:

 New shared memory driver for intra-host messaging and improved performance.  New data group fanout engine.  New JavaScript API.  Enterprise Manager update and reorganisation.

Release Date: 07/02/2014 Page: 17 of 38

Software AG Universal Messaging 9.6 Release Notes

Shared Memory

With the introduction of the Nirvana Shared Memory Driver, client applications are able to specify a new RNAME protocol that will communicate with the Nirvana realm running on the same physical host through the physical machine therefore bypassing all Network IO. Clients connect to the Nirvana realm using the RNAME : shm://localhost/dev/shm for example where /dev/shm provides direct memory access.

Data Group Fanout

The fanout of events to data groups has been updated to remove any contention, thus improving latency further still. New internal processing flows and object structures have been written which enable Nirvana servers to deliver more events per second and with even lower latencies.

New JavaScript API

A new JavaScript API has been developed. This provides simplified session creation; the ability to attach multiple handlers to any callback; support for multiple transport drivers including XHR streaming, JSONP (in addition to existing WebSocket, forever iFrame and XHR long polling). In addition, there is a new Nirvana namespace providing access to a Nirvana Session and its factory methods for accessing resources such as channels, queues or services. Enterprise Manager

The Enterprise Manager has been updated with a new look and feel and better icons. It has also had a slight reorganisation where the monitoring based panels have been moved into a separate ‘Monitoring’ panel. There have also been new panels added for configuration of shared memory and inter cluster connectivity. Lastly, the ‘Interfaces’, ‘Multicast’ and ‘Shared Memory’ configuration panels now exist in their own ‘Comms’ panel.

Release Date: 07/02/2014 Page: 18 of 38

Software AG Universal Messaging 9.6 Release Notes

Nirvana 7.0 Early Access 1 (EA1) – What’s New

This release is an Early Access version of Nirvana 7.0. Version 7.0 introduces some new and exciting features and improvements, summarized below:

 New ultra low latency Multicast functionality for inter-server cluster communications and Data Group client server communications.  Full support for the MQTT messaging standard.  HTML5 JavaScript API re-engineering  Improved performance giving lower latencies and higher throughput.  Enhancements to data routing between Nirvana clusters  Lightweight Synchronous Administration API  Improved batching client API features Multicast Support

With each major release we aim to further improve the performance of Nirvana both in terms of latency and throughput. Whilst our TCP Unicast delivery has once again been improved in 7.0, we have also introduced TCP Multicast delivery for inter-server cluster communications as well as for delivery via Data Groups. Multicast delivery to clients via Data Groups is transparent to the user and will automatically begin if the client is capable of receiving Multicast packets. No changes to the client application are necessary to begin using multicast.

This has enabled us to further drive down latencies to under 50 microseconds for many thousands of clients connected.

MQTT Support

MQTT (MQ Telemetry Transport), is a simple and lightweight messaging protocol offering publish/subscribe functionality. MQTT has been specifically designed for constrained devices deployed with access to minimal bandwidth. These design criteria make MQTT the ideal protocol for the rapidly growing “machine to machine” (M2M) or “Internet of Things” world of connected devices.

The protocol is gaining a lot of traction in the marketplace and is highly suited to embedded hardware platforms as well as mobile applications where bandwidth and battery power are at a premium.

Nirvana 7 provides transparent support for MQTT as a new delivery channel within our Nirvana realm server. This feature allows compliant MQTT (version 3.1) clients to seamlessly communicate with Nirvana and its wide range of supported Enterprise, Web and Mobile devices.

Release Date: 07/02/2014 Page: 19 of 38

Software AG Universal Messaging 9.6 Release Notes

HTML 5 JavaScript

HTML5 JavaScript messaging is a major area of focus for Nirvana 7. Here is a brief summary of the changes that have been made:

 Wire protocol optimisation from client to server  Streamlining of event processing within the client libraries  Internal restructuring of libraries so that future HTML5 related enhancements can be added transparently

Performance Improvements

We have made significant progress again in terms of improving latency and throughput in Nirvana 7. In addition to the introduction of Multicast support we have also found additional gains in terms of our Unicast messaging. More can be found on the benchmarking section on our website.

Data Routing Between Nirvana Clusters

We have added the ability to use Nirvana joins to route data between Nirvana clusters. This feature is particularly useful for propagating data between Nirvana clusters over a WAN on a per channel basis.

Nirvana Admin API Enhancements

The Nirvana administration API now supports a synchronous ‘configuration’ only object which can be used to update Nirvana servers without the overhead of receiving asynchrnous server monitoring updates.

Nirvana Client API Enhancements

We have extended support for batching of Nirvana API calls. Multiple channel creation and deletion operations can now be batched in single server calls.

Release Date: 07/02/2014 Page: 20 of 38

Software AG Universal Messaging 9.6 Release Notes

Nirvana 6.1 Build 10802 to Nirvana 7.0 EA1

Bug Fixes And Enhancements

Java Admin API

i. With multiple channels stored within containers there was a possibility that the application could lock up while deleting a channel.

Python API

i. Exposed the nEventProperties.get(key) method and fixed iterating over nEventProperties. ii. Added support for nested dictionaries and arrays within nEventProperties.

Server

i. Provide more specific logging for when client connections are terminated, including where possible the actual underlying IO Exception that would indicate the source of the close. ii. Resolve an issue in the Scheduler within the Realm Trigger where the number of connections as well as event rates did not fire the trigger correctly. iii. During recovery of Data Groups within a cluster, ensure any snapshot events are recovered to all slaves from the master. (This change requires all realms in a cluster to be stopped and restarted at the same time). iv. When a client disconnects, ensure any Data Group snapshot events are delivered to the client on reconnect.

C++ Client API

i. Exposed extra methods required for the Python wrapper.

Release Date: 07/02/2014 Page: 21 of 38

Software AG Universal Messaging 9.6 Release Notes

Nirvana 6.1 Build 10750 to Nirvana 6.1 10802

Bug Fixes And Enhancements

Java Client API

i. Fixed a problem where unsigned applets using the Nirvana Client API would get security errors as a result of unchecked System property read attempts.

.Net Client API

i. Fixed bug that stopped certain cultures from being able to connect.

Enterprise Manager

i. Improved memory efficiency by limiting the number of active panels.

Server

i. Fixed cluster recovery of named object priority queues. ii. Added an optional flag to ignore the *@* subject during ACL checks if a more specific ACL entry exists. This way a system could allow all users to connect by default but exclude particular individuals.

Release Date: 07/02/2014 Page: 22 of 38

Software AG Universal Messaging 9.6 Release Notes

Nirvana 6.1 Build 10584 to Nirvana 6.1 Build 10750

Bug Fixes And Enhancements

.Net / Java / C++ / iOS Client API

i. Enable the passing of 3rd party cookies set from non browser based APIs. If an application connects to a Nirvana realm server via a load balancer, to maintain stickiness for these HTTP connections, some load balancers add a cookie that is checked on each HTTP request. In browser based APIs, (Silverlight, Flex, Javascript) these cookies are automatically set by the browser. In non browser based APIs, ie Java, .Net and C++ / iOS, these cookies are not set in subsequent HTTP calls after the initial long-lived connection. This has been rectified in all above mentioned language APIs. This can be achieved by using the honour3rdPartyCookies method in nConstants.

Java Client API

i. Enable the setting of send and receive socket buffer sizes in the client socket. This is achieved by using setSocketReceiveBufferSize, and setSocketSendBufferSize methods on nConstants.

C++ Client API

i. Enable the setting of send and receive socket buffer sizes in the client socket. This is achieved by using setSocketReceiveBufferSize, and setSocketSendBufferSize methods on nConstants.

.Net Admin API

i. Correctly apply the javascript attributes when adding/modifiying an nHTTPInterface

Javascript Client

i. Javascript clients now have a protocol selection mechanism. The user can pass the 'protocolSelection' option into NirvanaSession.start(). This option takes an array of transport modes in order of preference (e.g. ["websocket","streamingcomet","longpollcomet"]. If a session cannot be established on the most preferred protocol, the client will transparently move to the next preferred protocol. ii. Added a protocolChanged callback method to the NirvanaSession object. By defining a function and assigning it to NirvanaSession.protocolChanged the user can receive notifications when the client changes its communication mode.

Release Date: 07/02/2014 Page: 23 of 38

Software AG Universal Messaging 9.6 Release Notes

iii. Simplified the JavaScript keep-alive logic. JavaScript clients now only exchange keep-alive(s) with the server when no exchange of messages has taken place for a set period of time. This reduces the amount of bandwidth used by JavaScript clients. iv. Improvements to the Session Close logic. This should particularly improve the behaviour of older browsers when closing a session at the same time as navigating away from the page. v. JavaScript now supports all header information found in native client APIs through the implementation of a new nEventAttributes object. vi. Reduced the amount of debug generated by queuing a command. In busy periods this could have a noticeable effect on client performance. vii. Improved the logic surrounding IFrame resets when the content length of the IFrame is reached. viii. Users can now query what channels, queues and services they are subscribed to with the getSubscriptions() command on the NirvanaSession object. This optionally takes one parameter which is the resource type (channels, datagroups or queues). ix. Internet Explorer no longer shows the throbbing loading indicator when using IFrame communication modes. x. Clients can now set the session timeout value in the NirvanaSession.start config options. This will control how long a client waits before declaring itself disconnected and renegotiating a connection with the server. xi. Client side callbacks are once again invoked within a try catch block from the underlying API. Developers who wish to catch exceptions in their own handler code should therefore implement try/catch blocks themselves if they do not wish the built-in handlers to process any exceptions.

Java Admin API

i. Enhance the import / export XML sample applications so that they offer the option of exporting partial namespace or data groups by passing in regular expressions.

Enterprise Manager

i. Fix the data group consumed and published count, which was showing inaccurate values.

Server

i. Streamline the sending of Data Group status updates so that the status objects are only sent when something has changed. In addition, only create minimal objects during the update to reduce heap requirements. ii. Improved performance when server sends information to a client through WebSockets.

Release Date: 07/02/2014 Page: 24 of 38

Software AG Universal Messaging 9.6 Release Notes

Nirvana 6.0 Build 10438 to Nirvana 6.1 10584

Bug Fixes And Enhancements

.Net / Silverlight Client API

i. Ensure the downstream connection to the server is always closed on session close. ii. Resolve stream corruption issue in the HTTP and Async Socket drivers when multiple threads attempt to send events to the server with a heavy load. iii. Enable the Culture to be specified as well as the String encoding through nConstants. Defaulted to InvariantCulture to avoid Turkish-I problem. iv. Retain the stack trace information when an exception is thrown in the go() callback and passed to the nAsyncExceptionListener. v. Added support for separate user names in multiplexed sessions.

.Net / Silverlight Admin API

i. By default, catch and ignore name mismatch exceptions when connecting to an nsps interface using and IP address rather than host name. This mirrors the standard behaviour in Java. ii. When initializing an nRealmNode in a cluster, try connecting to other cluster members using socket protocol before http. As the host name is unknown we must connect via nsps rather than nhps.

Flex Client API

i. Exposed isDelta flag on nEventAttributes. ii. Fixed multiplex lock up under high load. iii. Added support for separate user names in multiplexed sessions.

Java Client API

i. Added support for separate user names in multiplexed sessions.

Java / .Net Admin API

ii. Fix timing issue that meant locally created queues might not be stored in the local cache leading to null reference exceptions. iii. Fix to prevent existing clusters being overwritten / destroyed by an import of a cluster with the same name. iv. Resolve issue where should an nRealmNode get disconnected, the connection listener callbacks were not reinitialised.

Release Date: 07/02/2014 Page: 25 of 38

Software AG Universal Messaging 9.6 Release Notes

C++ Admin API

i. Fix reference counting on channels stored in the local cache so that multiple findChannel() calls for the same channel succeed. ii. Ensured client keep-alives are always sent to prevent idle clients from disconnecting.

JavaScript Client & Server

i. Client can now specify a window size when using a transactional queue reader. ii. NirvanaTransactions now fully documented iii. Improved queue re-subscription. iv. Correctly handle unnamed data groups, and events from the default data group v. Improved iFrame reset behaviour when content length is reached. vi. Validate data passed to the nConsumeEvent.setBase64Data method. If the string passed to this method is not encoded as a valid base64 string it is discarded. vii. Performance improvement from conversion of various asynchronous calls to direct method invocations. viii. Updated WebSocket browser compatibility to support Version 8.0 of the WebSocket protocol. ix. Support tag within an nConsumeEvent with an nEventProperties x. The client may now configure the IFrame Content Length through the JavaScript API. When this content length is reached the client and server will negotiate a reset of the IFrame. xi. The Server will now adjust the default LongPoll Active Delay and LongPoll Idle timeout based on preferences specified by the JavaScript client on session initialisation. These were originally interface wide configuration options. xii. Support for closing a session in Javascript through the NirvanaSession.close() method. xiii. The Nirvana Server can now choose between sending events either as CSV values of JSON objects when communicating with a JavaScript client. xiv. The Nirvana Server now indicates to a JavaScript client when a resource is removed (channel/queue/datagroup deletion). This fixes a problem where the JavaScript client will keep out of sync information about resources on the server. xv. Fixed an issue where the Nirvana Server would communicate the wrong types for nested dictionary objects sent to a JavaScript client. xvi. Various performance improvements to communication between the Nirvana Server and JavaScript client. This should result in a noticeable improvement in latencies. xvii. No longer queue findChannel or equivalent commands if a resource is already known Release Date: 07/02/2014 Page: 26 of 38

Software AG Universal Messaging 9.6 Release Notes

xviii. Functions in nEventProperties and nConsumeEvent are now added to the prototype rather than created for each unique event or dictionary, resulting in faster instantiation xix. Optimisations to speed up XHR object reuse in Firefox xx. Use a browser's built-in base64 encoder/decoder if it has one, else fall back to JS implementation xxi. Speed optimisations to the processing of non-JSON compressed events xxii. General code reorganisation and variable scope restriction xxiii. Support for new MozWebSocket object in Firefox xxiv. WebSocket communication to a different port now works as expected

Server

i. Stop the server from sending two responses to a queue subscription request. Stricter client side checks highlighted this issue. ii. Tighten up restrictions on locking ACL objects that prevent access to underlying object structures from generating concurrent modification problems. This has been modified for Realm, Via, Channel and Queue acl handlers. iii. Fixed bug where named objects could not be created on a transient channel if that channel was stored within a container e.g. /folder1/channelname.

Release Date: 07/02/2014 Page: 27 of 38

Software AG Universal Messaging 9.6 Release Notes

Nirvana 6.0 Build 10150 to 10438

New In This Release

Python

This release of Nirvana contains a beta version of a Nirvana Python Client API built on top of the Nirvana C++ API. It is available on Windows and Linux64 and is built for both Python 2.6 and 2.7. Rather than expose all C++ objects in python we have chosen to simplify the API considerably. There is no need to distinguish between a channel and a queue when subscribing in Python. Although simplified, the Nirvana Python API contains the same pub/sub functionality as the other languages and also support for DataGroups. Because the Python Client is built on top of the Nirvana C++ Client, it fully supports all known drivers, socket (nsp), secure sockets (nsps), http (nhp) and https(nhps).

The Nirvana Python Client can now be found in the Nirvana Install directory along with the other languages with the following directory naming structure: python/ examples bin

The bin directory contains the Nirvana Python Client library (build for the various platforms). The examples directory contains samples applications to demonstrate current functionality.

For more information please see: http://www.my-channels.com/developers/nirvana/enterprise/python/

Silverlight Admin API

We have included a new Silverlight Admin API assembly so that users can develop Silverlight Applications that monitor their Nirvana realms and clusters. An example application is also included in the new Nirvana download.

Release Date: 07/02/2014 Page: 28 of 38

Software AG Universal Messaging 9.6 Release Notes

Bug Fixes And Enhancements

Java / .Net / Silverlight & Flex API

iv. Support batching of events for nDataStream objects, channels and queues so you can publish : one event to multiple destinations, multiple events to 1 destination, many events to many destinations, and a Map of event & destination pairs. This new functionality is found in the nSession class. v. Provide a new method in nSession : isMemberOfCluster() that will be set to true when connected to a Nirvana Realm that is part of a cluster. vi. Java / .Net - If the user called the getDataGroup() method without a listener argument they would no longer be able to attach a listener at a later time to that particular group. vii. Java / .Net - In cases where multiple data groups were being deleted in a small timeframe, an erroneous check would sometimes cause the deletedGroup() callback to not be invoked. viii. Refined the logic which controls when DataGroupListener objects receive notifications :

When a listener is subscribed to the default data group streamAdded() and streamDeleted() callbacks will now only be invoked when the stream is added to the default group. Prior to this notification would occur when any group had a stream added or deleted.

DataGroupListener objects which are not subscribed to the default data group, but rather to another group will no longer receive createdGroup() and deletedGroup() callbacks (as when a group is created/deleted it first resides in the default group). They will instead receive the more appropriate groupAddedToGroup() and groupRemovedFromGroup() callbacks instead if the group is placed below it hierarchically. The streamAdded() and streamDeleted() callbacks will only occur when the stream is added to the particular group which this listener is attached to.

DataGroupListener objects which are added globally through the getDataGroups(listener) method still behave as before and receive all notifications.

.Net MyChannels.Nirvana (Extension API)

i. Provided new Purge functionality on the Producer implementations. ii. Added new Batch capabilities that enable sending multiple messages to one destination, a message to multiple destinations, tupples of message and destination. Each destination can be a DataGroup, a DataStream a Topic or a Queue. iii. Expose the Subject property (user@host) from the Session object. Release Date: 07/02/2014 Page: 29 of 38

Software AG Universal Messaging 9.6 Release Notes

iv. Expose TTL, Persistence, Redelivery and RedeliveredCount properties on the IMessage. v. Expose the SubscriberNames property as an IEnumerable with set / get methods.

.Net / Silverlight Client APIs

i. Fixed adding array of streams to nDataGroup. ii. Fixed the internal caching of channels so that not all findChannel calls result in a server call. iii. Workaround for bug found in .Net BufferedStream which affected http(s) protocols. Bug was that when a BufferedStream has >= 4096 (or >= initial size) written into it would not call flush on the underlying stream. Switch was made for .Net and Silverlight to use a custom BufferedStream class. iv. Resolved timing issue exposed by Silverlight 5’s improved network thread model that meant nSession.init calls failed when using Silverlight 5. v. The Nirvana Silverlight API now has a working Asynchronous Socket driver that can be used when specifying nsp protocol, which will still be subject to the same port restrictions. vi. Added a method to the nSession class that enables silverlight applications (ie without system.err or system.out) to receive callbacks for log messages produced in the nirvana API in order to diagnose network IO and any exceptions being generated.

JMS

i. Ensure the JMS Message ID is guaranteed to be unique across a single JMS Connection.

C++

i. Resolve memory leak in synchronous queue popping. ii. Fix reading of negative doubles on unix platforms. iii. Removed deadlock that occurred when publish large number of events in quick succession to data groups. This was caused by a timing issue with releasing a mutex lock. iv. nRealmNode construction was not working after a protocol change was not reflected in C++. v. Fixed memory leak with data group publishing. The Data Group Publish event was not clearing up multiple events in its destructor.

Javascript

i. Support for Queues : Asynchronous and Asynchronous Transactional queue subscriptions. Queue publishing is also now supported ii. Improve efficiency of HTTP commands. iii. Reconnection fix for clients failing over Release Date: 07/02/2014 Page: 30 of 38

Software AG Universal Messaging 9.6 Release Notes

iv. Fixed putBoolean in the nEventProperties v. Prevent consecutive invocations of the session's onDisconnected, which were seen under certain circumstances. vi. Batched subscription with NirvanaSession.subscribe() now supports connection to P2P services in addition to subscription to queues and channels. vii. We now invoke the NirvanaChannel or NirvanaQueue's onError callback correctly if we fail to subscribe to a channel or queue owing to, for example, ACLs preventing access to the resource. This applies when using the session's batched subscribe() method or an individual queue or channel's subscribe() method. If the onError callback is invoked for this reason, developers can choose attempt to subscribe again if they wish. viii. Session's onError callback is now invoked if a client does not have sufficient privileges, as defined by the realm ACL, to communicate with the server. ix. Added setBase64EncodedData() function to nEvent. x. Fix base 64 encoding for publishing large event payloads.

Server

i. For delta event delivery, if an event merge results in no key changes, do not send the event with just the channel key. ii. Fix nested data group delivery where if streams are added to the nested group, and events published to the parent data group and the group was previously created, events were not delivered to streams. iii. Enable the ability to snoop data groups so streams can be added to data groups while not affecting any data group listener notifications. iv. Fix potential for filtered event replay / recovery to delivery incorrect events. v. Ensure publishing to data groups on slave nodes delivers the events to streams correctly. vi. Resolve conversion of Nirvana 5.x adapters.nst (Interfaces) that contain WebExpress plugins, so that the interface is auto configured for modes of Javascript only delivery. vii. Resolve potential loss of ACL entries from the realm. Small timing window existed where acls are potentially not written to disk. viii. Fix potential issue with queue event rollback on a cluster that that could result in event loss. ix. Fix concurrent modification exception in the server during status event stats collection and delivery. x. Ensure on disk failure, mixed / persistent events do not get corrupted and the stores can be recovered after realm restart.

Admin API

i. Fix the publish, consume and connection rates for nLeafNode, nServiceNode and nDataGroupNode. These were incorrectly calculated. Release Date: 07/02/2014 Page: 31 of 38

Software AG Universal Messaging 9.6 Release Notes

Enterprise Manager

i. Add data group snoop panel. ii. Added ability to publish to data groups iii. Fix channel, queue, service and data group node publish, consume and connection rates which were inconsistent with the realm node calculations. iv. Resolve issue when traversing the namespace that could cause a CPU spin during namespace traversal.

Release Date: 07/02/2014 Page: 32 of 38

Software AG Universal Messaging 9.6 Release Notes

Nirvana 6.0 Build 10130 to 10150

Bug Fixes & Enhancements

Server

i. Fix to ensure that the transaction TTL is correctly honoured when a single event is published and committed in a cluster. ii. Fix to allow over 127 subscriber names to be passed as an array to nConsumeEvent.setSubscriberNames(). The server was treating the array length as a signed number, which meant that values above 127 were considered negative. iii. Fix HTTP(S) server driver issue where a connection may stall reading the payload causing the client to timeout during an event call to the server.

Release Date: 07/02/2014 Page: 33 of 38

Software AG Universal Messaging 9.6 Release Notes

Nirvana 6.0 – What’s New

Data Streams & Data Groups Nirvana 6.0 introduces an entirely new method of data delivery. Each Nirvana session can now be initialised with a single nDataStreamListener instance that provides the callback function for data delivered using that session’s own unique Data Stream. A Data Group relates to a specific data type, and can contain multiple session’s Data Streams. A session’s Data Stream can be added to multiple Data Group objects. When a Data Group is published to, all streams that are added as members of that group will consume those events. All sessions that are initialised using an nDataStreamListener instance are automatically added to the “default” Data Group. Callbacks can also be received when streams are added and removed from any Data Group including the default group.

Examples of Data Group publishers and consumers are found within the 6.0 package for all languages. More information can be found on our website : http://www.my-channels.com/.

Data Group support is provided in all supported Enterprise, Web and Mobile platforms including: Java, C# (.Net and Silverlight), C++, JavaScript, Flex, iPhone and Android.

Session Subscriber A new set of APIs is available in Nirvana 6.0 that allows clients to subscribe to multiple channels using only 1 method call, instead of having to perform a findChannel, followed by an addSubscriber call for each channel.

For example, the following code will subscribe to all known channels within a realm:

// Create the array of subscriber attributes objects nSubscriptionAttributes[] attrs = new nSubscriptionAttributes[achannelName.length];

for (int x = 0; x < attrs.length; x++) { attrs[x] = new nSubscriptionAttributes(achannelName[x], selector, startEid, this); }

mySession.subscribe(attrs);

for (int x = 0; x < attrs.length; x++) { if (attrs[x].wasSuccessful()) { System.out.println("Subscribed to "+attrs[x].getChannelName()); } else { System.out.println("Failed to subscribe to "+attrs[x].getChannelName()+ " : " + attrs[x].getException().getMessage()); attrs[x].getException().printStackTrace(); Release Date: 07/02/2014 Page: 34 of 38

Software AG Universal Messaging 9.6 Release Notes

} } Nirvana .Net Extension API and Reactive Framework Support Nirvana 6.0 includes an entirely new namespace MyChannels.Nirvana that aims to provide a more familiar .Net feel to the Nirvana Client API. It is built using the existing com.pcbsys.nirvana namespace and exposes pub/sub (Channels and Data Groups) and queue functionality through a very simple and intuitive API. For example, the following few lines of code will set up a subscription on a Nirvana channel that will consume events in the ProcessMessage method :

using (var session = new Session(“nsp://localhost:9000”)) { session.Initialize(); var consumer = session.Topics.CreateConsumer(“channel”); consumer.MessageReceived += (s, e) => ProcessMessage(e.Message); }

Reactive Extensions for .Net (commonly referred to as "Rx") is a new library currently under development by Microsoft that aims to allow the development of "reactive" applications, by exposing the Observer pattern (as seen in C# Multicast delegates and Events), but in a simpler, more intuitive manner.

The Nirvana Reactive library for .NET builds on the intuitive new Extension API to make use of the capabilities offered by Rx, by allowing the conversion from Nirvana objects to Observable sequences and vice versa. Currently, the library only supports the conversion from Nirvana objects to Observable sequences, and is designed to work with the MyChannels.Nirvana API. One main method is included: ToObservable(), which converts the messages from either a IConsumer (Topics and Queues) or a IDataGroupSession. This means that consuming messages on a Topic or Queue looks distinctly different from the more conventional Consumer method. For example, the equivalent code to the simple Channel subscriber above would look like:

Release Date: 07/02/2014 Page: 35 of 38

Software AG Universal Messaging 9.6 Release Notes

using (var session = new Session(“nsp://localhost:9000”)) { session.Initialize(); var consumer = session.Topics.CreateConsumer(“channel”); var query = from e in consumer.ToObservable() select e.Message; query.Subscribe(ProcessMessage); }

Nirvana JavaScript Nirvana 6.0 includes significant performance and API enhancements for JavaScript clients. These include improvements to the wire protocol used between JavaScript clients and Nirvana Realms to simplify and reduce required bandwidth.

The main focus of the JavaScript changes was to remove the Nirvana Plugin layer as the delivery mechanism for events to JavaScript and WebSocket clients. Clients that communicate with the Nirvana realm using the binary protocol (like Java, C#, C++ etc) are delivered events through Nirvana’s highly scalable fanout engine. For this release of 6.0, JavaScript and WebSocket clients are now dealt with through the same fanout engine as other client connections, so the WebExpress plugin is no longer required.

Secondly, “the over the wire” textual representation of Nirvana events delivered to JavaScript clients has been streamlined to reduce network bandwidth requirements. In most scenarios, events will be delivered to clients using a highly optimised lightweight structure which is reassembled at the client, rather than using a more heavyweight representation such as JSON.

In addition, the JavaScript API has also been updated to include support for using Data Groups, and now provides a simpler configuration object for constructing an nSession.

Release Date: 07/02/2014 Page: 36 of 38

Software AG Universal Messaging 9.6 Release Notes

Nirvana 6.0 Build 10022 (RC1) to 6.0 Production Release

Bug Fixes & Enhancements

Java Client APIs

v. Resolve Maintain priority issues in the client APIs. vi. Fix for detection of missed keep alive events when permitted keep alive count is set to 1. This was too sensitive to timing drifts in scheduling that can occur, and caused premature closure of inactive connections (when no events are being consumed by the client). vii. Fix the thread safety of the getEventTag() method of nConsumeEvent, where multiple threads making calls to this method can result in exceptions being thrown unexpectedly. viii. Resolve issue with the nConstants.ReconnectImmediately setting which was not being honoured correctly. ix. Resolve problem in the nSession that could cause intermittent request timeout errors to occur during synchronous calls to the server.

.Net Client API

i. Resolve Maintain priority issues in the client APIs. ii. Maintain the nEventAttributes message type property as an sbyte to keep in line with the primitive types used by the Java JMS message types. The getMessageType now returns an sbyte which can represent the default message type -1. iii. Added method removeSubscriber(bool) enabling the method to be set as synchronous to guarantee it has been processed by the server and client so subsequent calls to isSubscribed() returns the expected value. iv. Fix P2P ServerService reconnection that caused Null Reference exception. v. Resolve issue with the nConstants.ReconnectImmediately setting which was not being honoured correctly.

Java Admin API

i. Added ability for nRealmNode objects to cycle through available interfaces when resolving the other cluster nodes. If for example the first interface had a VIA list set, this would previously prevent the node from being connected to when there may well be a valid interface with the correct ACL set in the VIA list.

JMS

i. Fix issue discovered when using Spring CachedConnectionFactory during reconnection. Release Date: 07/02/2014 Page: 37 of 38

Software AG Universal Messaging 9.6 Release Notes

ii. Additional Connection properties for Keep Alives Missed, and Connection Timeout values.

Server

i. Fix maintain priority flag within a cluster and during reconnection of slave clients. ii. Fix issue that was seen when more than 1 subscriber (each one with a different session) are subscribed to a channel, using the same session id, and are consuming events that have a subscriber name set. The problem occurred when one of the subscriptions was removed, it caused the removal of the second. iii. Fix cluster issue where expired events could be counted in the recovery process resulting in problems during recovery and realm restarts. iv. Enable better event caching during channel fanout of events to large numbers of users. v. Resolve an issue discovered in the realm that could cause the client handshake to fail and cause the server to not accept a number of incoming clients.

Release Date: 07/02/2014 Page: 38 of 38