JMS Technical Training
DaeJung KimSenior Consultant
BEA Systems Korea.October, 2004
2
๋ชฉ์ฐจ
1. ๋ฉ์์ง๋ฏธ๋ค์จ์ด
2. ๊ธฐ๋ณธ JMS API ๊ฐ๋
3. JMS 1.0 API ๊ฐ์
3
๋ถ์ฐ ๋ฏธ๋ค์จ์ด ์ข ๋ฅ
โข ๋ฆฌ๋ชจํธํ๋ก์์ ํธ์ถ (RPC)โ ๋๊ธฐโ ํ๊ฒ์์คํ ์์ EJBBeans, Corba Service๋ฑ์๋ฉ์๋/ํ๋ก์์ ๋ฅผ์ง์ ํธ์ถ
โ ํด๋ผ์ด์ธํธ์์๋ฒ๊ฐ๋ฐ์ ํ๊ฒ coupled ๋์ด์์.
โข ๋ฉ์์ง๊ธฐ๋ฐ๋ฏธ๋ค์จ์ด (MOM) โ ๋น๋๊ธฐ (and synchronous)โ ํ๋ก์์ ๋ฅผํธ์ถํ๊ธฐ์ํด๋ฉ์์ง๋ฅผํ๊ฒ์์คํ ์์ ๋ฌ
โ ํด๋ผ์ด์ธํธ์์๋ฒ๊ฐ๋ถ๋ฆฌ๋ํํ
Needs Work
Does Work
Needs Work
Does Work
Queue
Producer
Consumer
4
๋ฉ์์ง์ด๋?
โข ๋ฉ์์ง์ํ๋ก๊ทธ๋จ๋๋์ํํธ์จ์ด์ปดํฌ๋ํธ๊ฐ์๋กํต์ ํ๊ธฐ์ํ๋ฉ์ปค๋์ฆ์ด๋ค.โ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ ๋น๋๊ธฐํต์ โ ์ธํฐํ์ด์ค์๊ตฌํ์๋ถ๋ฆฌโ ํด๋ผ์ด์ธํธ, ๋ฉ์์ง์๋ฒ, ๋ฉ์์ง๋ก๊ตฌ์ฑ.
5
Message BrokerMessaging์ loosely-couple ๋ฐฉ๋ฒ์ผ๋ก๋ถ์ฐ์ปค๋ฎค๋์ผ์ด์ ์๊ฐ๋ฅํ๊ฒํ๋ค.
Service orchestration
Custom applications
Distributed query engine
Adapters
.NETapps
Java apps
Web Svcs MQ gateway
Mainframe & legacy
apps
JMS
Routing & Transformation
Message Bus(Transport,Protocols,, Routing, Transformation )
SOAP/HTTP,JMS
BPEL4WS, PD4JXQuery
J2EE,Struts
XQuery,JDBC
JCA
SOAP,WSDL, UDDI
6
๋ฉ์์ง ์ฌ์ฉ์ ์ฅ์
โข ํด๋ผ์ด์ธํธ์๋ต์๊ฐํฅ์โ ์๋ต์๊ธฐ๋ค๋ฆฌ์ง์์ผ๋ฏ๋ก์ ํ๋ฆฌ์ผ์ด์ ์์ฒ๋ฆฌ๋ฅผ๊ณ์ํ ์์๋ค.
โข ํ์ฅ์ฑํฅ์โ ์๋น์(Consumer)๋์์คํ ์ฌ์ ๊ฐ์์๋/ ๋ฉ์์ง์ฒ๋ฆฌ๊ฐ๊ฐ๋ฅํ ๋์๋ตํ ์์๋ค.
โข ๊ฐ์ฉ์ฑํฅ์โ ์ฒ๋ฆฌ์๊ฐ์ด์ค๋๊ฑธ๋ฆฌ๋์์ ์์ฌ๋ฌ๊ฐ์ํธ๋์ญ์ ์ผ๋ก๋์ฐ์ด์ฒ๋ฆฌํ ์์๋ค.
โข ์ ์ง๊ด๋ฆฌํฅ์โ ์๋ฒ๊ตฌํ์ด๋ณ๊ฒฝ๋์์๋๊ฑฐ์๋ณ๊ฒฝ์์ด์ ์ฉ๊ฐ๋ฅํ๋ค.
โข ์ ๋ขฐ์ฑํฅ์โ ์ ํ์ ์ผ๋ก๋ฉ์์ง๋ฅผ์๊ตฌ์ ์ฅ์(persistent store)์์ ์ฅํจ์ผ๋ก์์ธ์ ๋ผ๋๋ฉ์์ง์ ๋ฌ์๋ณด์ฅํ ์์๋ค.
โ ํด๋ผ์ด์ธํธ๊ฐ์ฐ๊ฒฐ๋์ด์์ง์์๊ฒฝ์ฐ์ผ๋จ๋ฉ์์ง๋ฅผ์ ์ฅํ๊ณ ํด๋ผ์ด์ธํธ๊ฐ์ ์๋๋ฉด๋ฉ์์ง๋ฅผ์ ๋ฌํ ์์๋ค.
7
MOM ์ ์ ์ผ์ด์ค
โข ์ํฌํ๋ก์ฐ / ํ๋ก์ธ์คโข ๋คํธ์๊ด๋ฆฌโข ํต์ ์๋น์คโข ๊ณ ๊ฐ๊ด๋ฆฌโข ๊ณต๊ธ์ฒด์ธ๊ด๋ฆฌโข ๊ธฐ์ ์์ฐ์ฌํํตํฉ
8
๋ชฉ์ฐจ
1. ๋ฉ์์ง๋ฏธ๋ค์จ์ด
2. ๊ธฐ๋ณธ JMS API ๊ฐ๋
3. JMS 1.0 API ๊ฐ์
9
What is Java Messaging Service?
โข JMS๋์๋ฐ/J2EE ์ ํ๋ฆฌ์ผ์ด์ ์์ํ์๋ฐํ์ค์ํฐํ๋ผ์ด์ฆ๋ฉ์์ง์๋น์ค์ด๋ค. โ ํ์ค API , ๋ฒค๋์ค๋ฆฝ API ( javax.jms )โ ๋ถ์ฐํ๊ฒฝ์์์ ํ๋ฆฌ์ผ์ด์ ์ปดํฌ๋ํธ๋ค๊ฐ์๋ฉ์์ง๋ฅผ๋ผ์ฐํ ํ๋์ง๋ฅ์ ์ธ๊ตํ๊ธฐ์ญํ ๋ด๋น
MOMSystem
ApplicationA
ApplicationB
Message Message
10
์ธ์ JMS API๋ฅผ ์ฌ์ฉํ ์ ์๋๊ฐ?
โข ์ปดํฌ๋ํธ๊ฐ๋ค๋ฅธ์ปดํฌ๋ํธ์์ธํฐํ์ด์ค์๋ํ์์กด์ฑ์๋ฐฐ์ ํ๊ณ ์ํ ๋, ๊ทธ๋์์ปดํฌ๋ํธ๊ฐ์ฝ๊ฒ๋์น(replace) ๋ ์์๋๋กํ ๋..
โข ๋ชจ๋ ์ปดํฌ๋ํธ๊ฐ up์ด๊ฑฐ๋๋์์์ํ๋์ง์์๋์ ํ๋ฆฌ์ผ์ด์ ์์ํํ๊ณ ์ํ ๋.. ์ ํ๋ฆฌ์ผ์ด์ ์ด .. ๋ชจ๋ ์ปดํฌ๋ํธ๊ฐ up ์ด๊ณ running ๋์์ running ์ด์๋์ด๋๋ ๋..
โข ์ ํ๋ฆฌ์ผ์ด์ ๋น์ฆ๋์ค๋ชจ๋ธ์ด ๋ค๋ฅธ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ณด๋ฅผ๋ณด๋ด๊ณ ์ฆ์์๋ต์๋ฐ์ง์๊ณ ๋ค๋ฅธ์์ ์์ํํํ๋ฉ์์ง๋ฅผ๋ฐ์์ฒ๋ฆฌํ๊ณ ์ํ ๋..
11
JMS๋ J2EE์ ์ ํฉํ๊ฐ?
โข JMS API๋ J2EE 1.3 ํ๋ซํผ์์๋ค์๊ณผ๊ฐ์์ฌํญ์๊ฐ๋ฅํ๊ฒํ๋ค.โ ์ ํ๋ฆฌ์ผ์ด์ ํด๋ผ์ด์ธํธ , EJB ์ปดํฌ๋ํธ, ์น์๋น์ค์ปดํฌ๋ํธ๋
JMS ๋ฉ์์ง๋ฅผ๋๊ธฐ์ (Synchronously)์ผ๋ก๋ณด๋ด๊ณ ๋ฐ์์์๋ค.โ ์ถ๊ฐ์ ์ผ๋ก , ์ ํ๋ฆฌ์ผ์ด์ ํด๋ผ์ด์ธํธ๋๋น๋๊ธฐ(Asynchronously)์ ์ผ๋ก JMS ๋ฉ์์ง๋ฅผ๋ฐ์์์๋ค.
โ ( Applet์ JMS API์ง์๋ฅผ์ง์ํ์ง์๋๋ค.)โ MDB๋๋ฉ์์ง์๋น๋๊ธฐ์ ์ฒ๋ฆฌ๋ฅผ๊ฐ๋ฅํ๊ฒํ๋ค.
โข JMS Provider๋์ถ๊ฐ์ ์ผ๋ก๊ตฌํ๋ ์์๋ค. โ ์ก. ์์ ๋ฉ์์ง๋ํธ๋์ญ์ ์์ฐธ์ฌํ ์์์ต๋๋ค.
โข J2EE 1.3 , 1.2๋ JMS 1.0 , J2EE 1.4๋ JMS 1.1 ์คํ๊ตฌํ
12
JMS API ์ํคํ ์ฒ
JMSProvider
JMSClients
AdministrationTool
CF D
JMSClients
JMSClients
JMSClients
Connection
Message
Lookup
Bind
*CF : ConnectionFactory* D : Destination
13
๋ฉ์์ง ๋๋ฉ์ธ ํ์
โข JMS ๋๋ฉ์ธโ point-to-pointโ publish/subscribe
Sender Receiver
Publisher
Subscriber 1
Subscriber 1
Subscriber 1
Point-to-Point (PTP) ๋ฉ์์ง ๋๋ฉ์ธ
โข ๊ฐ๋ฉ์์ง๋ฅผ๋จํ๋์๋ฉ์์ง์๋น์(consumer)์๊ฒ์ ์กํ๋ค.โข ๋ฉ์์ง์์ ์(receiver)๋ Queue์๋ฉ์์ง๊ฐ์กด์ฌํ ๊ฒฝ์ฐ์ธ์ ๋ ์ง ๋ฉ์์ง๋ฅผ๊ฐ์ ธ์ฌ์์๋ค. โ ๋ฉ์์ง์์ ์์๊ฐ์์ข ์์ฑ์ด์์.
QueueSender AReceiver BSends
Consumes
AcknowledgesSender B
Receiver A
14
15
Publish/Subscribe (Pub/Sub) ๋ฉ์์ง ๋๋ฉ์ธ
โข ๊ฐ๋ฉ์์ง๋ํ๋์ด์์๋ฉ์์ง์๋น์(consumer)์์ํด์ฒ๋ฆฌ๋๋ค.
โข ์๊ตฌ์ ๊ตฌ๋ (durable subscription)์ด์ค์ ๋์ด์์ง์์๊ฒฝ์ฐ , ๋ฉ์์ง์์ ์ ์๊ฐ์์ข ์์ ์ด๋ค.
PublisherA
Subscriber B
Publishes
SubscribesDelivers
TopicSubscribes
Delivers
Subscriber A
PublisherB
16
์๊ตฌ์ ๊ตฌ๋ ์(Durable Subscribers)
โข ๊ฒฝ์ฐ์๋ฐ๋ผ์ํด๋ผ์ด์ธํธ๊ฐ์ฌ์ ์๋์์๋ , ํ ํฝ๋ฉ์์ง๋ฅผ์ฌ์ ์ก๋ฐ์์ผ๋งํ๋๊ฒฝ์ฐ๊ฐ์๋ค. ์ด๋durable topic subscriptions์์ฌ์ฉํ๋ค.
โข JMS ํ ํฝ์๋งํด๋น๋๋ค.โข Publisher๋๋ฐ๋์์๋ณ์๋ฅผ์ ๊ณตํด์ผํ๋ค.
โ ํด๋ผ์ด์ธํธ๊ฐ JMS Provider์์ฌ์ ์ํ์๋ ,JMS๊ฐ์ฒ๋ฆฌ์๋๋ฉ์์ง๋ค์์๋ณํ ์์๋๋กํ๊ธฐ์ํด์์ด๋ค.
โข JMS provider๋ durable subscriber์๋ํ์ฌ๋ฉ์์ง๋ฏธ์์ ์๋ฉ์์ง๋ฅผ์ ์ฅํ๋ค.
17
๋ชฉ์ฐจ
1. ๋ฉ์์ง๋ฏธ๋ค์จ์ด
2. ๊ธฐ๋ณธ JMS API ๊ฐ๋
3. JMS 1.0 API ๊ฐ์
18
JMS Component Overview
Base Interface Point-to-Point Publish-Subscribe NotesDestination javax.jms.Destination javax.jms.Queue javax.jms.Topic Looked up in JNDI
Producer javax.jms.MessageProducer javax.jms.QueueSender javax.jms.TopicPublisherCan specify message expiration, delivery mode, and priority
Consumer javax.jms.MessageConsumer javax.jms.QueueReceiver javax.jms.TopicSubscriber
Asynchronous consumers implement javax.jms.MessageListener interface. Synchronous consumers w ill block until a message arrives. Consumers can f ilter messages using SQL SELECT and WHERE statements.
Message javax.jms.Message
javax.jms.BytesMessage, javax.jms.MapMessage,
javax.jms.ObjectMessage, javax.jms.StreamMessage,
javax.jms.TextMessage
javax.jms.BytesMessage, javax.jms.MapMessage,
javax.jms.ObjectMessage, javax.jms.StreamMessage,
javax.jms.TextMessage
P-to-P: A message is delivered to only 1 queue. Remains in queue (PERSISTENT or NON-PERSISTENT) until receiver is available. Pub-Sub: A message is delivered to many consumers.
ConnectionFactory javax.jms.ConnectionFactory javax.jms.QueueConnectionFactory javax.jms.TopicConnectionFactory Looked up in JNDI, creates Connections
Connection javax.jms.Connection javax.jms.QueueConnection javax.jms.TopicConnectionCreates Sessions. Pub-Sub: Needs ClientID (ie. Username) to uniquely identify subscriber.
Session javax.jms.Session javax.jms.QueueSession javax.jms.TopicSession Creates Producers, Consumers, and Messages
19
JMS API Programming Model
20
What is a Message?
โข A message is composed of:โ 10 header fieldsโ optional header fields called
propertiesโ a body
Message Headers
Message Properties
Message Body
21
Message Headers
22
JMS ํค๋ ํ๋๋ค
์ด๋ฆ ์ง์ ์ค๋ช
JMSDestination Send() ๋ฉ์์ง๊ฐ๋ณด๋ด์ด์ง๋ชฉ์ ์ง์ด๋ฆ. Send() ๋ฉ์๋์์์๋์ง์
JMSDeliveryMode Send() ๋ฉ์์ง๊ฐ์ง์์ฑ(persistent)์ธ์ง๋น์ง์์ฑ์ธ์ง๋ฅผ์ค์ ํจ.
JMSExpiration Send() ๋ฉ์์ง๊ฐ๋ง๋ฃ๋์ด์์คํ ์์์ง์์ง๋์์ ์์ ์ํจ.์ดํ๋๋๋ฉ์์ง๊ฐ๋ณด๋ด์ง๋์ค์ ๋๋๊ฒฝ๊ณผ์๊ฐ(time-to-live)์์ข์ฐ๋๋ค. TTL์ด 0 ์ผ๊ฒฝ์ฐ๋ง๋ฃ๋์ง์์์์๋ฏธ
JMSPriority Send() ๋ฉ์์ง์ฐ์ ์์(0-9) ์ค์ . ๋์์๋ก์ฐ์ ์์. ๊ธฐ๋ณธ๊ฐ์ 4
JMSMessageID Send() ๋ฉ์์ง์์๋ณ๊ฐ์๋ฌธ์์ด๋ก๊ฐ์ง๊ณ ์์. ์๋ณ๊ฐ์ ID: ๋ก์์ํ๊ณ ์ผ๋ฐ์ ์ผ๋ก JMS Provider์์ํด์๋๋ถ์ฌ๋จ.
JMSTimestamp Send() ์ ์ก๋ ๋ฉ์์ง๊ฐ JMS Provider๋ก๋ค์ด์จ์๊ฐ์ long ๊ฐ์ผ๋ก๊ฐ์ง๊ณ ์์.
JMSCorrelationID Client ๋ฉ์์ง๋ฅผ๋ณด๋ด๊ธฐ์ ์ client์์์ ์ ๋๋์์์๋ฌธ์์ด์ด๋ค. ์ด๊ฒ์
JMSReplyTo Client Consumer๊ฐ์๋ต์๋ณด๋ผ๋์ฌ์ฉํ ์์๋ JMS ๋ชฉ์ ์ง์ด๋ค.
JMSType Client ๋ฉ์์งํ์ ์ค์ . ํด๋ผ์ด์ธํธ์์์ง์ ํ์์์ํ์ ์๊ฐ์ง๋ฉ์์ง๋ฅผ๊ตฌ๋ถํ๋๋ฐ์ฌ์ฉ.
JMSRedelivered JMS Provider
์์ ์๊ฐ๋ฉ์์ง๋ฅผํ์ธํ์ง๋ชปํ๊ฑฐ๋์ธ์ ์ด๋ณต๊ตฌ๋์ด JMS ๋ฉ์์ง๋ฅผ์ฌ์ ์กํ ๋.
23
Queue์ ์ ์ฅ๋ ๋ฉ์์ง ๋ณด๊ธฐ
public void displayQueue(Message m) throws JMSException {System.out.println("Message ID " + m.getJMSMessageID() +
" delivered " + new Date(m.getJMSTimestamp()) +" to " + m.getJMSDestination());
System.out.print("\tExpires ");
if (m.getJMSExpiration() > 0) {System.out.println( new Date( m.getJMSExpiration()));
} else {System.out.println("never");
}
System.out.println("\tPriority " + m.getJMSPriority());System.out.println("\tMode " + (
m.getJMSDeliveryMode() == DeliveryMode.PERSISTENT ?"PERSISTENT" : "NON_PERSISTENT"));
System.out.println("\tCorrelation ID " + m.getJMSCorrelationID());System.out.println("\tReply to " + m.getJMSReplyTo());System.out.println("\tMessage type " + m.getJMSType());
if (m instanceof TextMessage) {System.out.println("\tTextMessage \"" + ((TextMessage)m).getText() + "\"");
}
}// ์์ฑ๊ฐ์ค์ ์..setStringProperty (โReplyโ ,โtoxxxโ );
24
๋ฉ์์ง ํ์
โข Streamโ Stream of Java primitive valuesโ ๊ฐ์ฒด๋๋ฐ๋์์ฐ์ฌ์ง์์๋๋ก์ฝํ์ ธ์ผํ๋ค.
โข Mapโ ์ด๋ฆ๊ณผ๊ฐ์์
โ ๊ฐ๊ฐ์์ด๋ฆ์ด๋งต์์๊ณ ์ ํ๊ฐ์๊ฐ์ง.โ ์ํธ๋ฆฌ์์์๋์์.
โข Textโ String ์ธ์คํด์คโ XML ๋ฌธ์์ง์
โข WebLogic JMS ์์์ดํ์ ์ํ์ฅํ์ฌ XMLMessage ํ์ ์๋ง๋ฌ. โข Object
โ ์ง๋ ฌํ๊ฐ๊ฐ๋ฅํ๊ฐ์ฒด
โข Bytesโ Raw ๋ฐ์ดํธ์คํธ๋ฆผโ Raw ๋ฉ์์งํ์์์ฌ์ฉํ๋ํด๋ผ์ด์ธํธ์์์ด๋ฉ์์งํ์ ์ฌ์ฉ..
25
What is a Destination?
โข A destination is an administered objectโ Producers produce messages to destinations, consumers
consume messages from destinationsโ Support concurrent useโ To write portal code, it should be looked up via JNDI.
โข Topicsโ Publish/Subscribe message modelโ Can exist as a hierarchy
โข Queuesโ Point-to-Point message model
26
What is a Producer?
โข Producer is the sender of messagesโ PTP: QueueSender, created by QueueSession
QueueSender queueSender = queueSession.createSender(queue)
โ Pub/Sub: TopicPublisher, created by TopicSessionTopicPublisher topicPublisher = topicSession.createPublisher(topic)
โข Can specify the following default for a message:โ Delivery mode
โข PERSISTENT (Delivered once and only once)โข NON_PERSISTENT (Delivered at most once)
โ ์ฐ์ ์์โข 0-9 levels
โ Time-to-live (expiration) โข 0 means never expires
27
What is a Consumer?โข A consumer is the receiver of messages
โ PTP: QueueReceiver, created by QueueSessionQueueReceiver queuereceiver = queueSession.createReceiver(queue)
โ Pub/sub: TopicSubscriber, created by TopicSessionTopicSubscriber topicSubscriber =
topicSession.createSubscriber(topic)
TopicSubscriber durableTopicSubscriber = topicSession.createDurableSubscriber(topic)
โข Can filter messages using a subset of SQL92โข Synchronous consume
โ Consumer will block using method: receive( Message message )
โข Asynchronous consumeโ Register as a MessageListenerโ Consumer notified with callback method:
MessageListener.onMessage(Message message)when a message arrives
28
What is a Connection?
โข A connection represents a physical connection to the JMS provider.
โข Created by ConnectionFactoryโข Creates Session objectsโข Must be started to consume messages
โ Note: Does not need to be started to producemessages!
โข Support concurrent use
29
What is a Session?
โข Session์ producer ์ consumer๊ฐ๋ํ์ํ(conversional state)๋ฅผ์ ์งํ๋ฉฐ์ค์ ๋ฉ์์ง์๊ตํ์๊ด๋ฆฌํ๋ค.
โข Producer, Consumer ๋ฐ๋ฉ์์ง๋ฅผ์์ฑํ๋ค. โข Session์์ฑ๊ธ์ฐ๋ ๋๋ชจ๋ธ์ด๋ฏ๋ก ๋์์ฌ์ฉ์์ง์ํ์ง์๋๋ค.
โข Connection์๋ค์๊ณผ๊ฐ์๊ธฐ๋ฅ์์ถ๊ฐํ ์์๋ค.โ ์์ฑ๋๋(produced) ๋ฉ์์ง์์๋น๋๋(consumed) ๋ฉ์์ง์์์์ ์
โ ๋น๋๊ธฐ consumer์๋ฆฌ์ค๋๋ฉ์๋ ํธ์ถ
โ ๋ฉ์์ง์ ๋ฌ๋ณด์ฅ(Guaranteed Delivery)
30
Guaranteed Messaging - Two Types of Sessions
โข ๋ฉ์์งํ์ธ(acknowledgement) ์ธ์ QueueSession ackQueueSession =
queueConnection.createQueueSession(false, acknowledgement)
โข ํธ๋์ญ์ ์ธ์ QueueSession transactedQueueSession =
queueConnection.createQueueSession(true, 0)
ํธ๋์ญ์ ์ธ์ ์์๋acknowledgement ๋ชจ๋๊ฐ๋ฌด์๋จ. โ0โ์ผ๋ก์ค์ ํ๋๊ฒ์๊ถ์ฅํจ.
31
๋น ํธ๋์ญ์ ๋ชจ๋์ ๋ํ ๋ฉ์์ง ํ์ธ
โข ์ธ์ ์๋ํ 3๊ฐ์ง์ข ๋ฅ์ํ์ธ(acknowledgement)์ต์ ๋คโ AUTO_ACKNOWLEDGE
โข ๋๊ธฐ์์์๋ consumer์ receive() ๋ฉ์๋ํธ์ถ์ด์์ธ์ํฉ์์ด๋๋ ๋๋ฉ์์ง๊ฐ์๋์ผ๋กํ์ธ๋๋ค. ๋น๋๊ธฐ์์์๋ฉ์์ง๋ onMessage ์ฝ๋ฐฑํจ์๊ฐ๋ฐํ๋ ๋ํ์ธ๋๋ค.
โข ๋ฉ์์ง๋ฅผ์ฒ๋ฆฌํ๋ฉด JMS Provider๊ฐ์๋์ผ๋ก๋ฉ์์ง๋ฅผํ์ธํจ.โข Provider ์ค๋ฅํ์ต๋ํ๊ฐ์์ฌ์ ์ก๋ฉ์์ง๋ฅผ๋ณด์ฅํจ.
โ DUPS_OK_ACKNOWLEDGEโข ๋ฆ์(Lazy) ๋ฉ์์งํ์ธ. AUTO_* ๋ณด๋คํจ์จ์ ์ธ๋ฐ๊ทธ์ด์ ๋๋ชจ๋ ๋ฉ์์ง๊ฐํ์ธ๋๋๊ฒ์์๋๊ธฐ๋๋ฌธ์ด๋ค. ๊ทธ๋ฌ๋์์คํ ์ด๋๋คํธ์์ฅ์ ์๋ฉ์์ง๊ฐ์ค๋ณต์ ์ก๋ ์๋์๋ค.
โ CLIENT_ACKNOWLEDGEโข ํด๋ผ์ด์ธํธ์์ javax.jms.Message.acknowledge() ๋ฉ์๋๋ฅผ์ฌ์ฉํ์ฌ๋ฉ์์ง๋ฅผํ์ธํ ๋์ฌ์ฉ๋จ. ํด๋ผ์ด์ธํธ๋๋ชจ๋ ๋ฉ์์ง๋ฅผ์ผ์ผ์ดํ์ธํ ํ์๊ฐ์๊ณ ๋์ acknowledge()๋ฅผํธ์ถํ๋ฉดํ์ฌ๊น์ง๋ฐ์ํ๋ฉ์์ง๋ฅผ์ผ๊ด์ ์ผ๋กํ์ธํ๋ค.
โ NO_ACKNOWLEDGEโข ์น๋ก์ง์์์ถ๊ฐํํ์ธ๋ชจ๋๋ก๋ฉ์์ง์ ์ก๊ณผ์ ์ด์๋ค. JMS๋๋ฉ์์ง๋ฅผ์๋น์์๊ฒ์ ์กํํ๋ฐ๋ก๋ฒํผ์์์ ๊ฑฐํ๋ค.
โ MULTICAST_NO_ACKNOWLEDGโข ์น๋ก์ง์์์ถ๊ฐํํ์ธ๋ชจ๋. JMS ๋ฉ์์ง๋ฅผ IP ๋ฉํฐ์บ์คํธ(multicast)๋ฅผํตํด topic
subscriber์๊ฒ์ ๋ฌํจ.
32
์ ๋นํ ํ์ธ ๋ชจ๋๋ ๋ฌด์์ธ๊ฐ?
QueueSession qsessionSend = qcon.createQueueSession(false, /* ๋นํธ๋์ญ์ ์ธ์ */ Session.AUTO_ACKNOWLEDGE);
QueueSession qsessionReceive = qcon.createQueueSession(false,Session.AUTO_ACKNOWLEDGE);
33
What is a ConnectionFactory?
โข A connection factory in an administered JMS object.
โข Used to create JMS connections.โข It is looked up in JNDI. For example:
InitialContext ctx = new InitialContext(connectionProperties);
QueueConnectionFactory queueConnectionFactory = (QueueConnectionFactory) ctx.lookup(โMyConnectionFactoryโ);
34
JMS Exception Handling
โข Root class: JMSException
35
Point-to-Point JMS ์์ ์ฝ๋
1. JNDI์์ ConnectionFactory lookup2. ConnectionFactory๋ฅผ์ด์ฉํ์ฌ Connection๊ฐ์ฒด์์ฑ
3. Connection์์ด์ฉํ์ฌ Session ๊ฐ์ฒด์์ฑ4. JNDI์์ Queue ๋๋ Topic lookup5. Session ๊ณผ Queue ๋๋ Topic ์์ด์ฉํ์ฌ
MessageProducer ๋๋ MessageConsumer ์์ฑ
6. Connection ์์
36
Point-to-Point JMS Example Code
Preparing to send/receive a message to/from a Queue:
public final static String JNDI_FACTORY= "weblogic.jndi.WLInitialContextFactory";public final static String JMS_FACTORY= "javax.jms.TopicConnectionFactory"; public final static String QUEUE= "javax.jms.exampleQueue"; public void init(Context ctx, String queueName) throws NamingException, JMSException{
//1. Look up a JMS ConnectionFactory in JNDIQueueConnectionFactory qconFactory =
(QueueConnectionFactory)ctx.lookup(JMS_FACTORY); //2. Use the ConnectionFactory to create a ConnectionQueueConnection qcon = qconFactory.createQueueConnection();
//3. Use the Connection to create a SessionQueueSession qsessionSend = qcon.createQueueSession(false,
Session.AUTO_ACKNOWLEDGE);QueueSession qsessionReceive = qcon.createQueueSession(false,
Session.AUTO_ACKNOWLEDGE);
//4. Look up Queues or Topics in JNDIQueue queue = (Queue) ctx.lookup(โExampleQueueโ);
//5. Use the Session and the Queues or Topics to create message producers and consumersQueueSender qsender = qsessionSend.createSender(queue); QueueReceiver qreceiver = qsessionReceive.createReceiver(queue); qreceiver.setMessageListener(this);//6. Start the connectionqcon.start();
}
Point-to-Point JMS ์์ ์ฝ๋
Sending a message to a Queue:
publicvoid sendMsg(){
TextMessage msg = qsessionSend.createTextMessage(); msg.setText("Welcome to WebLogic JMS!"); qsender.send(msg);
}
publicvoid sendMsg(String mode){
TextMessage msg = qsessionSend.createTextMessage(); msg.setText("Welcome to WebLogic JMS!"); qsender.send(msg,DeliveryMode.PERSISTENT,Message.DEFAULT_PRIORITY
,Message.DEFAULT_TIME_TO_LIVE);
}
37
38
Point-to-Point JMS ์์ ์ฝ๋Queue๋ก๋ถํฐ๋น๋๊ธฐ๋ฉ์์ง์์
//๋น๋๊ธฐ์์ ์๋QueueReceiver์ setMessageListner๋ฅผ ํธ์ถํ์ฌ JMS์์์ ์๋ฑ๋กํ๋ค.
QueueSender qsender = qsessionSend.createSender(queue); QueueReceiver qreceiver = qsessionReceive.createReceiver(queue);
public void onMessage(Message msg) {
//Consumer asynchronous callback receive method//Implementation of javax.jms.MessageListener interfacetry {
String msgText; if (msg instanceof TextMessage) {
msgText = ((TextMessage)msg).getText(); } else { // If it is not a TextMessage...
msgText = msg.toString(); }
System.out.println("Message Received: "+ msgText ); } catch (JMSException jmse) {
jmse.printStackTrace(); }
}
39
Point-to-Point JMS ์์ ์ฝ๋Queue๋ก๋ถํฐ๋๊ธฐ(synchronous) ๋ฉ์์ง์์ โข ๋๊ธฐ์๋ฉ์์ง์์ ์์ํ์ฌ receive(), receive(long time-out),
receiveNoWait()๋ฅผ์ฌ์ฉํ๋ค.โ ๋๊ธฐ์์์ ์๋ฉ์์ง๋ฅผ์์ ํ๋๋์ํ๋์์ฐ๋ ๋๋ฅผ์ ์ ํ๊ณ ์๋ฒ์์์ Blocking ํ๋ฏ๋ก๊ฐ๊ธ์ ์ฌ์ฉ์ํ์ง๋ง๊ฒ์๊ถ์ฅํ๋ค.
โ ๋ถ๋์ดํ ๊ฒฝ์ฐ time-out๊ฐ์์ ์ฉํ receive(time-out) ์ด๋receiveNoWait() ๋ฅผ์ฌ์ฉํ ๊ฒ์๊ถ์ฅํ๋ค.
// Create a receiver to receive a message from the queue.
QueueReceiver qreceiver = qsession.createReceiver(queue);
qcon.start();
TextMessage msg = (TextMessage) qreceiver.receive(1000L);
System.out.println("Message is: " + msg.getText());
40
Point-to-Point JMS ์์ ์ฝ๋Queue๋ก๋ถํฐ๋๊ธฐ(synchronous) ๋ฉ์์ง์์ ์ ์ฒด์ฝ๋try {
Hashtable env = new Hashtable();// Lookup a connection factory and create a connection.QueueConnectionFactory qconFactory = (QueueConnectionFactory)ctx.lookup("example.QueueConnectionFactory");QueueConnection qcon = qconFactory.createQueueConnection();
// Create a session that is not transacted.QueueSession qsession =
qcon.createQueueSession(false,Session.AUTO_ACKNOWLEDGE);// Lookup a destination objectQueue queue = (Queue) ctx.lookup("example.ExampleQueue");
// Create a receiver to receive a message from the queue.QueueReceiver qreceiver = qsession.createReceiver(queue);qcon.start();//TextMessage msg = (TextMessage) qreceiver.receive();TextMessage msg = (TextMessage) qreceiver.receive(1000L);System.out.println("Message is: " + msg.getText());
} catch (Exception e) {System.out.println("Exception caught: " + e);e.printStackTrace();
}
41
JMS 1.1 ๋ฐ๋ ๊ฒ๋ค
โข PTP,Pub/Sub ๋๋ฉ์ธ์๋ํด๋์ผ API โ ๊ฐ๋จํด์งํด๋ผ์ด์ธํธํ๋ก๊ทธ๋๋ฐ๋ชจ๋ธโ PTP ์ Pub/sub ๋ฉ์์ง์๋จ์ผํธ๋์ญ์ ์ํฌํจ์ํฌ์์๋๊ธฐ๋ฅ
โข ์ด๋ฌํ๊ธฐ๋ฅ์์ด์ฉํ ๊ฒฝ์ฐ , ์ ํ๋ฆฌ์ผ์ด์ ์ํธ๋์ญ์ Session์์์ฑํํ, Queue๋ก๋ถํฐ๋ฉ์์ง๋ฅผ๋ฐ๋๊ฒ๊ณผTopic์๋ฉ์์ง๋ฅผ๋ณด๋ด๋๊ฒ์ํ๋์ํธ๋์ญ์ ์ผ๋ก์ฒ๋ฆฌํ ์์๋ค.
โข JMS 1.0.2b ์์ํธํ์ฑ์ ๊ณตโข JMS 1.1 ์ J2EE 1.4์์ผ๋ถ
42
JMS 1.1 ์์ ๋ฐ๋ ๋ด์ฉ - 1
JMS 1.0.2ConnectionFactory,Connection,Session ๊ฐ์ฒด์์ฑ
//Create a JNDI InitialContext object if none exists yet.Context jndiContext = new InitialContext();
// Look up connection factory and topic.TopicConnectionFactory topicConnectionFactory = (TopicConnectionFactory)
jndiContext.lookup("TopicConnectionFactory");
Topic topic = (Topic) jndiContext.lookup("StockQuoteTopic");
//Establish TopicConnection and TopicSessionTopicConnection topicConnection = topicConnectionFactory.createConnection();TopicSession topicSession = topicConnection.createTopicSession(false,Session.AUTO_ACKNOWLEDGE);
JMS 1.1connectionFactory = (ConnectionFactory) jndiContext.lookup("TopicConnectionFactory");topic = (Topic) jndiContext.lookup("StockQuoteTopic");//Establish Connection and Sessionconnection = connectionFactory.createConnection();session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
43
JMS 1.1 ์์ ๋ฐ๋ ๋ด์ฉ - 2MessageProducer ์์ฑJMS 1.0.2
// Create a TopicPublisher and send a message
TopicPublisher topicPublisher = null;
topicPublisher = topicSession.createPublisher(topic);message = topicSession.createTextMessage("A message body");topicPublisher.publish(message);
JMS 1.1// Create a Message Producer and send a message
MessageProducer messageProducer = null;
messageProducer = session.createProducer((Destination)topic);message = session.createTextMessage("A message body");messageProducer.send(message);
44
JMS 1.1 ์์ ๋ฐ๋ ๋ด์ฉ - 3MessageProducer ์์ฑJMS 1.0.2
// Create a TopicPublisher and send a message
TopicPublisher topicPublisher = null;
topicPublisher = topicSession.createPublisher(topic);message = topicSession.createTextMessage("A message body");topicPublisher.publish(message);
JMS 1.1// Create a Message Producer and send a message
MessageProducer messageProducer = null;
messageProducer = session.createProducer((Destination)topic);message = session.createTextMessage("A message body");messageProducer.send(message);
45
Q&A
46
resource-ref ์ฌ์ฉํ๊ธฐEJB์์๋ฉ์์ง๋ณด๋ผ๋โฆโข ๋น์ธ์คํด์ค๋ ๋ฒจ์์์ JMS ๊ฐ์ฒด์บ์ฑ.
โ Connection , Session , MessageProducer๊ฐ์ฒด๋ฅผ ejbCreate ๋ด์์์์ฑํ๋ผ.โ ๊ฐ๊ฐ์๋น์ธ์คํด์ค๊ทธ์์ฒด์์ private, non-static ๋ณ์์ํ ๋นํ๋ผ.โ ejbRemove๋ด์์ Connection, Session๋ค์ close ํ๋ผ.
โข ๊ทธ๋ฌ๋ EJB์์๋์ฐ๋ ๋๊ฐ session ๊ฐ์ฒด๋ฅผ๊ณต์ ํ์ง์๋๋ค.โข EJB๊ฐ์์ฑํธ์ถ๋์ด์ง๋๋ง๋ค, destination, connectionFactory์๋ํ
lookup ์ด๋ฐ์ํ๋ฉฐ, Connection, Session,MessageProducer๋ฑ์์์ฑํ๊ณ ,๋ฉ์์ง๋ฅผ์์ฑํ๊ณ ๋ณด๋ด์ผํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ค์ close๋ฅผํธ์ถ์ ์ฃผ์ด์ผํ๋ค.
โข ๊ทธ๋์.. Resource-ref๋ฅผ์ฌ์ฉํ ๊ฒ์๊ถ์ฅํ๋ค.โ Application Server ๊ฐ์ด๋ฌํ์ผ๋ค์๋์ ํด์ค์์๋ค.โ ๋ฒค๋์๋ฐ๋ผ์บ์ฑ๋ฑ์๋ค๋ฅด๊ฒ๊ตฌํ๋ ์์๋ค.โ ์ ํ๋ฆฌ์ผ์ด์ ์์ด์์ฑ์๋์ฌ์ค์์๋ค. โ EJB ์ Servlet ์์๋ง์ ์ฉ๊ฐ๋ฅ..
โข Servlet์๋ฉํฐ์ฐ๋ ๋์ด๋ฏ๋ก JMS ๊ด๋ จ์ฝ๋๋ฅผ ๊ณตํตํด๋์ค์๋๊ณ ๊ณต์ ํ๋๋กํ์.
47
resource-ref ์ฌ์ฉํ๊ธฐ
public void sendAMessage() {
InitialContext c = new InitialContext();
Queue q = c.lookup(โjava.comp/env/jms/MYQUEUEโ);
QueueConnectionFactory qcf = c.lookup(โjava:comp/env/jms/QCFโ);
c.close();
QueueConnection conn = qcf.createQueueConnection();
try {
QueueSession session = conn.createQueueSession(true, 0);
QueueSender sender = session.createQueueSender(q);
TextMessage msg = session.createTextMessage(โHello, World!โ);
sender.send(msg);
} finally {
conn.close();
โฆ
}
}
48
<ejb-jar><enterprise-beans><message-driven><ejb-name>MsgProcessBean</ejb-name><ejb-class>wwtt.jms.mdb.MsgProcessBean</ejb-class><transaction-type>Container</transaction-type><message-driven-destination><destination-type>javax.jms.Queue</destination-type>
</message-driven-destination><env-entry><env-entry-name>jms/props/debug</env-entry-name><env-entry-type>java.lang.Boolean</env-entry-
type><env-entry-value>true</env-entry-value></env-entry><resource-ref><res-ref-name>jms/qcf</res-ref-name><res-type>javax.jms.QueueConnectionFactory</res-type><res-auth>Container</res-auth><res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref><resource-env-ref><resource-env-ref-name>jms/OutQueue</resource-env-ref-name><resource-env-ref-type>javax.jms.queue</resource-env-ref-type>
</resource-env-ref></message-driven>
</enterprise-beans><assembly-descriptor><container-transaction><method><ejb-name>MsgProcessBean</ejb-name><method-name>*</method-name>
</method><trans-attribute>Required</trans-attribute>
</container-transaction></assembly-descriptor>
</ejb-jar>
ejb-jar.xml
49
resource-ref ์ฌ์ฉํ๊ธฐ์ resource-ref๋ฅผ์ฌ์ฉํ๋๊ฐ?โข ๋ฐฐ์น๋์คํฌ๋ฆฝํฐ๋ณ๊ฒฝ๋ง์ผ๋ก ..
โ The JMS providerโ The JMS destinationโ The transaction context
โข ์์ค์ฝ๋๋ณ๊ฒฝ์ดํ์์๋ค.โข XAConnectionFactory ์ฌ์ฉ์๋ํด๊ฑฑ์ ํ ํ์๊ฐ์๋ค.โข EJB ์ปจํ ์ด๋๊ฐ๋๋ง์์ผ๋ค์ํ๋๋กํจ.โข WebLogic Server 8.1 ์๊ฒฝ์ฐ
โ JMS Connection , Session , MessageProducer ๊ฐ์ฒด์์๋ํ๋ํ๋ง๊ธฐ๋ฅ
โ JMS Provider๊ฐ down ๋์์๊ฒฝ์ฐ์๋์ฌ์ฐ๊ฒฐโ ํ์ฌํธ๋์ญ์ ์๊ฐ์ง XA ํธํ JMS ํ๋ก๋ฐ์ด๋์์๋์ฐธ์ฌ.
50
ํธ๋์ญ์ ์๋ ์ฐธ์ฌ.
Session beanX
Session beanYClient
WebLogic EJB Container
1.
2. 3.
4.
5.
Database AQueue A database B
โขํ๋ก๊ทธ๋๋จธ๋ํธ๋์ญ์ ๊ด๋ จ์ฝ๋์์ฑ์ดํ์์๋ค.โข๋จ์ผํธ๋์ญ์ ์ฒ๋ฆฌ.โขํธ๋์ญ์ ์ด์ปค๋ฐ(commit)๋ ๋, 3๊ฐ์์์์๋ํ update๋ฅผ๋ณด์ฅํ๊ธฐ์ํด
WebLogic EJB ์ปจํ ์ด๋์๋ฉ์์ง, ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ 2PC๋ฅผ์ํํ๋ค.
51
JMS ๋ฉ์์ง ์์ MDB๋ฅผ์ด์ฉํ๋ผ.โข ๊ฐ๋ฅํ๋ค๋ฉด, ๋๋๋ก MDB๋ฅผ์ฌ์ฉํ๋ผ.
โ ์ด๋์ปจํ ์ด๋๊ฐ์ธํ๋ผ์ ์ธ(middleware) ์์ ์์ํํ๋๋กํ๊ธฐ์ํจ์ด๋ค.
โข ์คํจํํ๋ก๋ฐ์ด๋์๋ํ์ฌ์ฐ๊ฒฐโข ํธ๋์ญ์ โข ์ฐ๋ ๋๊ด๋ฆฌ
โข MDB๋ฅผ์ฌ์ฉํ ์์๋ค๋ฉด:โ EJB์์๋ธ๋ฆฟ์ โreceiveโ๋ฉ์๋๋ฅผ์ด์ฉํ์ฌ๋๊ธฐ์ ์ผ๋ก๋ฐ์์์๋ค.
โ EJB์์๋ธ๋ฆฟ๋ค์๋น๋๊ธฐ์ ์ผ๋ก๋ฉ์์ง๋ฅผ์์ ํ๊ธฐ์ํ์ฌJMS MessageListener ์ธํฐํ์ด์ค๋ฅผ์ฌ์ฉ์๊ถ์ฅํ์ง์๋๋ค.
โข ์ปจํ ์ด๋์์ํ EJB ๊ฐ์ฒด์ํ๋ง์๊ฐ์ง์ธํฐํ์ด์ค์ด๋ฏ๋ก..โข J2EE ์คํ์์์์ด๊ฒ์ํ๋ฝํ์ง์๋๋ค.โข ์ด๋ค๋ฒค๋๋ค์์ด๊ฒ์์๋ํ ๊ฒฝ์ฐ exception์๋์ง๋ค..
52
JMS ๋ฉ์์ง ์์ ์์ ์ฝ๋public class MessageTraderBean implements MessageDrivenBean, MessageListener {
private static final boolean VERBOSE = true;private MessageDrivenContext m_context;private int m_tradeLimit;
public void ejbActivate() {}public void ejbRemove() {}public void ejbPassivate() {}
public void setMessageDrivenContext(MessageDrivenContext ctx) {m_context = ctx;
}
public void ejbCreate () throws CreateException {}
public void onMessage(Message msg) {TextMessage tm = (TextMessage) msg;try {String text = tm.getText();log("Received new quote : " + text);
} catch(JMSException ex) {ex.printStackTrace();
}}}
53
JMS ๋ฉ์์ง ์์ ejb-jar.xml<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd"><ejb-jar><enterprise-beans>
<message-driven><ejb-name>exampleMessageDriven1</ejb-name><ejb-class>examples.ejb20.message.MessageTraderBean</ejb-class><transaction-type>Container</transaction-type><message-driven-destination><destination-type>javax.jms.Topic</destination-type>
</message-driven-destination></message-driven>
</enterprise-beans></ejb-jar>
<weblogic-ejb-jar><weblogic-enterprise-bean><ejb-name>exampleMessageDriven1</ejb-name><message-driven-descriptor><pool><max-beans-in-free-pool>200</max-beans-in-free-pool> <initial-beans-in-free-pool>20</initial-beans-in-free-pool>
</pool><destination-jndi-name>quotes</destination-jndi-name>
</message-driven-descriptor><jndi-name>examplesMessageDriven1</jndi-name>
</weblogic-enterprise-bean></weblogic-ejb-jar>
Vendor-specific DD
54
Request/Response MessagingUsing a Temporary Queueโข JMS ๋ฉ์์ง๋ฅผ๋ณด๋ธ๋ค์์๋ต์๊ธฐ๋ค๋ฆดํ์๊ฐ์์๋์์ํ(Temporary Queue)๋ฅผ์ฌ์ฉํ๋ค. ์๋ฅผ๋ค์ด , ๋ฐฑ์๋์์คํ ์๋ฉ์์ง๋ฅผ๋ณด๋ด๊ณ ๋ฐ๋์๊ฒ์ฆ์๋ฐ์์ผํ ๊ฒฝ์ฐ๋ฑ..
โข ์์๋ชฉ์ ์ง๋ JMS ์ ํ๋ฆฌ์ผ์ด์ ์ด๋์ ์ผ๋ก์ผ์์ ์ธ๋ชฉ์ ์ง๋ฅผ์์ฑํ๋๊ฒ์ด๋ค. ์์๋ชฉ์ ์ง๋์์คํ ์ฅ์ ์๊ณ์์กด์ฌํ ์์๊ธฐ๋๋ฌธ์๋ฉ์์ง์์ค์ด๋ฐ์ํ ์๋์๋ค.
โข Sender๋์๋ต์์์งํ๊ธฐ์ํ์ฌ โTemporaryQueueโ๊ฐ์ฒด๋ฅผ์์ฑํ๋ค. โ TemporryQueue tmpQueue = session.createTemporaryQueue();โ Queue ํด๋์ค๋ฅผํ์ฅํ์ฌ๋จ์ง delete() ๋ฉ์ฐ๋๋ง์์ถ๊ฐํ๊ฒ์ด๋ค.
โข Sender๋ฅผ โreplyToโํ๋๋ด์ โTemporary queueโ๋ฅผ๊ฐ์ง๊ณ ๋ฉ์์ง๋ฅผ๋ณด๋ธ๋ค. โข Sender๋ temporay queue ์์์๋ต์๊ธฐ๋ค๋ฆฐ๋ค.โข Sender ์ Recipient๋ฅผ๋ชจ๋ resource-ref๋ฅผ์ฌ์ฉํด์ผ๋งํ๋ค. โข JMS ํด๋ผ์ด์ธํธ๋์์๋ชฉ์ ์ง์์ ์ด๋๋๋ฉด delete()๋ฅผํธ์ถํ์ฌ์์์๋ฐํํ๋ค.
55
Request/Response MessagingUsing a Temporary Queue
/* ์ค๋๊ฑธ๋ฆฌ๋์์ ์ด๋ฏ๋ก , EJB์์์ฌ์ฉํ ๊ฒฝ์ฐ ejbCreate() ๋ฉ์๋๋ฑ์์์ฌ์ฉํ๊ธฐ๋ฅผ๊ถ์ฅ */TemporaryQueue tempQueue= session.createTemporaryQueue();TextMessage msg = session.createTextMessage();msg.setStringProperty(โ โ , );msg.setText(โThis is sending messageโ);
// set the JMSReplyTo for the receiptโฆmsg.setJMSReplyTo(tempQueue);
// send message..sender.send(msg);
QueueReceiver receiver = session.createReceiver(tempQueue);
/* ์๋ต์์์ ํ ๋๊น์ง์ฐ๋ ๋๋๋ธ๋ญํน๋์ด์ง๋ค. */Message receipt = receiver.receive(1000L);
56
๋ฉ์์ง ์์ ๋ณด์ฅCorrelationID๋ฅผ์ฌ์ฉํ๋ผ.public class MsgProcessBean extends GenericMessageDrivenBean implements MessageDrivenBean, MessageListener{
public void onMessage(Message msg) { printTxID("MsgProcessBean onMessage TxID is: ");String msgText = "";try{
correlationID = msg.getJMSCorrelationID();log("The JMS correlationID is from the message is: " + correlationID);if (msg instanceof TextMessage)
msgText = ((TextMessage)msg).getText(); log("MDB just got message:" + msgText + " from requestID " + correlationID);msgText = "This is the reply to " + msgText + " from requestID " + correlationID;
} catch (JMSException jmse) {jmse.printStackTrace();
}try { reply(msgText); } catch (Exception ex) { ex.printStackTrace(); }
}private void reply(String replyText) throws RemoteException {
javax.jms.QueueConnection connection = qcf.createQueueConnection();try {
QueueSession session = connection.createQueueSession(transacted, Session.AUTO_ACKNOWLEDGE);QueueSender sender = session.createSender(outQueue);replyMsg = session.createTextMessage(replyText);replyMsg.setJMSCorrelationID(correlationID);
sender.send(replyMsg, delivery_mode, 9, 0);}
57
MessageSelector
โข Consumer๋ค์์ ์ก๋๋ฉ์์ง๋ค์ค์์์ผ๋ถ๋ง๋ฐ๊ธฐ๋ฅผ์ํ๋๊ฒฝ์ฐ๋์๋ค. ์ด๋ฌํ consumer๋ฅผ์ํด๋ฉ์์ง๋ฅผ์๋์ผ๋กํํฐ๋งํ๋ํ์ค๋ฉ์์ง๋ถ๋ณ๊ธฐ(selector)๋ฅผ์ฌ์ฉํ์.
โข ํํฐ๋ง์๋ฉ์์ง๊ฐ consumer์๊ฒ์ ์ก๋๊ธฐ์ ์ JMS ์์์ํ๋๋ค.
โข JMS ํํ์์์ด์ฉํ์ฌ์์ฑํ๋ค. โข ๋ฉ์์งํค๋์์์ฑ๋ค์๋ํ์ฌ์ ์ฉํ๋ค. โข ํํ์์ด์ฐธ์ด๋ฉด๋ฉ์์ง๋ consumer์๊ฒ์ ์ก๋๋ค.
Receiver = session.createReceiver(messageQueue, โJMSPriority > 5โ);
58
Best-Practice
โข ๋ถํ์ํ๋ฉ์์ง์์ฑ์ง์ ํ์ง๋ง๊ฒโข MessageSelector๋ฅผ์ฌ์ฉํ๋ผ.โข ๊ฐ๋ฅํํ๋น๋๊ธฐ๋ฉ์์ง๋ฅผ์ฌ์ฉํ๋ผ.โข Resource-ref๋ฅผ์ฌ์ฉํ๋ผ.โข ์๋ชป๋๋ฉ์์ง๋์๋ฌ Destination ์ผ๋ก๋ณด๋ด์ํ์ฒ๋ฆฌํ๋ผ.
59
Q&A , Demo