What's New in Universal Messaging 10.15

Universal Messaging 10.15 is the successor of Universal Messaging 10.11.

The Universal Messaging 10.15 release notes include new features, enhancements, changes, deprecated and removed functionality.

New Features

The following features have been added in Universal Messaging 10.15:

  • Support for determining the server state within a cluster

    You can determine the state of a Universal Messaging server within a cluster in the following ways:

    • Using the newly added command-line tool GetServerClusterState.
    • Using the newly added endpoints in the Health Monitor Plugin IsMaster or GetClusterState.
  • File size limit on multi-file disk stores

    Files in multi-file disk stores now have a size limit. When the maximum size per file is reached Universal Messaging creates a new file to persist the next events. You can use a new realm configuration property, MaxSpindleFileSize, to specify the maximum file size in bytes.

    For more information about how to configure multi-file disk stores and the new property, see Multi-File Disk Stores.

  • Bi-directional admin client and server compatibility

    Universal Messaging 10.15 and higher supports bi-directional compatibility of Enterprise Manager and the Java Admin API for release versions 10.15 and higher.

    For more information about the functionality, see Bi-directional Admin Client and Server Compatibility.

  • Bi-directional compatibility of server-to-server communication

    Universal Messaging 10.15 and higher supports bi-directional compatibility of server-to-server communication within clusters, zones, and joins for release versions 10.15 and higher.

  • Server log level configuration for Log4j2

    You can now use the new LogLevelOverride realm configuration property to configure the server log level when the server uses the Log4j2 logging framework. This parameter is only supported when the server is running as a Docker container.

    If you set LogLevelOverride to true, you can configure the fLoggerLevel property. A false value restores the configuration from log4j2.xml and makes fLoggerLevel ineffective in the Enterprise Manager.

    For more information about the logging configuration, see Realm Configuration.

    The functionality is provided with Universal Messaging 10.15 Fix 2.

  • com.softwareag.um.client.missed_keep_alives client property

    A new client property that specifies the number of missed server-side keep-alive intervals before the client closes a connection. The property is introduced in Universal Messaging 10.15 Client Fix 4.

    For more information about the property, see Client Parameters.

  • MaxNoOfConnectionsPerUserName realm property

    A new realm configuration property that defines the number of concurrent connections to a Universal Messaging server per user. The property is introduced in Universal Messaging 10.15 Fix 5. For more information about using the property, see Realm Configuration.

  • New HealthChecker Tool Check

    The new JoinLastEIDMismatchCheck checks for joins that are ahead of the channel's last EID. The check is introduced in Universal Messaging 10.15 Fix 12. For more information, see Running a Configuration Health Check.

  • User Connections JMX bean and metrics

    Universal Messaging exposes a new JMX bean, named Universal Messaging User Connections, which enables access to data related to the number of current sessions that each user has established to the server. You can use the related NumberOfConnections JMX metric and sag_um_connections_per_user Prometheus metric for monitoring. The functionality is available with Universal Messaging 10.15 Fix 12.

    For more information about the metrics and using JMX, see Using JMX to Monitor Universal Messaging.

  • com.softwareag.um.client.server_keep_alive_leeway client property

    A new client property that specifies the additional time that it can take a Universal Messaging server to reply to a keepalive sent by a client. The property is introduced in Universal Messaging 10.15 Client Fix 14.

    For more information about the property, see Client Parameters.

  • Support for Java 17

    Starting with Universal Messaging 10.15 Fix 19, Universal Messaging supports both Java 17 and Java 11 as a runtime for the server, client, and sample applications components.

  • Client support for JMS 2.0 and Jakarta Messaging 3.0

    The Universal Messaging Java client supports JMS 2.0 and Jakarta Messaging 3.0 in addition to JMS 1.1. Support for JMS 2.0 and Jakarta Messaging 3.0 was introduced in Universal Messaging 10.15 Fix 20.

    For more information about JMS 2.0 support, see Notes on Universal Messaging Support for JMS 2.0 and Changed Features.

Changed Features

