jms

27
05/18/22 1 JMS Eric F. Gerlofsma [email protected]

Upload: genera

Post on 28-Jan-2016

51 views

Category:

Documents


0 download

DESCRIPTION

JMS. Eric F. Gerlofsma [email protected]. Java Message Service (JMS). JMS Client. JMS Client. JMS Provider =JBOSS. JMS Client. JMS Client. JNDI provides the access ports. /ConnectionFactory: org.jboss.mq.SpyConnectionFactory /XAConnectionFactory: org.jboss.mq.SpyXAConnectionFactory - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: JMS

04/22/23 1

JMS

Eric F. Gerlofsma

[email protected]

Page 2: JMS

04/22/23 2

Java Message Service (JMS)

JMS Client

JMS ClientJMS Client

JMS Client

JMS Provider=JBOSS

Page 3: JMS

04/22/23 3

JNDI provides the access ports• /ConnectionFactory: org.jboss.mq.SpyConnectionFactory• /XAConnectionFactory: org.jboss.mq.SpyXAConnectionFactory• /queue: org.jnp.interfaces.NamingContext• /queue/A: org.jboss.mq.SpyQueue• /queue/testQueue: org.jboss.mq.SpyQueue• /queue/ex: org.jboss.mq.SpyQueue• /queue/DLQ: org.jboss.mq.SpyQueue• /queue/D: org.jboss.mq.SpyQueue• /queue/C: org.jboss.mq.SpyQueue• /queue/B: org.jboss.mq.SpyQueue• /topic: org.jnp.interfaces.NamingContext• /topic/testDurableTopic: org.jboss.mq.SpyTopic• /topic/testTopic: org.jboss.mq.SpyTopic• /topic/securedTopic: org.jboss.mq.SpyTopic

Note: replace in: C:\jboss-5.1.0.GA\server\default\deploy\messaging

the file: destinations-service.xml

with: example-destinations-service.xml

from: C:\jboss-5.1.0.GA\docs\examples\jms

Page 4: JMS

04/22/23 4

Point-to Point (P2P)

JMS Client

JMS Client

JMS ProviderJBOSS

send

receive

Page 5: JMS

04/22/23 5

JBoss queue/A

Sender

Receiver

Messages

Page 6: JMS

04/22/23 6

public class Main{ public static void main(String[] args) throws Exception { for (int i=0; i<5; i++) { Receiver receiver = new Receiver(i); Thread thread = new Thread(receiver); thread.start(); } }}

DEMO P2P(Receiver1)

Page 7: JMS

04/22/23 7

Import . . .

public class Receiverimplements Runnable{ public void run() { try { Properties env = new Properties(); String fac = "org.jnp.interfaces.NamingContextFactory"; String url = "jnp://localhost:1099"; env.setProperty(Context.INITIAL_CONTEXT_FACTORY, fac); env.setProperty(Context.PROVIDER_URL, url); Context context = new InitialContext(env); String cfac = "ConnectionFactory"; QueueConnectionFactory qcf = (QueueConnectionFactory)context.lookup(cfac); QueueConnection qc = qcf.createQueueConnection(); QueueSession qs = qc.createQueueSession(false, Session.AUTO_ACKNOWLEDGE); String qA = "queue/A"; Queue q = (Queue)context.lookup(qA); QueueReceiver qreceiver = qs.createReceiver(q); qc.start(); TextMessage message = (TextMessage)qreceiver.receive(); System.out.println(message.getText()); qreceiver.close(); qs.close(); qc.close(); } catch (Exception e) { System.err.println(e.getMessage()); } }}

DEMO P2P(Receiver2)

create:1. factory2. connection3. session4. Queue

5. receiver

6. message

Page 8: JMS

04/22/23 8

