Recently I came across an issue where JMS messages(unread) were lost from the queue when Weblogic server was restarted. This was kind of strange because Weblogic JMS provides a pretty stable solution around message delivery. Did some more analysis around this and below are the findings.
Weblogic JMS supports message retention in form of both Oracle AQ or an out-of-the-box DB persistence (file based persistence is default). In either case it should not lose message. The messages can be removed from the queues ONLY if:
Which brings to the question of "What is JMSDeliveryMode ?" JMSDeliveryMode specifies PERSISTENT or NON_PERSISTENT messaging.
Weblogic JMS supports message retention in form of both Oracle AQ or an out-of-the-box DB persistence (file based persistence is default). In either case it should not lose message. The messages can be removed from the queues ONLY if:
a. They are consumed by some process.
b. If the messages gets expired, the queue handler will remove them
c. If the delivery mode of messages coming from JMS Provider is Non-Persistent.
Which brings to the question of "What is JMSDeliveryMode ?" JMSDeliveryMode specifies PERSISTENT or NON_PERSISTENT messaging.
- When a persistent message is sent, WebLogic JMS stores it in the JMS file or JDBC Store (database).
- WebLogic JMS does not store non-persistent messages in the JMS database (prefix_wlstore). These messages are guaranteed to be delivered at least once unless there is a system failure, in which case messages may be lost.
You can check the JMSDeliverMode on incoming messages by looking at the JMS Header section.
<mes:WLJMSMessage xmlns:mes="http://www.bea.com/WLS/JMS/Message"> <mes:Header> <mes:JMSMessageID>ID:xxxxxxx</mes:JMSMessageID> <mes:JMSDeliveryMode>NON_PERSISTENT</mes:JMSDeliveryMode> <mes:JMSExpiration>0</mes:JMSExpiration> <mes:JMSPriority>4</mes:JMSPriority> <mes:JMSRedelivered>false</mes:JMSRedelivered> .. .. </mes:Header>The JMS Provider should set this JMS Delivery Persistence to PERSISTENT mode and send it to consumer (JMS Queues in Fusion). No additional configuration is needed on Fusion– BY DEFAULT. Incase the messages are still being sent as NON-PERSISTENT then Weblogic provides a property for the Queue called "Delivery Mode Override" which can be used to override the delivery mode of incoming messages.
No comments:
Post a Comment