The following Universal Messaging features already available in the previous product release have been changed in Universal Messaging 10.15:

  • C++ Libraries

    Note the following changes relating to the C++ libraries that Universal Messaging provides:

    • The C++ libraries for Universal Messaging use OpenSSL libraries that have now been upgraded to version 3.0.5 from version 1.1.1k.
    • The C++ libraries for Universal Messaging use POCO libraries that have now been upgraded to version 1.11.3 from version 1.10.1.
    • OS X is no longer supported.

    If you experience any problems with the new version of the C++ client libraries for Universal Messaging, first consider recompiling your client applications against the new version of the libraries and compilers.

  • Defining users exempt from authentication

    Now you explicitly define users that are exempt from authentication by configuring the -DNirvana.auth.exempt property. Previously, users exempt from authentication were loaded by default from a –DSECURITYFILE file, which is not used any longer.

    In addition, exempt users both with and without a password should be able to log in to Universal Messaging. Previously, authentication failed when an exempt user provided an invalid password.

    For more information about defining users exempt from authentication and configuring the -DNirvana.auth.exempt property, see Configuring Authentication and Client Negotiation.

  • JMX namespaces for topics and queues

    By default, JMX namespaces are now created using a flat structure, for example, destinationName=/q1/q2/q3. In previous Universal Messaging versions, by default, JMX namespaces for topics and queues have a folder tree structure.

    You can use a new realm configuration property, FlatStoreJMXBeanNamespace, to define if JMX namespaces for topics and queues have a flat structure or a folder tree structure.

    For more information about the property, see Realm Configuration.

  • MaxNoOfConnections realm property

    A realm configuration property that defines the total number of concurrent connections to a Universal Messaging server. Now a user with both the Override Connection Count realm permission and an admin connection can override this property. Previously, users with full permissions could override the property. The change is introduced in Universal Messaging 10.15 Fix 5. For more information about using MaxNoOfConnections, see Realm Configuration.

  • Realm Information Collector

    The Realm Information Collector command-line diagnostic tool has been enhanced to collect the following additional information about a server:

    • Java Service Wrapper log files even if you configured an absolute file path for the wrapper.logfile property in the Sever_Common.conf file.
    • Log4j2 configuration, and also log files configured through file appenders in the log4j2.xml configuration file.
    • The log header of the Universal Messaging server.

    For more information about the Realm Information Collector, see the section The Realm Information Collector Diagnostic Tool.

  • Queue batching

    In Universal Messaging 10.15 and higher, the server disregards event batching for queues that is requested by clients and sets it to one event instead. The modified behavior affects Java clients using the com.pcbsys.nirvana.client.nQueueReaderContext.setPeekBatchSize(int) API.

  • com.pcbsys.nirvana.client.nConstants#setReconnectAfterAccessChange method behavior

    If you set setReconnectAfterAccessChange(..) to false, if the client receives nSecurityException for cluster formation or for exceeding the connection limit, these exceptions are treated as recoverable and the client will try to reconnect to the Universal Messaging server. For any other security exceptions, the client will make no reconnection attempts.

    For more information about setReconnectAfterAccessChange(..), see the com.pcbsys.nirvana.client.nConstants class reference in the Java Client API documentation.

  • Support for plugins depending on the license type

    Universal Messaging now supports plugins for all UM license types regardless of the Plugins key value in the license file. Previously, plugin support was available only for the NUMWF/NUMTF license type. The change is introduced in Universal Messaging 10.15 Fix 13.

  • Server behavior when handling duplicate stores for a store name

    Starting with Universal Messaging 10.15 Fix 14, the Universal Messaging server does not start if there are duplicate stores for a particular store name present on the server when you work with case-insensitive data folders, for example, on a Windows operating system. Contact support about how to proceed.

    When you start the Universal Messaging server, it checks for duplicate stores and shuts down if it finds such stores, for example, testQueue and TestQueue. The server also writes the following warning message in the nirvana.log file and in the console output: "WARNING: Multiple stores found for store name: <Store name>. Listing the stores for this store name: <Store 1><Store 2>…."

    In addition, you can no longer create duplicate stores for a particular store name when you work with case-insensitive data folders.

  • Type of store created when using the administration tools or nChannelAttributes constructors

    Starting with Universal Messaging 10.15 Fix 18, all Universal Messaging command-line administration tools associated with stores (channels and queues) create stores of type Mixed by default. Previously, the tools created stores of type Reliable by default.

    In addition, in the Universal Messaging Java client API, the constructors com.pcbsys.nirvana.client.nChannelAttributes.nChannelAttributes() and com.pcbsys.nirvana.client.nChannelAttributes.nChannelAttributes(String name) create mixed stores by default instead of reliable ones.

    Also, the methods in nSession and nRealmNode that create channels or queues create mixed stores instead of reliable ones if you do not set the type of the store explicitly.

    You can use a new system property on the client side, com.softwareag.um.client.DefaultChannelType, to specify the type of stores created when using the administration tools and the nChannelAttributes constructors. Valid values are mixed, reliable, and persistent.

  • Base image for Universal Messaging container images

    Starting with Universal Messaging 10.15 Fix 16, the Universal Messaging container images on the IBM Container Repository use Red Hat UBI 9 as a base image. Images up to 10.15 Fix 16 use Red Hat UBI 8 as a base image.

  • Client API for JMS method behavior

    With the introduction of client support for JMS 2.0 and Jakarta Messaging 3.0 in Universal Messaging 10.15 Fix 20, some methods in the client API for JMS have changed behavior as follows:

    • MapMessage#setObject(String name, Object value). If the name is null or an empty string, the method now throws an IllegalArgumentException. Previously, the method threw no exception.
    • Connection#getExceptionListener(). If the exception listener is not set on a JMS connection, the method now returns a null value. Previously, if the exception listener was not set on a JMS connection, the method threw a JMSException.
    • MessageProducer#send(). If the message is invalid, the method now throws a MessageFormatException. Previously, if the message was invalid, the method threw an IllegalStateException.
    • XASession#commit() and XASession#rollback(). The methods now throw a TransactionInProgressException. Previously, the methods threw an IllegalStateException.

