jms
Post on 28-Jan-2016
51 Views
Preview:
DESCRIPTION
TRANSCRIPT
04/22/23 1
JMS
Eric F. Gerlofsma
eric.gerlofsma@hu.nl
04/22/23 2
Java Message Service (JMS)
JMS Client
JMS ClientJMS Client
JMS Client
JMS Provider=JBOSS
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
04/22/23 4
Point-to Point (P2P)
JMS Client
JMS Client
JMS ProviderJBOSS
send
receive
04/22/23 5
JBoss queue/A
Sender
Receiver
Messages
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)
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
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
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
JBoss Topic/testTopic
04/22/23 10
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)
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)
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
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
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
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)
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
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
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
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.
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
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()
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)
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
04/22/23 25
Message Listener
javax.jms.MessageListener
void onMessage(Message m)
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
04/22/23 27
Request/Response Paradigm
top related