23
Topics: Topics: JMS & JavaMail JMS & JavaMail Chin-Yi Tsai Chin-Yi Tsai

Topics: JMS & JavaMail Chin-Yi Tsai. 2 JMS JMS 提供一種可以在 J2EE 程式和元件間傳送訊息的 方式 Message agent Message agent J2EE 應用程式和元件使用 JMS

  • View
    231

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Topics: JMS & JavaMail Chin-Yi Tsai. 2 JMS JMS 提供一種可以在 J2EE 程式和元件間傳送訊息的 方式 Message agent Message agent J2EE 應用程式和元件使用 JMS

Topics:Topics:JMS & JavaMailJMS & JavaMail

Chin-Yi TsaiChin-Yi Tsai

Page 2: Topics: JMS & JavaMail Chin-Yi Tsai. 2 JMS JMS 提供一種可以在 J2EE 程式和元件間傳送訊息的 方式 Message agent Message agent J2EE 應用程式和元件使用 JMS

22

JMSJMS

JMSJMS提供一種可以在提供一種可以在 J2EEJ2EE程式和元件間傳送訊息程式和元件間傳送訊息的方式的方式 Message agentMessage agent

J2EEJ2EE應用程式和元件使用應用程式和元件使用 JMS APIJMS API 和和 JMSJMS溝通溝通

JMSJMS由五個元素所組成由五個元素所組成 ProviderProvider ClientClient MessageMessage Administered object: designation factory, connectionAdministered object: designation factory, connection Native serverNative server

Page 3: Topics: JMS & JavaMail Chin-Yi Tsai. 2 JMS JMS 提供一種可以在 J2EE 程式和元件間傳送訊息的 方式 Message agent Message agent J2EE 應用程式和元件使用 JMS

33

訊息傳遞架構訊息傳遞架構

Point-to-pointPoint-to-point 同步同步

Subscriber/publisherSubscriber/publisher

Page 4: Topics: JMS & JavaMail Chin-Yi Tsai. 2 JMS JMS 提供一種可以在 J2EE 程式和元件間傳送訊息的 方式 Message agent Message agent J2EE 應用程式和元件使用 JMS

44

Point-to-Point MessagingPoint-to-Point Messaging

Client1 Client2Queuesends

acknowledges

consumesMsg

Msg

Page 5: Topics: JMS & JavaMail Chin-Yi Tsai. 2 JMS JMS 提供一種可以在 J2EE 程式和元件間傳送訊息的 方式 Message agent Message agent J2EE 應用程式和元件使用 JMS

55

Publish/Subscribe MessagingPublish/Subscribe Messaging

Client1

Client2

publishes subscribes

subscribes

Msg

Topic

Client3

delivers

delivers

Page 6: Topics: JMS & JavaMail Chin-Yi Tsai. 2 JMS JMS 提供一種可以在 J2EE 程式和元件間傳送訊息的 方式 Message agent Message agent J2EE 應用程式和元件使用 JMS

66

The basic building blocks of a JMS application The basic building blocks of a JMS application

Administered objectsAdministered objects connection factories and destinations connection factories and destinations

Connections Connections

Sessions Sessions

Message producers Message producers

Message consumers Message consumers

Messages Messages

Page 7: Topics: JMS & JavaMail Chin-Yi Tsai. 2 JMS JMS 提供一種可以在 J2EE 程式和元件間傳送訊息的 方式 Message agent Message agent J2EE 應用程式和元件使用 JMS

77

JMS API Programming ModelJMS API Programming Model

Connection

creates creates

creates

MsgDestination

receives from

sends to

ConnectionFactory

Destination

MessageConsumerSession

MessageProducer

creates

Page 8: Topics: JMS & JavaMail Chin-Yi Tsai. 2 JMS JMS 提供一種可以在 J2EE 程式和元件間傳送訊息的 方式 Message agent Message agent J2EE 應用程式和元件使用 JMS

88