Import . . .public class Main{ public static void main(String[] args) throws Exception { Properties env = new Properties(); String fac = "org.jnp.interfaces.NamingContextFactory"; String url = "jnp://localhost:1099"; env.setProperty(Context.INITIAL_CONTEXT_FACTORY, fac); env.setProperty(Context.PROVIDER_URL, url); Context context = new InitialContext(env); String cfac = "ConnectionFactory"; QueueConnectionFactory qcf = (QueueConnectionFactory)context.lookup(cfac); QueueConnection qc = qcf.createQueueConnection(); QueueSession qs = qc.createQueueSession(false, Session.AUTO_ACKNOWLEDGE); String qA = "queue/A"; Queue q = (Queue)context.lookup(qA); QueueSender qsender = qs.createSender(q); TextMessage tm = qs.createTextMessage(); tm.setText("Hello World! "); qsender.send(tm); System.out.println("Message send"); qsender.close(); qs.close(); qc.close(); }}

DEMO P2P(Sender)

create:1. factory2. connection3. session4. Queue

5. sender6. message

Page 9: JMS

04/22/23 9

Publish-Subscribe (Pub-Sub)

JMS Client

JMS ClientJMS Client

JMS Client

JMS ProviderJBOSS

4. publish 5. receive

5. receive6. receive

1. subscribe

2. subscribe3. subscribe

Page 10: JMS

JBoss Topic/testTopic

04/22/23 10

Page 11: JMS

04/22/23 11

import . . .

public class MyFrameextends Frame implements WindowListener{ public static String ncf = "org.jnp.interfaces.NamingContextFactory"; public static String url = "jnp://localhost:1099"; public static String cf = "ConnectionFactory"; public static String tt = "topic/testTopic";

public static void main(String[] arg) { for (int i=0; i<3; i++) new Thread() { public void run() { new MyFrame(); }}.start(); }

private TextArea textArea = new TextArea(16, 64);

public MyFrame() { super("subscriber nr. "+System.currentTimeMillis()%1000); setResizable(false); addWindowListener(this); add(textArea); pack(); setVisible(true); try { listen(); } catch (Exception e) { setText(""+e); } }

. . .

DEMO Pub-Sub (Subscriber1)

Page 12: JMS

04/22/23 12

private void listen()throws Exception { Properties env = new Properties(); env.setProperty(Context.INITIAL_CONTEXT_FACTORY, ncf); env.setProperty(Context.PROVIDER_URL, url); Context context = new InitialContext(env); TopicConnectionFactory tcf = (TopicConnectionFactory)context.lookup(cf); Topic t = (Topic)context.lookup(tt);

TopicConnection tc = tcf.createTopicConnection(); TopicSession ts = tc.createTopicSession(false, Session.AUTO_ACKNOWLEDGE); TopicSubscriber tsub = ts.createSubscriber(t); tc.start(); setText("waiting for message"); while (true) { TextMessage tm = (TextMessage)tsub.receive(); setText("receive="+tm.getText()); } }

public void setText(String s) { textArea.append(s+"\n"); }

public void windowActivated (WindowEvent evt){} public void windowClosed (WindowEvent evt){} public void windowClosing (WindowEvent evt){ dispose();} public void windowDeactivated(WindowEvent evt){} public void windowDeiconified(WindowEvent evt){} public void windowIconified (WindowEvent evt){} public void windowOpened (WindowEvent evt){}}

DEMO Pub-Sub (Subscriber2)

Page 13: JMS

04/22/23 13

import . . .

public class Main{ public static String ncf = "org.jnp.interfaces.NamingContextFactory"; public static String url = "jnp://localhost:1099"; public static String cf = "ConnectionFactory"; public static String tt = "topic/testTopic";

public static void main(String[] args) throws Exception { Properties env = new Properties(); env.setProperty(Context.INITIAL_CONTEXT_FACTORY, ncf); env.setProperty(Context.PROVIDER_URL, url); Context context = new InitialContext(env); TopicConnectionFactory tcf = (TopicConnectionFactory)context.lookup(cf); Topic t = (Topic)context.lookup(tt);

for (int i=0; i<10; i++) { TopicConnection tc = tcf.createTopicConnection(); TopicSession ts = tc.createTopicSession(false, Session.AUTO_ACKNOWLEDGE); TopicPublisher tpub = ts.createPublisher(t); TextMessage tm = ts.createTextMessage(); tm.setText(i+" Hello World!"); System.out.println(tm); tpub.publish(t, tm); System.out.println("published"); tpub.close(); ts.close(); tc.close();} } }

