Upload
others
View
7
Download
0
Embed Size (px)
Citation preview
1
Module 10Developing Java EE Applications using Messaging
Java
EE
App
s. u
sing
Mes
sagi
ng10
272 Ω Omega ΩDeveloping Applications for Java EE Platform
Describe JMS API technology
Write a message producer
Write an asynchronous message consumer
Write a synchronous message consumer
List the capabilities and limitations of EJB components as messaging clients
Objectives
2
Java
EE
App
s. u
sing
Mes
sagi
ng10
273 Ω Omega ΩDeveloping Applications for Java EE Platform
Messaging System Participants
Java
EE
App
s. u
sing
Mes
sagi
ng10
274 Ω Omega ΩDeveloping Applications for Java EE Platform
Administered Objects
3
Java
EE
App
s. u
sing
Mes
sagi
ng10
275 Ω Omega ΩDeveloping Applications for Java EE Platform
Messaging Clients
The synchronous client blocks until a message arrives.
Java
EE
App
s. u
sing
Mes
sagi
ng10
276 Ω Omega ΩDeveloping Applications for Java EE Platform
Messages
4
Java
EE
App
s. u
sing
Mes
sagi
ng10
277 Ω Omega ΩDeveloping Applications for Java EE Platform
Point-to-Point Messaging Architecture
Java
EE
App
s. u
sing
Mes
sagi
ng10
278 Ω Omega ΩDeveloping Applications for Java EE Platform
Publish/Subscribe Messaging Architecture
5
Java
EE
App
s. u
sing
Mes
sagi
ng10
279 Ω Omega ΩDeveloping Applications for Java EE Platform
Creating a Queue Message Producer
Java
EE
App
s. u
sing
Mes
sagi
ng10
280 Ω Omega ΩDeveloping Applications for Java EE Platform
1. Obtain a connection factory using injection or the JNDIAPI.
2. Obtain the message queue using injection or the JNDI API.
3. Create a Connection object using the connection factory.
4. Create a Session object using the Connection object.
5. Create a QueueSender object using the Session object.
6. Create one or more Message objects using the Session object.
Creating a Queue Message Producer
6
Java
EE
App
s. u
sing
Mes
sagi
ng10
281 Ω Omega ΩDeveloping Applications for Java EE Platform
7. Populate message with text using the setText method of the TextMessage object.
8. Send one or more Message objects using the QueueSender object.
Creating a Queue Message Producer
Java
EE
App
s. u
sing
Mes
sagi
ng10
282 Ω Omega ΩDeveloping Applications for Java EE Platform
import javax.jms.*;import javax.naming.*;public class SimpleQSender
public static void main(String[] args) String queueName = null;Context jndiContext = null;QueueConnectionFactory queueConnectionFactory = null;QueueConnection queueConnection = null;QueueSession queueSession = null;Queue queue = null;QueueSender queueSender = null;TextMessage message = null;int NUM_MSGS = 5;
Example Code for Queue Message Producer
7
Java
EE
App
s. u
sing
Mes
sagi
ng10
283 Ω Omega ΩDeveloping Applications for Java EE Platform
// Read queue name from command line and display it.if (args.length != 1)
System.out.println("Usage: java SimpleQSender " +"<queue-name> ");
System.exit(1);queueName = new String(args[0]);System.out.println("Queue name is " + queueName);
try jndiContext = new InitialContext();
catch (NamingException e) System.out.println("Could not create JNDI API " +
"context: " + e.getMessage());System.exit(1);
Example Code for Queue Message Producer
Java
EE
App
s. u
sing
Mes
sagi
ng10
284 Ω Omega ΩDeveloping Applications for Java EE Platform
// Look up connection factory and queue. If either doestry
queueConnectionFactory = (QueueConnectionFactory)jndiContext.lookup("QueueConnectionFactory");queue = (Queue) jndiContext.lookup(queueName);
catch (NamingException e) System.out.println("JNDI API lookup failed: " +
e.getMessage());System.exit(1);
/** Create connection.* Create session from connection; false means session is* not transacted.* Create sender and text message.* Send messages, varying text slightly.* Send end-of-messages message.
Example Code for Queue Message Producer
8
Java
EE
App
s. u
sing
Mes
sagi
ng10
285 Ω Omega ΩDeveloping Applications for Java EE Platform
* Finally, close connection.*/try
queueConnection = queueConnectionFactory.createQueueConnection();
queueSession = queueConnection.createQueueSession(false,
Session.AUTO_ACKNOWLEDGE);queueSender = queueSession.createSender(queue);message = queueSession.createTextMessage();for (int i = 0; i < NUM_MSGS; i++)
message.setText("This is message " + (i + 1));System.out.println("Sending message: " +
message.getText());queueSender.send(message);
Example Code for Queue Message Producer
Java
EE
App
s. u
sing
Mes
sagi
ng10
286 Ω Omega ΩDeveloping Applications for Java EE Platform
// Send a non-text control message indicating end of// messages.queueSender.send(queueSession.createMessage());
catch (JMSException e) System.out.println("Exception occurred: " +
e.getMessage()); finally
if (queueConnection != null) try
Thread.sleep(60000); // delay before closingqueueConnection.close();
catch (JMSException e)
Example Code for Queue Message Producer
9
Java
EE
App
s. u
sing
Mes
sagi
ng10
287 Ω Omega ΩDeveloping Applications for Java EE Platform
@Resource(name="jms/QueueConnectionFactory")javax.jms.QueueConnectionFactory queueConnectionFactory;
@Resource(name="jms/someQueue")javax.jms.Queue queue;
An Alternative to JNDI Lookup:
Dependency Injection
Java
EE
App
s. u
sing
Mes
sagi
ng10
288 Ω Omega ΩDeveloping Applications for Java EE Platform
Synchronous Queue Consumer
10
Java
EE
App
s. u
sing
Mes
sagi
ng10
289 Ω Omega ΩDeveloping Applications for Java EE Platform
1. Obtain a connection factory using injection or the JNDI API.
2. Obtain the message queue using injection or the JNDI API.
3. Create a Connection object using the factory.
4. Create a Session object.
5. Create a MessageReceiver object.
6. Call the receive method of the MessageReceiverobject. The receive method blocks if the queue is empty.
7. Process the message returned by the receive method.
Synchronous Queue Consumer
Java
EE
App
s. u
sing
Mes
sagi
ng10
290 Ω Omega ΩDeveloping Applications for Java EE Platform
import javax.jms.*;import javax.naming.*;
public class SimpleQSender public static void main(String[] args)
String queueName = null;Context jndiContext = null;QueueConnectionFactory queueConnectionFactory = null;QueueConnection queueConnection = null;QueueSession queueSession = null;Queue queue = null;QueueReceiver queueReceiver = null;TextMessage message = null;
// Read queue name from command line and display it.if (args.length != 1)
System.out.println("Usage: java " +"SimpleQueueReceiver <queue-name>");
Example Code for Synchronous Queue Consumer
11
Java
EE
App
s. u
sing
Mes
sagi
ng10
291 Ω Omega ΩDeveloping Applications for Java EE Platform
System.exit(1);queueName = new String(args[0]);System.out.println("Queue name is " + queueName); try
jndiContext = new InitialContext(); catch (NamingException e)
System.out.println("Could not create JNDI API " +"context: " + e.getMessage());
System.exit(1); // Look up connection factory and queue. If either doestry
queueConnectionFactory = (QueueConnectionFactory)jndiContext.lookup("QueueConnectionFactory");
Example Code for Synchronous Queue ConsumerJa
va E
E A
pps.
usi
ng M
essa
ging
10
292 Ω Omega ΩDeveloping Applications for Java EE Platform
queue = (Queue) jndiContext.lookup(queueName); catch (NamingException e)
System.out.println("JNDI API lookup failed: " +e.getMessage());
System.exit(1);
/** Create connection.* Create session from connection; false means session is* not transacted.* Create receiver, then start message delivery.* Receive all text messages from queue until* a non-text message is received indicating end of* message stream.* Close connection.*/try
Example Code for Synchronous Queue Consumer
12
Java
EE
App
s. u
sing
Mes
sagi
ng10
293 Ω Omega ΩDeveloping Applications for Java EE Platform
queueConnection = queueConnectionFactory.createQueueConnection();
queueSession = queueConnection.createQueueSession(false,
Session.AUTO_ACKNOWLEDGE);queueReceiver = queueSession.createReceiver(queue);queueConnection.start();while (true)
Message m = queueReceiver.receive(1);if (m != null)
if (m instanceof TextMessage) message = (TextMessage) m;System.out.println("Reading message: " +
message.getText()); else break;
Example Code for Synchronous Queue ConsumerJa
va E
E A
pps.
usi
ng M
essa
ging
10
294 Ω Omega ΩDeveloping Applications for Java EE Platform
catch (JMSException e)
System.out.println("Exception occurred: " + e.getMessage());
finally if (queueConnection != null)
try queueConnection.close();
catch (JMSException e)
Example Code for Synchronous Queue Consumer
13
Java
EE
App
s. u
sing
Mes
sagi
ng10
295 Ω Omega ΩDeveloping Applications for Java EE Platform
1. Look up a connection factory using the JNDI API.
2. Look up the message queue using the JNDI API.
3. Create a Connection object using the factory.
4. Create a Session object.
5. Create a QueueReceiver object.
6. Call the setMessageListener method of theQueueReceiver object passing it an instance of aMessageListener interface.
7. Process the received message in the onMessage methodof the MessageListener instance.
Creating an Asynchronous Queue Consumer
Java
EE
App
s. u
sing
Mes
sagi
ng10
296 Ω Omega ΩDeveloping Applications for Java EE Platform
public class SimpleMessageListener implementsMessageListener
public void onMessage(Message message) TextMessage msg = null;try
if (message instanceof TextMessage) msg = (TextMessage) message;System.out.println("Reading message: " +
msg.getText()); else
System.out.println("Message of wrong type: " +message.getClass().getName());
catch (Exception e)
System.out.println("Exception in onMessage(): " +e.getMessage());
Example Code for Asynchronous Queue Consumer
14
Java
EE
App
s. u
sing
Mes
sagi
ng10
297 Ω Omega ΩDeveloping Applications for Java EE Platform
public static void main(String[] args) String queueName = null;Context jndiContext = null;QueueConnectionFactory queueConnectionFactory = null;QueueConnection queueConnection = null;QueueSession queueSession = null;Queue queue = null;QueueReceiver queueReceiver = null;TextMessage message = null;MessageListener listener = null;listener = new SimpleMessageListener();// Read queue name from command line and display it.if (args.length != 1)
System.out.println("Usage: java " +"SimpleQueueReceiver <queue-name>");
System.exit(1);
Example Code for Asynchronous Queue ConsumerJa
va E
E A
pps.
usi
ng M
essa
ging
10
298 Ω Omega ΩDeveloping Applications for Java EE Platform
queueName = new String(args[0]);System.out.println("Queue name is " + queueName); try
jndiContext = new InitialContext(); catch (NamingException e)
System.out.println("Could not create JNDI API " +"context: " + e.getMessage());
System.exit(1); // Look up connection factory and queue. If either doestry
queueConnectionFactory = (QueueConnectionFactory)jndiContext.lookup("QueueConnectionFactory");
queue = (Queue) jndiContext.lookup(queueName);
Example Code for Asynchronous Queue Consumer
15
Java
EE
App
s. u
sing
Mes
sagi
ng10
299 Ω Omega ΩDeveloping Applications for Java EE Platform
catch (NamingException e) System.out.println("JNDI API lookup failed: " +
e.getMessage());System.exit(1);
/** Create connection.* Create session from connection; false means session is* not transacted.* Create receiver, then start message delivery.* Receive all text messages from queue until* a non-text message is received indicating end of* message stream.* Close connection.*/
Example Code for Asynchronous Queue ConsumerJa
va E
E A
pps.
usi
ng M
essa
ging
10
300 Ω Omega ΩDeveloping Applications for Java EE Platform
try queueConnection =
queueConnectionFactory.createQueueConnection();queueSession = queueConnection.createQueueSession(false,
Session.AUTO_ACKNOWLEDGE);queueReceiver = queueSession.createReceiver(queue);queueReceiver.setMessageListener(listener);queueConnection.start();
catch (JMSException e) System.out.println("Exception occurred:"+e.getMessage());
finally if (queueConnection != null)
try queueConnection.close();
catch (JMSException e)
Example Code for Asynchronous Queue Consumer
16
Java
EE
App
s. u
sing
Mes
sagi
ng10
301 Ω Omega ΩDeveloping Applications for Java EE Platform
Evaluating the Capabilities and Limitations
of EJB Components as Messaging Clients
Enterprise Beans Producer SynchronousConsumer
AsynchronousConsumer
Session Bean Yes Not recommended Not possible
Message Driven Bean Yes Not recommended Yes
• Only message-driven beans can implement the
javax.jms.MessageListener interface.
• Entity and session beans participating in messaging are required to include the standard JMS API messaging producer or synchronous consumer code.