JMS Message TypesJMS Message Types

Message TypeMessage Type ContainsContains Some MethodsSome Methods

TextMessageTextMessage StringString getText,setTextgetText,setText

MapMessageMapMessage set of name/value pairsset of name/value pairs setString,setDouble,setLonsetString,setDouble,setLong,getDouble,getStringg,getDouble,getString

BytesMessageBytesMessage stream of uninterpreted stream of uninterpreted bytesbytes

writeBytes,readByteswriteBytes,readBytes

StreamMessageStreamMessage stream of primitive valuesstream of primitive values writeString,writeDouble,writwriteString,writeDouble,writeLong,readStringeLong,readString

ObjectMessageObjectMessage serialize objectserialize object setObject,getObjectsetObject,getObject

Message Format Message Header Message Properties Message Body

Page 9: Topics: JMS & JavaMail Chin-Yi Tsai. 2 JMS JMS 提供一種可以在 J2EE 程式和元件間傳送訊息的 方式 Message agent Message agent J2EE 應用程式和元件使用 JMS

99

javax.jms Packagejavax.jms Package

ConnectionConnection Encapsulates a virtual connection with a JMS API provider

SessionSession Single-threaded context for producing and consuming messages

QueueSenderQueueSender An object created by a session used for sending messages to a

queue

QueueReceiverQueueReceiver An object created by a session used for receiving messages from

a queue

Page 10: Topics: JMS & JavaMail Chin-Yi Tsai. 2 JMS JMS 提供一種可以在 J2EE 程式和元件間傳送訊息的 方式 Message agent Message agent J2EE 應用程式和元件使用 JMS

1010

Creating a Point-to-Point JMS API ApplicationCreating a Point-to-Point JMS API Application

1. Look up a Connection factory using the J.N.D.I. API.

2. Look up the message queue using the J.N.D.I. API.

3. Create a Connection using the factory.

4. Create a Session object.

5. Create a MessageSender object.

6. Create one or more Message objects.

7. Send one or more Message objects using the MessageSender object.

8. Send a control message to the Queue object that allmessages have been sent.

Page 11: Topics: JMS & JavaMail Chin-Yi Tsai. 2 JMS JMS 提供一種可以在 J2EE 程式和元件間傳送訊息的 方式 Message agent Message agent J2EE 應用程式和元件使用 JMS

1111

