Module 10 Developing Java EE Applications using Messaging

16
1 Module 10 Developing Java EE Applications using Messaging Java EE Apps. using Messaging 10 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

Transcript of Module 10 Developing Java EE Applications using Messaging

Page 1: Module 10 Developing Java EE Applications using Messaging

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

Page 2: Module 10 Developing Java EE Applications using Messaging

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

Page 3: Module 10 Developing Java EE Applications using Messaging

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

Page 4: Module 10 Developing Java EE Applications using Messaging

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

Page 5: Module 10 Developing Java EE Applications using Messaging

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

Page 6: Module 10 Developing Java EE Applications using Messaging

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

Page 7: Module 10 Developing Java EE Applications using Messaging

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

Page 8: Module 10 Developing Java EE Applications using Messaging

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

Page 9: Module 10 Developing Java EE Applications using Messaging

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

Page 10: Module 10 Developing Java EE Applications using Messaging

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

Page 11: Module 10 Developing Java EE Applications using Messaging

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

Page 12: Module 10 Developing Java EE Applications using Messaging

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

Page 13: Module 10 Developing Java EE Applications using Messaging

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

Page 14: Module 10 Developing Java EE Applications using Messaging

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

Page 15: Module 10 Developing Java EE Applications using Messaging

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

Page 16: Module 10 Developing Java EE Applications using Messaging

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.