It's very easy for developers to be tempted (or sometimes required) to use the vendorās proprietary functionality in a JMS-based application. In a short period of time spent using JMS, I noticed four reasons why a developer can resort to using a proprietary API.
First, getting Destination and ConnectionFactory objects from a naming service is inconvenient, especially for a developer new to JMS who doesn't want to spend time learning JMS administration commands before they can write an application. It might be more convenient to use the providerās own functions to directly create Destination and ConnectionFactory objects.
Secondly, for JMS products, they usually offer quality of service higher and higher than those defined in the JMS specification. If these qualities of service are associated with, say, Session , Producer or Consumer , then itās natural for providers to provide their own set<Name>() tags for these types. Simply put, not all proprietary quality of service can be encapsulated in managed objects.
Third, when a JMS-related operation fails, it throws a (subtype) JMSException . An application developer can request a handled exception in one of several ways, depending on the nature of the exception. However, the JMS specification states that two of the three pieces of information provided by JMSException are property of the JMS provider. Because of this, the developer may have to rely on the supplierās confidential information contained in the exception when deciding to process it.
Finally, the JMS indicates that the message consists of three parts: (1) header fields, (2) arbitrary properties (i.e. name = value pairs) and (3) body. The intended use of (2) is to support flexible message selection in consumer applications. For example, a producer application running, say, in London, can add location = London to message properties before sending a message. The consumer application can then use the "(location = 'London')" message selector to ensure that it only receives messages with this property value. That sounds good. The bad bit is that the JMS specification reserves property names starting with JMS_<vendor> for use by JMS providers, and some providers use such properties to specify their own quality of service for each message. A developer who wants to use the proprietary quality of service for each message will need to change the code of the producer application so that he sets the property of ownership before sending the message.
T.Rob's warning about topic hierarchies is another issue to worry about.