try {INitialContext jnidiContext = new InitialContext();queueConnectionFactory = (QueueConnectionFactory)

jndiContext.lookup( "QueueConnectionFactory" );queue = (Queue) jndiContext.lookup( queueName );queueConnection =

queueConnectionFactory.createQueueConnection( );queueSession = queueConnection.createQueueSession( false ,

Session.AUTO_ACKNOWLEDGE );queueSender = queueSession.createSender( queue );message = queueSession.createTextMessage( );message.setText( "This is a simple message” );queueSender.send( message );queueConnection.close( );

} catch (JMSException e) {

System.out.println("Exception occurred: " +

}Send message

Page 12: Topics: JMS & JavaMail Chin-Yi Tsai. 2 JMS JMS 提供一種可以在 J2EE 程式和元件間傳送訊息的 方式 Message agent Message agent J2EE 應用程式和元件使用 JMS

1212

try {InitialContext jndiContext = new InitialContext();factory = (QueueConnectionFactory)

jndiContext.lookup("QueueConnectionFactory");queue = (Queue) jndiContext.lookup(queueName);QueueConnection connection = factory.createQueueConnection ();QueueSession session = connection.createQueueSession(false,

QueueSession.CLIENT_ACKNOWLEDGE );receiver = session.createReceiver(queue);

receiver.setMessageListener (new MessageListener(){ public void onMessage (Message newMessage){ try { TextMessage message = (TextMessage) newMessage; System.out.println("Message received "); System.out.println( message.getText() ); message.acknowledge ( ); } catch (Exception e) {} } }); connection.start(); } catch (JMSException e){ } catch (NamingException e) { }

Receive message

Page 13: Topics: JMS & JavaMail Chin-Yi Tsai. 2 JMS JMS 提供一種可以在 J2EE 程式和元件間傳送訊息的 方式 Message agent Message agent J2EE 應用程式和元件使用 JMS

1313

Creating a Publish/Subscribe JMS API ApplicationCreating a Publish/Subscribe JMS API Application

1. Look up a TopicConnection factory using the J.N.D.I. API.

2. Look up a Topic object using the J.N.D.I. API.

3. Create Connection and Session objects.

4. Create a TopicPublisher object.

5. Create one or more Message objects.

6. Publish one or more messages using the TopicPublisher object.

Page 14: Topics: JMS & JavaMail Chin-Yi Tsai. 2 JMS JMS 提供一種可以在 J2EE 程式和元件間傳送訊息的 方式 Message agent Message agent J2EE 應用程式和元件使用 JMS

1414

try {

topicConnectionFactory = (TopicConnectionFactory)jndiContext.lookup("TopicConnectionFactory");topic = (Topic) jndiContext.lookup(topicName);topicConnection = topicConnectionFactory.createTopicConnection();topicSession = topicConnection.createTopicSession(false,

Session.AUTO_ACKNOWLEDGE); topicPublisher = topicSession.createPublisher(topic);

message = topicSession.createTextMessage(); message.setText("This is a simple publish/subscribe message”); topicPublisher.publish(message);

} catch (JMSException e) {

System.out.println("Exception occurred: " + e.toString());

}

Publisher

Page 15: Topics: JMS & JavaMail Chin-Yi Tsai. 2 JMS JMS 提供一種可以在 J2EE 程式和元件間傳送訊息的 方式 Message agent Message agent J2EE 應用程式和元件使用 JMS

1515

try {TopicConnectionFactory factory =(TopicConnectionFactory)jndiContext.lookup("TopicConnectionFactory");topic = (Topic) jndiContext.lookup(topicName);TopicConnection connection = factory.createTopicConnection ();TopicSession session = connection.createTopicSession(false,TopicSession.CLIENT_ACKNOWLEDGE );subscriber = session.createSubscriber(topic);

subscriber.setMessageListener (new MessageListener(){ public void onMessage (Message newMessage){ try { TextMessage message = (TextMessage) newMessage; System.out.println("Message received "); System.out.println( message.getText() ); message.acknowledge (); } catch (Exception e) {} } }); connection.start();

} catch (JMSException e){ } Subscriber

Page 16: Topics: JMS & JavaMail Chin-Yi Tsai. 2 JMS JMS 提供一種可以在 J2EE 程式和元件間傳送訊息的 方式 Message agent Message agent J2EE 應用程式和元件使用 JMS

1616

JavaMailJavaMail

Page 17: Topics: JMS & JavaMail Chin-Yi Tsai. 2 JMS JMS 提供一種可以在 J2EE 程式和元件間傳送訊息的 方式 Message agent Message agent J2EE 應用程式和元件使用 JMS

1717

JavaMail APIJavaMail API

傳送電子郵件傳送電子郵件接收電子郵件接收電子郵件刪除電子郵件刪除電子郵件回覆和發送一封電子郵件回覆和發送一封電子郵件發送電子郵件發送電子郵件傳送附加檔案傳送附加檔案接收附加檔案接收附加檔案搜索一個電子郵件資料夾搜索一個電子郵件資料夾

Page 18: Topics: JMS & JavaMail Chin-Yi Tsai. 2 JMS JMS 提供一種可以在 J2EE 程式和元件間傳送訊息的 方式 Message agent Message agent J2EE 應用程式和元件使用 JMS

1818

Java Mail API PackageJava Mail API Package

javax.mailjavax.mail Classes modeling a mail system. Classes modeling a mail system.

javax.mail.eventjavax.mail.event Listeners and events for the JavaMail API. Listeners and events for the JavaMail API.

javax.mail.internetjavax.mail.internet Classes specific to Internet mail systems. Classes specific to Internet mail systems.

javax.mail.searchjavax.mail.search Message search terms for the JavaMail API. Message search terms for the JavaMail API.

Page 19: Topics: JMS & JavaMail Chin-Yi Tsai. 2 JMS JMS 提供一種可以在 J2EE 程式和元件間傳送訊息的 方式 Message agent Message agent J2EE 應用程式和元件使用 JMS

1919

Important ClassesImportant Classes

javax.mail.javax.mail.SessionSession

Javax.mail.Javax.mail.MessageMessage

Javax.mail.AddressJavax.mail.Address

Javax.mail.AuthenticatorJavax.mail.Authenticator

Javax.mail.Javax.mail.TransportTransport

Javax.mail.Javax.mail.StoreStore

Javax.mail.FolderJavax.mail.Folder

Page 20: Topics: JMS & JavaMail Chin-Yi Tsai. 2 JMS JMS 提供一種可以在 J2EE 程式和元件間傳送訊息的 方式 Message agent Message agent J2EE 應用程式和元件使用 JMS

2020

Main Java mail main classesMain Java mail main classes

MessMessageage

MessMessageage

SessionSession

FolderFolderFolderFolder

TransportTransport

Connection to serverConnection to server

Sending mailSending mailusing SMTPusing SMTP

Receiving mail usingReceiving mail usingPOP or IMAPPOP or IMAP

StoreStore

Connection toConnection toa remove mail foldera remove mail folder(mainly the INBOX)(mainly the INBOX)

Receive and arrayReceive and arrayof messagesof messages

Sending a messageSending a message

收 送

Page 21: Topics: JMS & JavaMail Chin-Yi Tsai. 2 JMS JMS 提供一種可以在 J2EE 程式和元件間傳送訊息的 方式 Message agent Message agent J2EE 應用程式和元件使用 JMS

2121

傳送電子郵件傳送電子郵件Session sendMailSession;Store store;Transport transport;

Properties props = new Properties();

sendMailSession = Session.getInstance(props, null);

props.put("mail.smtp.host", "smtp.jspinsider.com");

Message newMessage = new MimeMessage(sendMailSession);

newMessage.setFrom(new InternetAddress(request.getParameter("from")));newMessage.setRecipient(Message.RecipientType.TO,

new InternetAddress ( request.getParameter ("to")));newMessage.setSubject(request.getParameter("subject"));newMessage.setSentDate(new Date());newMessage.setText(request.getParameter("text"));

transport = sendMailSession.getTransport("smtp");

transport.send(newMessage);

Session

Message

Transport

Page 22: Topics: JMS & JavaMail Chin-Yi Tsai. 2 JMS JMS 提供一種可以在 J2EE 程式和元件間傳送訊息的 方式 Message agent Message agent J2EE 應用程式和元件使用 JMS

2222

接收電子郵件接收電子郵件

Properties props = new Properties( );Session ses1 = Session.getDefaultInstance( props , null );

Store store1 = ses1.getStore(“pop3”);

Store1.connect( host, username, password);

Folder folder1 = store1.getFolder(“INBOX”);Folder1.open(Folder.READ_ONLY);

Message msg[] = folder1.getMessage();

folder1.close(false);store1.close();

Session

Store

Folder

Message

Page 23: Topics: JMS & JavaMail Chin-Yi Tsai. 2 JMS JMS 提供一種可以在 J2EE 程式和元件間傳送訊息的 方式 Message agent Message agent J2EE 應用程式和元件使用 JMS

2323

referencereference

http://java.sun.com/products/javamail/javadocs/indhttp://java.sun.com/products/javamail/javadocs/index.htmlex.html

http://java.sun.com/j2ee/1.4/docs/api/http://java.sun.com/j2ee/1.4/docs/api/