DEMO Pub-Sub (Publisher)create:1. factory2. connection3. session4. topic5. publisher6. message

Page 14: JMS

04/22/23 14

Overview P2P

ConnectionFactory/QueueConnectionFactory

Connection/QueueConnection

Session/QueueSession

Message

Destination/Queue

/TemporaryQueue

MessageConsumer/QueueReceiver

MessageProducer/QueueSender

creates

creates

creates

createscreates

receives message from queue sends message to queue

Page 15: JMS

04/22/23 15

Overview Pub/Sub

ConnectionFactory/TopicConnectionFactory

Connection/topicConnection

Session/TopicSession

Message

Destination/Topic

/TemporaryTopic

MessageConsumer/TopicSubscriber

MessageProducer/TopicPublisher

creates

creates

creates

createscreates

receives message from topic Sends message to topic

Page 16: JMS

04/22/23 16

ConnectionFactory

javax.jms.ConnectionFactory

javax.jms.QueueConnectionFactory

QueueConnection createQueueConnection() QueueConnection createQueueConnection(String userName, String password)

javax.jms.TopicConnectionFactory

TopicConnection createTopicConnection() TopicConnection createTopicConnection(String userName, String password)

Page 17: JMS

04/22/23 17

Connection (a Factory for Sessions)

javax.jms.Connection

void close()Session createSession(..)String getClientID()ExceptionListener getExceptionListener()ConnectionMetaData getMetaData()void setClientID(...)void setExceptionListener(...)void start()void stop()

javax.jms.QueueConnection

QueueSession createQueueSession(...)

javax.jms.TopicConnection

TopicSession createTopicSession(...)

javax.jms.ConnectionMetaData

int getJMSMajorVersion()int getJMSMinorVersion()String getJMSProviderName() String getJMSVersion()Enumeration getJMSPropertyNames()int getProviderMajorVersion()int getProviderMinorVersion()String getProviderVersion()

javax.jms.TopicConnection

TopicSession createTopicSession(...)

javax.jms.ExceptionListener

void onException(JMSException e)

Stopped Started

Closed

start()

stop()

close()close()

create()

can receive messagescan send messages

Page 18: JMS

04/22/23 18

Session (a Factory for Messages, Topics, P2P and PubSub)

javax.jms.Sessionvoid close()void commit()int getAcknowledgeMode()MessageListener getMessageListener()boolean getTransacted()void recover()void rollback()void run()void setMessageListener(MessageListener listener)void unsubscribe(String name)

Message createMessage()Topic createTopic(String topicName)... create...(...)

BytesMessageConsumerMapMessageObjectMessageProducerStreamMessageTextMessage

javax.jms.QueueSession

QueueBrowser createBrowser(...)QueueReceiver createReceiver(...)QueueSender createSender(Queue queue)TemporaryQueue createTemporaryQueue()

javax.jms.TopicSession

TopicPublisher createPublisher(Topic topic)TopicSubscriber createSubscriber(...)TemporaryTopic createTemporaryTopic()

P2P PubSub

messageSelector

Page 19: JMS

04/22/23 19

javax.jms.MessageProducer

void close()void send(Message m) void send(Message m, int deliveryMode, int priority, long timeToLive)void send(Destination d Message m) void send(Destination d Message m, int deliveryMode, int priority, long timeToLive)

Properties

MessageProducer

javax.jms.QueueSender

