We already discussed the fundamental concepts of JMS API. In the previous chapter we have seen the difference between persistent and non persistent message delivery modes.In this chapter we are discussing how setting message priority levels in JMS works.
Setting Message Priority Levels in JMS
It is possible to set the message priority levels before sending a message. It forces the JMS provider to deliver high priority messages first.JMS API has message priority levels from 0(lowest priority) to 9(highest priority).
If we have not specify any priority level , then the default priority will be 4.
In a JMS application , priority can be set in either of the following ways:
a)By using setPriority(int value) method of MessageProducer interface.
b)By using the overloaded publish() method.The third argument will be the priority.
topicPublisher.publish(message, DeliveryMode.NON_PERSISTENT, 3,
20000)
Setting Message Priority Levels in JMS Example
We are using OpenJMS as JMS provider. Before looking into the codes , the openJMS should be configured and started, and the necessary libraries should be there in the project path as discussed earlier .
In our example , we have 3 clients. First client sends a low priority message to destination.Second client sends a high priority message to destination. Then the third client (which is the receiving client)is starting. As per our discussion so far , the high priority message should be reached first and then the low priority message.
FirstClient.java
import java.util.Properties;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
public class FirstClient {
Context context = null;
ConnectionFactory factory = null;
Connection connection = null;
Destination destination = null;
Session session = null;
MessageProducer producer = null;
int priorityIndex = 0;
public FirstClient() {
}
public void sendMessage() {
Properties initialProperties = new Properties();
initialProperties.put(InitialContext.INITIAL_CONTEXT_FACTORY,
"org.exolab.jms.jndi.InitialContextFactory");
initialProperties.put(InitialContext.PROVIDER_URL,
"tcp://localhost:3035");
try {
context = new InitialContext(initialProperties);
factory = (ConnectionFactory) context.lookup("ConnectionFactory");
destination = (Destination) context.lookup("queue1");
connection = factory.createConnection();
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
producer = session.createProducer(destination);
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
connection.start();
TextMessage message = session.createTextMessage();
message.setText("Hello ...This is a low priority message");
producer.setPriority(priorityIndex);
producer.send(message);
System.out.println("Sent low priority message: "
+ message.getText());
} catch (JMSException ex) {
ex.printStackTrace();
} catch (NamingException ex) {
ex.printStackTrace();
}
if (context != null) {
try {
context.close();
} catch (NamingException ex) {
ex.printStackTrace();
}
}
if (connection != null) {
try {
connection.close();
} catch (JMSException ex) {
ex.printStackTrace();
}
}
}
public static void main(String[] args) {
FirstClient firstClient = new FirstClient();
firstClient.sendMessage();
}
}
SecondClient.java
import java.util.Properties;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
public class SecondClient {
Context context = null;
ConnectionFactory factory = null;
Connection connection = null;
Destination destination = null;
Session session = null;
MessageProducer producer = null;
int priorityIndex = 9;
public SecondClient() {
}
public void sendMessage() {
Properties initialProperties = new Properties();
initialProperties.put(InitialContext.INITIAL_CONTEXT_FACTORY,
"org.exolab.jms.jndi.InitialContextFactory");
initialProperties.put(InitialContext.PROVIDER_URL,
"tcp://localhost:3035");
try {
context = new InitialContext(initialProperties);
factory = (ConnectionFactory) context.lookup("ConnectionFactory");
destination = (Destination) context.lookup("queue1");
connection = factory.createConnection();
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
producer = session.createProducer(destination);
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
connection.start();
TextMessage message = session.createTextMessage();
message.setText("Hello ...This is a high priority message");
producer.setPriority(priorityIndex);
producer.send(message);
System.out.println("Sent high priority message: "
+ message.getText());
} catch (JMSException ex) {
ex.printStackTrace();
} catch (NamingException ex) {
ex.printStackTrace();
}
if (context != null) {
try {
context.close();
} catch (NamingException ex) {
ex.printStackTrace();
}
}
if (connection != null) {
try {
connection.close();
} catch (JMSException ex) {
ex.printStackTrace();
}
}
}
public static void main(String[] args) {
SecondClient secondClient = new SecondClient();
secondClient.sendMessage();
}
}
ReceivingClient.java
import java.util.Properties;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
public class ReceivingClient {
Context context = null;
ConnectionFactory factory = null;
Connection connection = null;
Destination destination = null;
Session session = null;
MessageConsumer consumer = null;
public ReceivingClient() {
}
public void receiveMessage() {
Properties initialProperties = new Properties();
initialProperties.put(InitialContext.INITIAL_CONTEXT_FACTORY,
"org.exolab.jms.jndi.InitialContextFactory");
initialProperties.put(InitialContext.PROVIDER_URL,
"tcp://localhost:3035");
try {
context = new InitialContext(initialProperties);
factory = (ConnectionFactory) context.lookup("ConnectionFactory");
destination = (Destination) context.lookup("queue1");
connection = factory.createConnection();
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
consumer = session.createConsumer(destination);
connection.start();
Message firstMessage = consumer.receive();
if (firstMessage instanceof TextMessage) {
TextMessage text = (TextMessage) firstMessage;
System.out.println("First Message Received is : "
+ text.getText());
}
Message secondMessage = consumer.receive();
if (secondMessage instanceof TextMessage) {
TextMessage text = (TextMessage) secondMessage;
System.out.println("Second Message Received is : "
+ text.getText());
}
} catch (JMSException ex) {
ex.printStackTrace();
} catch (NamingException ex) {
ex.printStackTrace();
}
if (context != null) {
try {
context.close();
} catch (NamingException ex) {
ex.printStackTrace();
}
}
if (connection != null) {
try {
connection.close();
} catch (JMSException ex) {
ex.printStackTrace();
}
}
}
public static void main(String[] args) {
ReceivingClient receivingClient = new ReceivingClient();
receivingClient.receiveMessage();
}
}
Output
Start the OpenJMS by using startup script from %OPENJMS_HOME%/bin if not started already.
Then run the FirstClient.java.
Output of FirstClient.java
Sent low priority message: Hello …This is a low priority message
When the first client terminates , run the SecondClient.java.
Output of SecondClient.java
Sent high priority message: Hello …This is a high priority message
When the SecondClient.java exits its running , run the ReceivingClient.java . As per our discussion so far in this chapter , the second message sent to the destination should be received first. Because it has highest priority.
Output of ReceivingClient.java
First Message Received is : Hello …This is a high priority message
Second Message Received is : Hello …This is a low priority message
Conclusion
If more messages are there in the destination to deliver to a particular client, then the delivery will be on the basis of priority. The above example verifies the same.