Deprecated Features

The following Universal Messaging features have been deprecated in Universal Messaging 10.15:

  • Java Client APIs

    The following Java APIs are deprecated:

    nQueue#createAsyncReaderPrevious(nQueueReaderContext context)
    nQueue#createAsyncTransactionalReaderPrevious(nQueueReaderContext context)
    nQueue#destroyReaderLocally(nQueueReader reader) ,destroyReader(nQueueReader reader)
    nQueue#destroyReader(nQueueReader reader)
    nSession#isConnectionVirtual()
    nSession#enableThreading(boolean enabled)
    nSession#enableThreading()
    nSession#setHTTPURLParameter(String parameter)
    nRealm#getHostVal()
    nRealm#getPortVal()
    nRealm#getHTTPPortVal() 
  • Client APIs related to the removal of queue reader objects

    The following C# and C++ APIs are deprecated:

    nQueue#destroyReader(nQueueReader reader)
    nQueue#destroyReaderLocally(nQueueReader reader)

Removed Features

Removed Functionality

The following Universal Messaging functionality has been removed in Universal Messaging 10.15:

  • Legacy JMX

    The legacy JMX functionality, which you enabled by using the EnableLegacyJMX realm configuration property, has been removed. Legacy JMX was deprecated in Universal Messaging 10.7.

  • Data group and data stream functionality

    The full data group and data stream functionality, and respective client and administration APIs in Java, C#, C++, and JavaScript, have been removed.

    When an older-version client connects to a Universal Messaging server 10.15, the client will receive the following exceptions:

    • For data stream calls:
      com.pcbsys.nirvana.client.nSecurityException: SECURITY: Data Streams are not supported
      at com.pcbsys.nirvana.base.clientimpl.singleconnection.ClientConnectionManagerImpl.requestHandshake
      (ClientConnectionManagerImpl.java:773)
      at com.pcbsys.nirvana.base.clientimpl.singleconnection.ClientConnectionManagerImpl.connect
      (ClientConnectionManagerImpl.java:669)
      at com.pcbsys.nirvana.base.clientimpl.singleconnection.ClientConnectionManagerImpl.initialise
      (ClientConnectionManagerImpl.java:418)
      at com.pcbsys.nirvana.client.nSession.init(nSession.java:269)
      at com.pcbsys.nirvana.client.SimpleSessionTestWithDataStreams.main
      (SimpleSessionTestWithDataStreams.java:17)
    • For data group calls:
      com.softwareag.um.tools.UMToolCommon processExceptionAndTerminate
      SEVERE: Security error. [Data Groups/Streams not supported on Server]
      com.pcbsys.nirvana.client.nSecurityException: Data Groups/Streams not supported on Server
      at com.pcbsys.nirvana.base.nExceptionEventProcessor.checkIfExceptionIsCommitOrRollBackOfEvents
      (nExceptionEventProcessor.java:82)
      at com.pcbsys.nirvana.base.nExceptionEventProcessor.checkSecurityException
      (nExceptionEventProcessor.java:65)
      at com.pcbsys.nirvana.base.clientimpl.singleconnection.nDataGroupManagerImpl.findOrCreateGroup
      (nDataGroupManagerImpl.java:524)
      at com.pcbsys.nirvana.client.nSession.createDataGroup(nSession.java:3014)
      at com.softwareag.um.tools.datagroup.CreateDataGroup.execute(CreateDataGroup.java:54)
      at com.softwareag.um.tools.UMToolCommon.executeTool(UMToolCommon.java:94)
      at com.softwareag.um.tools.UMToolCommon.executeTool(UMToolCommon.java:77)
      at com.softwareag.um.tools.datagroup.CreateDataGroup.main(CreateDataGroup.java:65)
  • MacOS C++ client
  • jmx_exporter.yaml configuration file

    The jmx_exporter.yaml configuration file, which was deprecated in Universal Messaging 10.11, has been removed. Instead, to configure JMX with Universal Messaging, use the replacement file, jmx_sag_um_exporter.yaml. The jmx_exporter.yaml file was removed with Universal Messaging 10.15 Fix 10.

  • Universal Messaging Tools image

    Universal Messaging no longer provides a separate tools container image on the IBM Container Repository. The tools image was removed with Universal Messaging 10.15 Fix 20.

    Instead, the Universal Messaging server image at https://containers.webmethods.io/products/universalmessaging-server supports running a container in serverless mode, which mean you can use only the included command-line tools to manage and administer other Universal Messaging server containers.

  • Universal Messaging Certificate Generator utility

