2014-10-31 06:20:28 -04:00
< html >
< head >
2014-11-19 03:44:57 -05:00
< title > ActiveMQ JMS Auto Closable Example< / title >
2014-10-31 06:20:28 -04:00
< link rel = "stylesheet" type = "text/css" href = "../common/common.css" / >
< link rel = "stylesheet" type = "text/css" href = "../common/prettify.css" / >
< script type = "text/javascript" src = "../common/prettify.js" > < / script >
< / head >
< body onload = "prettyPrint()" >
< h1 > JMS Auto Closable Example< / h1 >
< p > This example shows you how JMS resources, such as connections, sessions and consumers, in JMS 2 can be automatically closed on error.< / p >
< p > In this instance we auto close a connection after a subsequent call to a JMS producer send fails< / p >
< h2 > Example step-by-step< / h2 >
< p > < i > To run the example, simply type < code > mvn verify< / code > from this directory< / i > < / p >
< ol >
< li > First we need to get an initial context so we can look-up the JMS connection factory and destination objects from JNDI. This initial context will get it's properties from the < code > client-jndi.properties< / code > file in the directory < code > ../common/config< / code > < / li >
< pre class = "prettyprint" >
< code > InitialContext initialContext = getContext();< / code >
< / pre >
< li > We look-up the JMS queue object from JNDI< / li >
< pre class = "prettyprint" >
< code > Queue queue = (Queue) initialContext.lookup("/queue/exampleQueue");< / code >
< / pre >
< li > We look-up the JMS connection factory object from JNDI< / li >
< pre class = "prettyprint" >
< code > ConnectionFactory cf = (ConnectionFactory) initialContext.lookup("/ConnectionFactory");< / code >
< / pre >
< li > We create a JMS context but we do it inside the try-with-resources statement like so:< / li >
< pre class = "prettyprint" >
< code >
try
(
JMSContext jmsContext = cf.createContext()
)
< / code >
< / pre >
< li > Inside the following try block we first create the producer< / li >
< pre class = "prettyprint" >
< code > JMSProducer jmsProducer = jmsContext.createProducer();< / code >
< / pre >
< li > We then try to send a message. It is this call that throws an exception as the producer doesn't have the privileges
to send a message< / li >
< pre class = "prettyprint" >
< code > jmsProducer.send(queue, "this message will fail security!");< / code >
< / pre >
< li > We catch the exception from the send message and can do what we want, however the JMSContext will have been closed
prior to entering the catch block.< / li >
< pre class = "prettyprint" >
< code > System.out.println("expected exception from jmsProducer.send: " + e.getMessage());< / code >
< / pre >
< li > And finally, we close the Initial Context, note we no longer have to worry about clearing up the JMSContext.< / li >
< pre class = "prettyprint" >
< code > finally
{
if (initialContext != null)
{
initialContext.close();
}
}< / code >
< / pre >
< / ol >
< / body >
< / html >