void send(Queue q, Message m) void send(Queue q, Message m, int deliveryMode, int priority, long timeToLive)Queue getQueue()

javax.jms.TopicPublisher

void publish(Message m) void publish(Message m, int deliveryMode, int priority, long timeToLive)void publish(Topic t, Message m) void publish(Topic t, Message m, int deliveryMode, int priority, long timeToLive)Topic getTopic()

P2P

PubSub

deliveryMode destination (get only)prioritytimeToLive dissableMessageIDdisableMessageTimeStamp

Page 20: JMS

04/22/23 20

Message Producer PropertiesdeliveryMode = DeliveryMode.PERSISTENT (default) DeliveryMode.NON_PERSISTENT

priority = 0 (low) – 4(default) - 9(high) 0-4 normal priorities 5-9 expedited priorities

timeToLive = 0 (default) unlimited The time in milliseconds for which the message provider will retain the message after the producer sends it.

Page 21: JMS

04/22/23 21

javax.jms.MessageConsumer

void close()MessageListener getMessageListener()Message receive() Message receive(long timeout)Message receiveNoWait() void setMessageListener(MessageListener listener)

MessageConsumer

javax.jms.QueueReceiver

Queue getQueue()

javax.jms.TopicSubscriber

boolean getNoLocal() Topic getTopic()

P2P PubSub

Page 22: JMS

04/22/23 22

javax.jms.Destination

Destination

javax.jms.Queue

String getQueueName()String toString()

javax.jms.Topic

String getTopicName()String toString()

P2P PubSub

javax.jms.TemporaryTopic

void delete()

javax.jms.TemporaryQueue

void delete()

Page 23: JMS

04/22/23 23

Message StructureHeaderJMSDestination (set by send or publish)JMSDeliveryMode (set by send or publish)JMSPriority (set by send or publish)JMSExpiration (set by send or publish)JMSMessageID (set by send or publish)JMSTimeStamp (set by send or publish)JMSCorrelationID (set by Client)JMSReplyTo (set by Client)JMSType (set by Client)JMSRedelivered (set by provider)

Application PropertiesProvider Properties

Message Body (one of ...)TextMessage: StringMapMessage: Set of name-value pairsBytesMessage: Stream of bytesStreamMessage: Stream of primitive valuesObjectMessage: Serializable Object

Standard PropertiesJMSXUserID (set by provider)JMSXAppID (set by provider)JMSXDeliveryCount (set by provider)JMSXGroupID (set by Client)JMSXGroupSeq (set by Client)JMSXProducerTXID (set by provider)JMSXConsumerTXID (set by provider)JMSXRcvTimestamp (set by provider)

Page 24: JMS

04/22/23 24

Properties

javax.jms.Message

void acknowledge()void clearBody()void clearProperties()... get...Property(String name)... getJMS...()Enumeration getPropertyNames()boolean propertyExists(String name)void set..Property(...)void setJMS...(...)

MessageBooleanProperty ByteProperty DoubleProperty FloatProperty IntProperty LongProperty ObjectProperty ShortProperty StringProperty

JMSCorrelationPropertyJMSCorrelationIDAsBytesJMSDeliveryModeJMSDestinationJMSExpirationJMSMessageIDJMSPriorityJMSDeliveredJMSReplyToJMSTimeStampJMSType

BytesMessage

MapMessage

ObjectMessage

StreamMessage

TextMessage

Page 25: JMS

04/22/23 25

Message Listener

javax.jms.MessageListener

void onMessage(Message m)

Page 26: JMS

04/22/23 26

Message Selector

• Message selectors are specified as strings during the creation of message consumers.

• These strings are used for filtering messages.

• They conform to the standard NSI SQL-92 syntax for predicates. • They’re evaluated using message headers and properties.

A Selector can contain:LiteralsIdentifiersWhite spacesExpressionsStandard bracketingArithmetic operatorsComparison operators

Page 27: JMS

04/22/23 27

Request/Response Paradigm