Removed Properties

The following Universal Messaging properties have been removed in Universal Messaging 10.15:

  • EnableCaching

    A realm configuration property that is part of the Global Values configuration group.

  • EnableLegacyJMX

    A realm configuration property that is part of the JVM Management configuration group.

  • NHPScanTime and NHPTimeout

    Realm configuration properties that are part of the Global Values configuration group.

    NHPScanTime controlled how often the server checks HTTP connections that are not part of another monitoring pool, for example, HTTP 1.1 connections, which are long-lived. NHPTimeout defined how long an HTTP connection can be idle before the connection is closed. This behavior has been removed in favor of using a generic monitor pool for all connections. You can control the connection timeout by using the IdleDriverTimeout property, part of the Connection Config group.

Removed APIs

The following Universal Messaging APIs, classes, and methods have been removed in Universal Messaging 10.15:

  • C++ Client APIs

    The following C++ APIs are removed:

    nChannelAttributes#setClusterWide(bool flag)
    nChannelAttributes#isClusterWide()
    nNamedObject#isPersistent()
    nProtobufEvent#setProperties(nEventProperties newProperties)
    nStoreProperties#getEnableReadBuffering()
    nStoreProperties#setEnableReadBuffering(bool flag)
    nStoreProperties#getReadBufferSize()
    nStoreProperties#isRequestPriorityConnection()
    nStoreProperties#setRequestPriorityConnection(bool requestPriorityConnection)
    		        
    Removed classes: nRegisteredEventUpdateListener,nRegisteredEventListener
  • C# Client APIs

    The following C# APIs are removed:

    nChannelAttributes#setClusterWide(bool flag)
    nChannelAttributes#isClusterWide()
    nNamedObject#isPersistent()
    nProtobufEvent#setProperties(nEventProperties newProperties)
    nStoreProperties#getEnableReadBuffering()
    nStoreProperties#setEnableReadBuffering(bool flag)
    nStoreProperties#getReadBufferSize()
    nStoreProperties#isRequestPriorityConnection()
    nStoreProperties#setRequestPriorityConnection(bool requestPriorityConnection)
    		        
    Removed class: nRegisteredEventUpdateListener
  • Java Client APIs

    The following Java Client APIs are removed:

    nAbstractChannel#updateProtobufDefinitions(byte[][] descriptors)
    nChannel#createIterator(nDurable name, String selector, int windowSize)
    nChannel#createIterator(nDurable name, String selector, int windowSize, boolean autoAck)
    nChannelAttributes#setClusterWide(boolean flag)
    nChannelAttributes#getFullName() 
    nConstants#setEnabledPriorityQueues(boolean enabled)
    nConstants#getEnabledPriorityQueues()
    		        
    
    nConstants#setPriorityQueueCount(int queueCount)
    nConstants#getPriorityQueueCount()
    		        
    nEventPropertiesIterator#next(boolean convert)
    nEventPropertiesHelper#getKey(Object pair)
    nEventPropertiesHelper#getKey(Object pair, boolean convert)
    nEventPropertiesHelper#getValue(Object pair)
    nEventPropertiesHelper#getValue(Object pair, boolean convert)
    nEventProperties#nEventProperties(String serializedString)
    		        
    nNamedObject#ack(long[] eids, boolean isSynchronous)
    nNamedObject#ack(long[] eids)
    nNamedObject#isPersistent()
    nProtobufEvent#setProperties(nEventProperties newProperties)
    		        
    nQueueReaderContext#canMaintainPriority()
    nQueueReaderContext#setMaintainPriority(boolean flag)
    		        
    nSession#setReadThreadAsDaemon(boolean isDaemon)
    nSession#addConnectionQueueListener(nConnectionQueueListener listener, boolean highWaterMark, 
    boolean lowWaterMark, boolean access, boolean push, boolean block, boolean unblock)
    		        
    nSessionAttributes#isRequestPriorityConnection()
    nSessionAttributes#setRequestPriorityConnection(boolean requestPriorityConnection)
    		        
    nSharedDurableAttributes#getFilter()
    nSharedDurableAttributes#setFilter(String filter)
    		        
    nStoreProperties#getEnableReadBuffering()
    nStoreProperties#setEnableReadBuffering(boolean flag)
    comnStoreProperties#getReadBufferSize()
    nStoreProperties#setReadBufferSize(long bufferSize)
    		        
    nTransactionFactory#getPublishBufferSize()
    nTransactionFactory#setPublishBufferSize(int size)
    
  • C++ Administration APIs

    All C++ Administration APIs are removed. The following C++ applications are also removed:

    DataGroupDeltaDelivery
    DataGroupPublisher
    DataStreamListener
    addchanacl
    addqueueacl
    addrealmacl
    LoginMonitor
    authserver
    Watchers
    connectionwatch
    dataGroupsManager
    delchanacl
    deleteDataGroup
    delnodeacl
    delqueueacl
    delrealmacl
    dumpACLs
    modchanacl
    modqueueacl
    modrealmacl
    ntop
    realmconfig
  • C# Administration APIs

    All C# Administration APIs are removed. The following C# applications are also removed:

    addchanacl
    addqueueacl
    addrealmacl
    addserviceacl
    authserver
    connectionwatch
    delchanacl
    delqueueacl
    delrealmacl
    dumpACL
    modchanacl
    modqueueacl
    modrealmacl
    nDiff
    ntop
    PasswordAuthentication
    realmconfig
    RealmMonitor
    RealmStatusMonitor
    removeServiceACL
    XMLExport
    XMLImport
  • Java Administration APIs

    The following Java Administration APIs are removed:

    nRealmNode#changeTransactionChannel(final int type, final long age, final int capacity)
    nRealmNode#changeStatusChannel(final int type, final long age, final int capacity)
    nRealmACLEntry#canManageP2PServices()
    nRealmACLEntry#setManageP2PServices(boolean val)
    RealmACLEntry#isCreateP2PService()
    RealmACLEntry#setCreateP2PService(boolean value)
    RealmGroupACLEntry#isCreateP2PService()
    RealmGroupACLEntry#setCreateP2PService(boolean value)
    
    nContainer#modACLEntry(nACLEntry entry, boolean allChannels, boolean allQueues, boolean allServices)
    nContainer#modACLEntry(nACLEntry entry, boolean allChannels, boolean allQueues, boolean allServices, boolean realm)
    nContainer#addACLEntry(nACLEntry entry, boolean allChannels, boolean allQueues, boolean allServices)
    nContainer#addACLEntry(nACLEntry entry, boolean allChannels, boolean allQueues, boolean allServices, boolean realm)
    nContainer#removeACLEntry(nACLEntry entry, boolean allChannels, boolean allQueues, boolean allServices)
    nContainer#removeACLEntry(nACLEntry entry, boolean allChannels, boolean allQueues, boolean allServices,boolean realm)
    nContainer#setACL(nACL acl, boolean allChannels, boolean allQueues, boolean allServices)
    
    nRealmNode#addRealmACLEntry(nACLEntry entry)
    nRealmNode#removeRealmACLEntry(nACLEntry entry)
    nRealmNode#modRealmACLEntry(nACLEntry entry)
    nLeafNode#isClusterWide()
    nLeafNode#copy(nNode p_toNode, String p_toName, boolean p_waitForComplete, nACL acl, nCommandStatus cmdStatus)
    nLeafNode#copy(String p_toName, boolean p_waitForComplete, nACL acl, nCommandStatus cmdStatus)
    nDurableNode#isClusterWide()
    nClusterNode#addConnectionListenerToAllServiceNodes(final nConnectionListener listener)
    
    nAdminSession#AddAclGroupMember(String group, fSubject member)
    nAdminSession#findStatusChannel()
    nAdminSession#findTXChannel()
    nAdminSession#changeTransactionFile(int type, long age, int capacity)
    nAdminSession#changeStatusFile(int type, long age, int capacity)
    
    ImportExportParametersBuilder#processScheduler()
    ImportExportParametersBuilder#setSchedulerProcessing(boolean flag)
    nClusterSite#getNodes()
    nTopicNode#getDurables()
    
    Removed classes: nRealmAdmin, nAddRealmAclEntryWithRealmAdmin, nServiceACLEntry, nTXChannel, nStatusChannel
    Note: Instead of using the nRealmAdmin API, you can use the nRealmNode API to achieve the same results.
  • nJMS APIs

    The following nJMS APIs are removed:

    ConnectionFactoryImpl#getEnableSharedDurable()
    ConnectionFactoryImpl#setEnableSharedDurable(boolean value)
    ConnectionFactoryImpl#getEnableSerialDurable()
    ConnectionFactoryImpl#setEnableSerialDurable(boolean value)
    ConnectionFactoryImpl#setEnableSharedPriority(boolean value)
    Note: You can use getDurableType() and setDurableType(nDurableAttributes.nDurableType type) to get and set durable types.
  • Java nAdmin.apps APIs

    The following Java APIs are removed:

    Removed classes: nModifyStatusChannel, nModifyTransactionChannel
  • Admin APIs related to the removal of support for local stores in a cluster

    The following C# APIs are removed:

    nAdminSession#findStatusChannel()
    nAdminSession#findTXChannel()
    nAdminSession#changeTransactionFile(int type, long age, int capacity)
    nAdminSession#changeStatusFile(int type, long age, int capacity)
    nRealmNode#changeTransactionChannel(int type, long age, int capacity)
    nRealmNode#changeStatusChannel(int type, long age, int capacity)
    Removed class: nStatusChannel

    The following C++ APIs are removed:

    nRealmNode#changeStatusChannel(int type, long age, int capacity)
    nRealmNode#changeTransactionChannel(int type, long age, int capacity)
  • Data group and data stream APIs

    The following Java client APIs, and the respective APIs in C# and C++, are removed:

    nSession.init(nDataStreamListener streamListener)
    nSession.getStreamId()
    nSession.pauseStream()
    nSession.resumeStream()
    All nSession.writeDataStream(...) APIs
    All nSession.writeDataGroup(...) APIs
    All nSession.commitRegisteredEventsToDataGroups(...) APIs
    All nSession.createDataGroup() APIs
    All nSession.deleteDataGroup() APIs
    All nSession.getDefaultDataGroup() APIs
    All nSession.getDataGroups() APIs
    Removed classes: nDataStream, nDataGroup, nDataGroupListener

    The following administration APIs in Java, and the respective APIs in C# and C++, are removed:

    nRealmNode.getDefaultDataGroup(nDataStreamListener streamListener)
    nRealmNode.getDataGroupListener()
    nRealmNode.getDataGroups()
    nRealmNode.findDatagroup(String name)
    Removed classes: nDataStreamNode, nDataGroupNode, nDataGroupsContainer