JavaOne 2016
JMS is pretty simple, right? Once you’ve mastered topics and queues, the rest can appear trivial, but that isn’t the case. The queuing system, whether ActiveMQ, OpenMQ, or WebLogic JMS, provides many more features and settings than appear in the Java EE documentation. This session looks at some of the important extended features and configuration settings. What would you need to optimize if your messages are large or you need to minimize prefetching? What is the best way to implement time-delayed messages? The presentation also looks at dangerous bugs that can be introduced via simple misconfigurations with pooled beans. The JMS APIs are deceptively simple, but getting an implementation into production and tuned correctly can be a bit trickier.
6. #1 Upgrade Code to EE 7
Major changes in Java EE 7 (JMS 2.0)
Introduced in Java EE 7:
• JMSContext – replaces Connection and Session
• JMSProducer – replaces MessageProducer
• JMSConsumer – replaces MessageConsumer
Best Practice
13. #3 Exception Handling…
Runtime Exception:
• Rollback and re-delivery of message
• Destruction of MDB and possibly connection
Best Practice
14. #4 Which of these are optional?
1. JMSMessageID
2. Overriding Message Header Fields
3. JMS Defined Properties
4. Provider Specific Properties
5. Distributed Transactions
6. Multiple Sessions
All of them!
Best Practice
15. #5 Pre-fetching
• Message consumer (RAR) pre-fetches a set of
messages to distribute to consumers (MDBs).
• Poorly configured pre-fetch
• Starve other consumers
• Heap exhaustion
• Default ActiveMQ: 1000 messages!
Gotcha
20. #7 Wire Protocols
What are the different wire protocols and what are their unique
features?
• Openwire
• Cross language wire protocol for messaging
• Native protocol for ActiveMQ
• AMQP – Advanced Message Queuing Protocol
• ISO 19464 – binary wire protocol with widespread adoption
• Designed for high performance interoperable messaging
• MQTT – Message Queue Telemetry Transport
• Simple binary protocol – good for embedded/mobile
• Stomp – Simple/Streaming Text Oriented Messaging Protocol
• Text based protocol with simple semantics
Are you using the right wire protocol?
Best Practice
21. #7 Wire Protocols & MOM
MOM OpenWire AMQP MQTT Stomp Other
OpenMQ X X
ActiveMQ X X X X
RabbitMQ X X X
HornetQ X X
WebLogic X
WebSphere MQ X X
• MQTT – IoT/embedded/mobile
• Stomp – WebSockets – not high volume
Best Practice
22. #8 Dead Letter Queue
What is the dead letter queue and why should I care?
• Message that is repeatedly refused by a client.
• JMS provider will retry multiple times.
• Messages ultimately moved to Dead Letter Queue
(DLQ)
Order Queue Update Queue Update Queue
Update Queue
Best Practice
23. #8 Dead Letter Queue…
• Hundreds of messages
• How to recover?
Best Practice
24. #8 Dead Letter Queue…
ActiveMQ DLQ configuration – DLQ per queue.
Best Practice
25. #9 Expiring Messages
What’s wrong with the following code?
1. Message.setJMXExpiration() is for use by the
container.
2. Ignored if you set it.
Gotcha
26. #9 Expired Messages & DLQ
• Expired messages dumped to DLQ
• Messages build-up over time!
Best Practice
27. #9 Expired Messages & DLQ…
ActiveMQ solution
HornetQ
HornetQ messages are lost unless configured.
Best Practice
29. #10 MDP Pools…
• Don’t accept default MDB pool sizes.
• Monitor and adjust MDB pool sizes based on load.
glassfish-ejb-jar.xml
Best Practice
30. #11 Types of JMS Messages
What are the different types of messages types?
StreamMessage Serialized stream of objects.
MapMessage Message composed of name/value pairs. Names must be
unique.
TextMessage Simple message for Strings.
ObjectMessage Message consisting of a serialized Java Object.
BytesMessage Raw stream of bytes.
WebLogic includes XMLMessage:
• Optimized for XML.
• Supports filtering on XML content.
Best Practice
33. #13 Web Socket and JMS
Java EE 7 Server
Web Socket
Endpoint
JMS Provider
JMS Provider
Stomp over Web Sockets
Best Practice
34. #13 Web Socket and JMS…
• Stomp protocol is a simple text-oriented messaging
protocol.
• Messaging server must support WebSockets
• Initial handshake is HTTP
• Message providers supporting STOMP & WebSockets:
• ActiveMQ
• RabitMQ
• WebLogic
• Enable for ActiveMQ:
<transportConnector name="ws" uri="ws://0.0.0.0:61614"/>
Best Practice
35. #14 Delayed Message Delivery
Can I send a message but have it delayed?
Extended feature in ActiveMQ.
• Send delay (AMQ_SCHEDULED_DELAY)
• Re-send delay (AMQ_SCHEDULED_PERIOD)
• Repeat count (AMQ_SCHEDULED_REPEAT)
Best Practice
36. #15 Priority & Messages
What does message priority mean?
• Message priority scale: 0-9 (0: lowest 9: highest)
• Default message priority: 4
• JMS specification does not require a provider strictly implement message ordering.
• Not dependable!
Best Practice
37. #15 Priority & Messages
Enforcing priority:
• Apache Camel with Resequencer
• http://camel.apache.org/resequencer.html
• Use Selectors:
• JMSPriority > 6
• JMSPriority < 6
Best Practice
39. #16 Protocol Framing
Client exception:
Server Exception
WARN | Transport Connection to: tcp://127.0.0.1:54025 failed:
java.io.IOException: Frame size of 404 bytes larger
Best Practice
40. #17 Leaks & Variable Loads
Load testing always at 100%?
Scenario:
• Message Driven Bean with a connection to a remote
resource.
• Standing pool size: 3
Gotcha
42. #18 Advisory Messages
Extended ActiveMQ feature:
• Consumers, producers and connections starting and
stopping
• Temporary destinations being created and destroyed
• messages expiring on topics and queues
• Brokers sending messages to destinations with no
consumers.
• Connections starting and stopping
Best Practice
44. #20 Know your Activation Spec Properties
Property Required Default Description
acknowledgeMode Auto-acknowledge Auto-acknowledge or Dups-ok-
acknowledge
clientId Set n RA Required for durable
destinationType X null Queue or Topic
Destination X null Destination name
enableBatch false Transaction batching
maxMessagesPerBatch 10 Message per transaction batch
maxMessagesPerSessions 10 Pre-fetch size
maxSessions 10 Max concurrent sessions
messageSelector null Selector
noLocal false Include local msg?
ActiveMQ
Best Practice
45. #20 Know your Activation Spec Properties
Property Default Description
password Set inRA Password for JMS connection
subscriptionDurability NonDurable NonDurable or Durable
subscriptionName null Name of subscription
userName Set in RA Username for JMS connection
useRAManagedTransaction false
initialRedeliveryDelay 1000 Re-delivery delay
maximumRedeliveries 5 Max re-deliveries
redeliveryBackOffMultiplier 5 Multiplier for back-off.
redeliveryUseExponentialBackOff false Configures exponential back-off.
ActiveMQ
Best Practice
46. #20 Know your Activation Spec Properties
• ActiveMQ – only 2 properties were required
• Key tuning questions:
• Individual messages take a long time to process?
• Many messages or few messages?
• Batch processing of messages?
• Ok to process duplicates?
Best Practice
47. #21 Configuration Conflicts
Default for configuration for an MDB and ActiveMQ RA:
• Max MDB Pool Size (default 25)
• Max Sessions (default 10)
• MaxMessagesPerSessions (default 10)
How many messages can we
process concurrently?
10
Best Practice
48. #22 Configure Message Persistence
• JMS message providers message persistence is often
configurable and tunable
• Concerns:
• Available file/descriptors and disk space
• I/O throughput
• Flush frequencies
• ActiveMQ
• KahaDB – file-based transaction data store (journaled)
• AMQ message store – file based store, file per destination,
index must be rebuilt for non-planned termination
• JDBC message store
Best Practice
49. #22 Configure Message Persistence…
API does exist for ActiveMQ KahaDB!
Best Practice
50. #23 Deadlocked Consumer
Consumer blocks!
• Pre-fetched messages are stuck in limbo
• App cannot be un-deployed
• App container may not shutdown properlyGotcha
51. #24 Multiple Destinations
• ActiveMQ supports sending messages to multiple
queues and topics.
• Targets should be a comma separated list.
• Use prefix topic:// or queue://
Extended Feature
52. #25 Multiple Destination Consumption
• ActiveMQ supports consuming messages from multiple destinations
– both queues and topics
• Destination naming:
• ‘.’ separates elements in a destination name
• ‘*’ matches one element
• ‘>’ matches one or all trailing elements
• Example topics:
• us.ca.sfo.takeoffs
• us.ca.sfo.landings
• us.ca.lax.takeoffs
• us.ct.bdl.takeoffs
• Patterns:
• *.*.*.takeoffs – receive all takeoff messages
• us.ca.> - all landings and takeoffs in CA
Extended Feature
54. #26 GlassFish 4 Bug
Containers can have bugs!
• GlassFish 3.x no message delay with MDBs and
ActiveMQ.
• GlassFish 4.1.1 2 minute delay with messages from
ActiveMQ but NOT OpenMQ
Gotcha
59. #28 Concurrency
Following objects support concurrent access:
• ConnectionFactory
• Connection
• Destination
Following object DO NOT support concurrent access:
• Session
• MessageProducer
• MessageConsumer
Best Practice
60. #29 JMSX Properties
Property Matched Modified Description
JMSXUserID X X Id of user sending message
JMSXAppID X X App sending message
JMSXProducerTXID Producer transaction id
JMSXConsumerTXID Transaction ID consumer
JMSXRcvTimestamp Time delivered to consumer
JMSXDeliveryCount X Delivery attempts
JMSXState Provider specific state
JMSXGroupID X X Message group id
JMSXGroupSeq X X Sequence number in group
No all properties are supported by all providers!
Best Practice
61. #30 Message Groups
• Message Groups:
• Guaranteed ordering of the processing of related messages
across a single queue
• Load balancing across multiple consumers.
• High availability / auto-failover
• Usage:
• message.setStringProperty("JMSXGroupID", ”JavaOne");
• message.setIntProperty("JMSXGroupSeq”,1);
• message.setIntProperty("JMSXGroupSeq”,-1); // closes group
• ActiveMQ enhancement:
• JMSXGroupFirstForConsumer
Best Practice
62. #31 Message Selectors
• Message selectors used to filter messages.
• Selectors use subset of SQL92
• Selectors cannot reference payload, only header
properties
Literals TRUE/FALSE, numbers, scientific notation
Identifiers Header or property field.
Operators AND, OR, LIKE, BETWEEN, =, <>, <, >, <=, =>,
+, -, *, /, IS NULL, IS NOT NULL
Best Practice
63. Best Practices
• High availability (HA) for production
• Protect queues/topics with passwords
• Enable and configure SSL
• Configure provider data store
• Backup provider data store
• Configure DQL policy
• Monitor DLQ
• Add descriptive message headers
• Pick and tune messaging transport
• Use Apache Camel and integration patterns