Transcript
Page 1: JMS Technical Training - cfile23.uf.tistory.com

JMS Technical Training

DaeJung KimSenior Consultant

BEA Systems Korea.October, 2004

Page 2: JMS Technical Training - cfile23.uf.tistory.com

2

๋ชฉ์ฐจ

1. ๋ฉ”์‹œ์ง•๋ฏธ๋“ค์›จ์–ด

2. ๊ธฐ๋ณธ JMS API ๊ฐœ๋…

3. JMS 1.0 API ๊ฐœ์š”

Page 3: JMS Technical Training - cfile23.uf.tistory.com

3

๋ถ„์‚ฐ ๋ฏธ๋“ค์›จ์–ด ์ข…๋ฅ˜

โ€ข ๋ฆฌ๋ชจํŠธํ”„๋กœ์‹œ์ €ํ˜ธ์ถœ (RPC)โ€“ ๋™๊ธฐโ€“ ํƒ€๊ฒŸ์‹œ์Šคํ…œ์ƒ์˜ EJBBeans, Corba Service๋“ฑ์˜๋ฉ”์˜๋“œ/ํ”„๋กœ์‹œ์ €๋ฅผ์ง์ ‘ํ˜ธ์ถœ

โ€“ ํด๋ผ์ด์–ธํŠธ์™€์„œ๋ฒ„๊ฐ€๋ฐ€์ ‘ํ•˜๊ฒŒ coupled ๋˜์–ด์žˆ์Œ.

โ€ข ๋ฉ”์‹œ์ง€๊ธฐ๋ฐ˜๋ฏธ๋“ค์›จ์–ด (MOM) โ€“ ๋น„๋™๊ธฐ (and synchronous)โ€“ ํ”„๋กœ์‹œ์ €๋ฅผํ˜ธ์ถœํ•˜๊ธฐ์œ„ํ•ด๋ฉ”์‹œ์ง€๋ฅผํƒ€๊ฒŸ์‹œ์Šคํ…œ์—์ „๋‹ฌ

โ€“ ํด๋ผ์ด์–ธํŠธ์™€์„œ๋ฒ„๊ฐ€๋ถ„๋ฆฌ๋œํ˜•ํƒœ

Needs Work

Does Work

Needs Work

Does Work

Queue

Producer

Consumer

Page 4: JMS Technical Training - cfile23.uf.tistory.com

4

๋ฉ”์‹œ์ง•์ด๋ž€?

โ€ข ๋ฉ”์‹œ์ง•์€ํ”„๋กœ๊ทธ๋žจ๋˜๋Š”์†Œํ”„ํŠธ์›จ์–ด์ปดํฌ๋„ŒํŠธ๊ฐ€์„œ๋กœํ†ต์‹ ํ•˜๊ธฐ์œ„ํ•œ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด๋‹ค.โ€“ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ฐ„ ๋น„๋™๊ธฐํ†ต์‹ โ€“ ์ธํ„ฐํŽ˜์ด์Šค์™€๊ตฌํ˜„์˜๋ถ„๋ฆฌโ€“ ํด๋ผ์ด์–ธํŠธ, ๋ฉ”์‹œ์ง•์„œ๋ฒ„, ๋ฉ”์‹œ์ง€๋กœ๊ตฌ์„ฑ.

Page 5: JMS Technical Training - cfile23.uf.tistory.com

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

Page 6: JMS Technical Training - cfile23.uf.tistory.com

6

๋ฉ”์‹œ์ง• ์‚ฌ์šฉ์˜ ์žฅ์ 

โ€ข ํด๋ผ์ด์–ธํŠธ์‘๋‹ต์‹œ๊ฐ„ํ–ฅ์ƒโ€“ ์‘๋‹ต์„๊ธฐ๋‹ค๋ฆฌ์ง€์•Š์œผ๋ฏ€๋กœ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€์ฒ˜๋ฆฌ๋ฅผ๊ณ„์†ํ• ์ˆ˜์žˆ๋‹ค.

โ€ข ํ™•์žฅ์„ฑํ–ฅ์ƒโ€“ ์†Œ๋น„์ž(Consumer)๋Š”์‹œ์Šคํ…œ์—ฌ์œ ๊ฐ€์žˆ์„๋•Œ/ ๋ฉ”์‹œ์ง€์ฒ˜๋ฆฌ๊ฐ€๊ฐ€๋Šฅํ• ๋•Œ์‘๋‹ตํ• ์ˆ˜์žˆ๋‹ค.

โ€ข ๊ฐ€์šฉ์„ฑํ–ฅ์ƒโ€“ ์ฒ˜๋ฆฌ์‹œ๊ฐ„์ด์˜ค๋ž˜๊ฑธ๋ฆฌ๋Š”์ž‘์—…์€์—ฌ๋Ÿฌ๊ฐœ์˜ํŠธ๋žœ์žญ์…˜์œผ๋กœ๋‚˜์šฐ์–ด์ฒ˜๋ฆฌํ• ์ˆ˜์žˆ๋‹ค.

โ€ข ์œ ์ง€๊ด€๋ฆฌํ–ฅ์ƒโ€“ ์„œ๋ฒ„๊ตฌํ˜„์ด๋ณ€๊ฒฝ๋˜์—ˆ์„๋•Œ๊ฑฐ์˜๋ณ€๊ฒฝ์—†์ด์ ์šฉ๊ฐ€๋Šฅํ•˜๋‹ค.

โ€ข ์‹ ๋ขฐ์„ฑํ–ฅ์ƒโ€“ ์„ ํƒ์ ์œผ๋กœ๋ฉ”์‹œ์ง€๋ฅผ์˜๊ตฌ์ €์žฅ์†Œ(persistent store)์—์ €์žฅํ•จ์œผ๋กœ์„œ์–ธ์ œ๋ผ๋„๋ฉ”์‹œ์ง€์ „๋‹ฌ์„๋ณด์žฅํ• ์ˆ˜์žˆ๋‹ค.

โ€“ ํด๋ผ์ด์–ธํŠธ๊ฐ€์—ฐ๊ฒฐ๋˜์–ด์žˆ์ง€์•Š์„๊ฒฝ์šฐ์ผ๋‹จ๋ฉ”์‹œ์ง€๋ฅผ์ €์žฅํ•˜๊ณ ํด๋ผ์ด์–ธํŠธ๊ฐ€์ ‘์†๋˜๋ฉด๋ฉ”์‹œ์ง€๋ฅผ์ „๋‹ฌํ• ์ˆ˜์žˆ๋‹ค.

Page 7: JMS Technical Training - cfile23.uf.tistory.com

7

MOM ์œ ์ € ์ผ€์ด์Šค

โ€ข ์›Œํฌํ”Œ๋กœ์šฐ / ํ”„๋กœ์„ธ์Šคโ€ข ๋„คํŠธ์›๊ด€๋ฆฌโ€ข ํ†ต์‹ ์„œ๋น„์Šคโ€ข ๊ณ ๊ฐ๊ด€๋ฆฌโ€ข ๊ณต๊ธ‰์ฒด์ธ๊ด€๋ฆฌโ€ข ๊ธฐ์—…์˜์‚ฐ์žฌํ•œํ†ตํ•ฉ

Page 8: JMS Technical Training - cfile23.uf.tistory.com

8

๋ชฉ์ฐจ

1. ๋ฉ”์‹œ์ง•๋ฏธ๋“ค์›จ์–ด

2. ๊ธฐ๋ณธ JMS API ๊ฐœ๋…

3. JMS 1.0 API ๊ฐœ์š”

Page 9: JMS Technical Training - cfile23.uf.tistory.com

9

What is Java Messaging Service?

โ€ข JMS๋Š”์ž๋ฐ”/J2EE ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„์œ„ํ•œ์ž๋ฐ”ํ‘œ์ค€์—”ํ„ฐํ”„๋ผ์ด์ฆˆ๋ฉ”์‹œ์ง•์„œ๋น„์Šค์ด๋‹ค. โ€“ ํ‘œ์ค€ API , ๋ฒค๋”์ค‘๋ฆฝ API ( javax.jms )โ€“ ๋ถ„์‚ฐํ™˜๊ฒฝ์—์„œ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ปดํฌ๋„ŒํŠธ๋“ค๊ฐ„์—๋ฉ”์‹œ์ง€๋ฅผ๋ผ์šฐํŒ…ํ•˜๋Š”์ง€๋Šฅ์ ์ธ๊ตํ™˜๊ธฐ์—ญํ• ๋‹ด๋‹น

MOMSystem

ApplicationA

ApplicationB

Message Message

Page 10: JMS Technical Training - cfile23.uf.tistory.com

10

์–ธ์ œ JMS API๋ฅผ ์‚ฌ์šฉํ• ์ˆ˜ ์žˆ๋Š”๊ฐ€?

โ€ข ์ปดํฌ๋„ŒํŠธ๊ฐ€๋‹ค๋ฅธ์ปดํฌ๋„ŒํŠธ์˜์ธํ„ฐํŽ˜์ด์Šค์—๋Œ€ํ•œ์˜์กด์„ฑ์„๋ฐฐ์ œํ•˜๊ณ ์žํ• ๋•Œ, ๊ทธ๋ž˜์„œ์ปดํฌ๋„ŒํŠธ๊ฐ€์‰ฝ๊ฒŒ๋Œ€์น˜(replace) ๋ ์ˆ˜์žˆ๋„๋กํ• ๋•Œ..

โ€ข ๋ชจ๋“ ์ปดํฌ๋„ŒํŠธ๊ฐ€ up์ด๊ฑฐ๋‚˜๋™์‹œ์—์ˆ˜ํ–‰๋˜์ง€์•Š์•„๋„์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„์ˆ˜ํ–‰ํ•˜๊ณ ์žํ• ๋•Œ.. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด .. ๋ชจ๋“ ์ปดํฌ๋„ŒํŠธ๊ฐ€ up ์ด๊ณ  running ๋™์‹œ์— running ์ด์•„๋‹ˆ์–ด๋„๋ ๋•Œ..

โ€ข ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋น„์ฆˆ๋‹ˆ์Šค๋ชจ๋ธ์ด ๋‹ค๋ฅธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์ •๋ณด๋ฅผ๋ณด๋‚ด๊ณ ์ฆ‰์‹œ์‘๋‹ต์„๋ฐ›์ง€์•Š๊ณ ๋‹ค๋ฅธ์ž‘์—…์„์ˆ˜ํ–‰ํ•œํ›„๋ฉ”์‹œ์ง€๋ฅผ๋ฐ›์•„์ฒ˜๋ฆฌํ•˜๊ณ ์žํ• ๋•Œ..

Page 11: JMS Technical Training - cfile23.uf.tistory.com

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 ์ŠคํŽ™๊ตฌํ˜„

Page 12: JMS Technical Training - cfile23.uf.tistory.com

12

JMS API ์•„ํ‚คํ…์ฒ˜

JMSProvider

JMSClients

AdministrationTool

CF D

JMSClients

JMSClients

JMSClients

Connection

Message

Lookup

Bind

*CF : ConnectionFactory* D : Destination

Page 13: JMS Technical Training - cfile23.uf.tistory.com

13

๋ฉ”์‹œ์ง• ๋„๋ฉ”์ธ ํƒ€์ž…

โ€ข JMS ๋„๋ฉ”์ธโ€“ point-to-pointโ€“ publish/subscribe

Sender Receiver

Publisher

Subscriber 1

Subscriber 1

Subscriber 1

Page 14: JMS Technical Training - cfile23.uf.tistory.com

Point-to-Point (PTP) ๋ฉ”์‹œ์ง• ๋„๋ฉ”์ธ

โ€ข ๊ฐ๋ฉ”์‹œ์ง€๋ฅผ๋‹จํ•˜๋‚˜์˜๋ฉ”์‹œ์ง€์†Œ๋น„์ž(consumer)์—๊ฒŒ์ „์†กํ•œ๋‹ค.โ€ข ๋ฉ”์‹œ์ง€์ˆ˜์‹ ์ž(receiver)๋Š” Queue์—๋ฉ”์‹œ์ง€๊ฐ€์กด์žฌํ• ๊ฒฝ์šฐ์–ธ์ œ๋“ ์ง€ ๋ฉ”์‹œ์ง€๋ฅผ๊ฐ€์ ธ์˜ฌ์ˆ˜์žˆ๋‹ค. โ€“ ๋ฉ”์‹œ์ง€์ˆ˜์‹ ์‹œ์‹œ๊ฐ„์˜์ข…์†์„ฑ์ด์—†์Œ.

QueueSender AReceiver BSends

Consumes

AcknowledgesSender B

Receiver A

14

Page 15: JMS Technical Training - cfile23.uf.tistory.com

15

Publish/Subscribe (Pub/Sub) ๋ฉ”์‹œ์ง• ๋„๋ฉ”์ธ

โ€ข ๊ฐ๋ฉ”์‹œ์ง€๋Š”ํ•˜๋‚˜์ด์ƒ์˜๋ฉ”์‹œ์ง€์†Œ๋น„์ž(consumer)์—์˜ํ•ด์ฒ˜๋ฆฌ๋œ๋‹ค.

โ€ข ์˜๊ตฌ์ ๊ตฌ๋…(durable subscription)์ด์„ค์ •๋˜์–ด์žˆ์ง€์•Š์„๊ฒฝ์šฐ , ๋ฉ”์‹œ์ง€์ˆ˜์‹ ์€ ์‹œ๊ฐ„์—์ข…์†์ ์ด๋‹ค.

PublisherA

Subscriber B

Publishes

SubscribesDelivers

TopicSubscribes

Delivers

Subscriber A

PublisherB

Page 16: JMS Technical Training - cfile23.uf.tistory.com

16

์˜๊ตฌ์  ๊ตฌ๋…์ž(Durable Subscribers)

โ€ข ๊ฒฝ์šฐ์—๋”ฐ๋ผ์„œํด๋ผ์ด์–ธํŠธ๊ฐ€์žฌ์ ‘์†๋˜์—ˆ์„๋•Œ , ํ† ํ”ฝ๋ฉ”์‹œ์ง€๋ฅผ์žฌ์ „์†ก๋ฐ›์•„์•ผ๋งŒํ•˜๋Š”๊ฒฝ์šฐ๊ฐ€์žˆ๋‹ค. ์ด๋•Œdurable topic subscriptions์„์‚ฌ์šฉํ•œ๋‹ค.

โ€ข JMS ํ† ํ”ฝ์—๋งŒํ•ด๋‹น๋œ๋‹ค.โ€ข Publisher๋Š”๋ฐ˜๋“œ์‹œ์‹๋ณ„์ž๋ฅผ์ œ๊ณตํ•ด์•ผํ•œ๋‹ค.

โ€“ ํด๋ผ์ด์–ธํŠธ๊ฐ€ JMS Provider์—์žฌ์ ‘์†ํ–ˆ์„๋•Œ ,JMS๊ฐ€์ฒ˜๋ฆฌ์•ˆ๋œ๋ฉ”์‹œ์ง€๋“ค์„์‹๋ณ„ํ• ์ˆ˜์žˆ๋„๋กํ•˜๊ธฐ์œ„ํ•ด์„œ์ด๋‹ค.

โ€ข JMS provider๋Š” durable subscriber์—๋Œ€ํ•˜์—ฌ๋ฉ”์‹œ์ง€๋ฏธ์ˆ˜์‹ ์‹œ๋ฉ”์‹œ์ง€๋ฅผ์ €์žฅํ•œ๋‹ค.

Page 17: JMS Technical Training - cfile23.uf.tistory.com

17

๋ชฉ์ฐจ

1. ๋ฉ”์‹œ์ง•๋ฏธ๋“ค์›จ์–ด

2. ๊ธฐ๋ณธ JMS API ๊ฐœ๋…

3. JMS 1.0 API ๊ฐœ์š”

Page 18: JMS Technical Training - cfile23.uf.tistory.com

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

Page 19: JMS Technical Training - cfile23.uf.tistory.com

19

JMS API Programming Model

Page 20: JMS Technical Training - cfile23.uf.tistory.com

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

Page 21: JMS Technical Training - cfile23.uf.tistory.com

21

Message Headers

Page 22: JMS Technical Training - cfile23.uf.tistory.com

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 ๋ฉ”์‹œ์ง€๋ฅผ์žฌ์ „์†กํ• ๋•Œ.

Page 23: JMS Technical Training - cfile23.uf.tistory.com

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โ€ );

Page 24: JMS Technical Training - cfile23.uf.tistory.com

24

๋ฉ”์‹œ์ง€ ํƒ€์ž…

โ€ข Streamโ€“ Stream of Java primitive valuesโ€“ ๊ฐ์ฒด๋Š”๋ฐ˜๋“œ์‹œ์“ฐ์—ฌ์ง„์ˆœ์„œ๋Œ€๋กœ์ฝํ˜€์ ธ์•ผํ•œ๋‹ค.

โ€ข Mapโ€“ ์ด๋ฆ„๊ณผ๊ฐ’์˜์Œ

โ€“ ๊ฐ๊ฐ์˜์ด๋ฆ„์ด๋งต์—์„œ๊ณ ์œ ํ•œ๊ฐ’์„๊ฐ€์ง.โ€“ ์—”ํŠธ๋ฆฌ์˜์ˆœ์„œ๋Š”์—†์Œ.

โ€ข Textโ€“ String ์ธ์Šคํ„ด์Šคโ€“ XML ๋ฌธ์„œ์ง€์›

โ€ข WebLogic JMS ์—์„œ์ดํƒ€์ž…์„ํ™•์žฅํ•˜์—ฌ XMLMessage ํƒ€์ž…์„๋งŒ๋“ฌ. โ€ข Object

โ€“ ์ง๋ ฌํ™”๊ฐ€๊ฐ€๋Šฅํ•œ๊ฐ์ฒด

โ€ข Bytesโ€“ Raw ๋ฐ”์ดํŠธ์ŠคํŠธ๋ฆผโ€“ Raw ๋ฉ”์‹œ์ง€ํ˜•์‹์„์‚ฌ์šฉํ•˜๋Š”ํด๋ผ์ด์–ธํŠธ์—์„œ์ด๋ฉ”์‹œ์ง€ํƒ€์ž…์‚ฌ์šฉ..

Page 25: JMS Technical Training - cfile23.uf.tistory.com

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

Page 26: JMS Technical Training - cfile23.uf.tistory.com

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

Page 27: JMS Technical Training - cfile23.uf.tistory.com

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

Page 28: JMS Technical Training - cfile23.uf.tistory.com

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

Page 29: JMS Technical Training - cfile23.uf.tistory.com

29

What is a Session?

โ€ข Session์€ producer ์™€ consumer๊ฐ„๋Œ€ํ™”์ƒํƒœ(conversional state)๋ฅผ์œ ์ง€ํ•˜๋ฉฐ์‹ค์ œ๋ฉ”์‹œ์ง€์˜๊ตํ™˜์„๊ด€๋ฆฌํ•œ๋‹ค.

โ€ข Producer, Consumer ๋ฐ๋ฉ”์‹œ์ง€๋ฅผ์ƒ์„ฑํ•œ๋‹ค. โ€ข Session์€์‹ฑ๊ธ€์“ฐ๋ ˆ๋“œ๋ชจ๋ธ์ด๋ฏ€๋กœ ๋™์‹œ์‚ฌ์šฉ์„์ง€์›ํ•˜์ง€์•Š๋Š”๋‹ค.

โ€ข Connection์—๋‹ค์Œ๊ณผ๊ฐ™์€๊ธฐ๋Šฅ์„์ถ”๊ฐ€ํ• ์ˆ˜์žˆ๋‹ค.โ€“ ์ƒ์„ฑ๋˜๋Š”(produced) ๋ฉ”์‹œ์ง€์™€์†Œ๋น„๋˜๋Š”(consumed) ๋ฉ”์‹œ์ง€์˜์ˆœ์„œ์ •์˜

โ€“ ๋น„๋™๊ธฐ consumer์˜๋ฆฌ์Šค๋„ˆ๋ฉ”์˜๋“œ ํ˜ธ์ถœ

โ€“ ๋ฉ”์‹œ์ง€์ „๋‹ฌ๋ณด์žฅ(Guaranteed Delivery)

Page 30: JMS Technical Training - cfile23.uf.tistory.com

30

Guaranteed Messaging - Two Types of Sessions

โ€ข ๋ฉ”์‹œ์ง€ํ™•์ธ(acknowledgement) ์„ธ์…˜QueueSession ackQueueSession =

queueConnection.createQueueSession(false, acknowledgement)

โ€ข ํŠธ๋žœ์žญ์…˜์„ธ์…˜QueueSession transactedQueueSession =

queueConnection.createQueueSession(true, 0)

ํŠธ๋žœ์žญ์…˜์„ธ์…˜์—์„œ๋Š”acknowledgement ๋ชจ๋“œ๊ฐ€๋ฌด์‹œ๋จ. โ€œ0โ€์œผ๋กœ์„ค์ •ํ•˜๋Š”๊ฒƒ์„๊ถŒ์žฅํ•จ.

Page 31: JMS Technical Training - cfile23.uf.tistory.com

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์—๊ฒŒ์ „๋‹ฌํ•จ.

Page 32: JMS Technical Training - cfile23.uf.tistory.com

32

์ ๋‹นํ•œ ํ™•์ธ ๋ชจ๋“œ๋Š” ๋ฌด์—‡์ธ๊ฐ€?

QueueSession qsessionSend = qcon.createQueueSession(false, /* ๋น„ํŠธ๋žœ์žญ์…˜์„ธ์…˜ */ Session.AUTO_ACKNOWLEDGE);

QueueSession qsessionReceive = qcon.createQueueSession(false,Session.AUTO_ACKNOWLEDGE);

Page 33: JMS Technical Training - cfile23.uf.tistory.com

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โ€);

Page 34: JMS Technical Training - cfile23.uf.tistory.com

34

JMS Exception Handling

โ€ข Root class: JMSException

Page 35: JMS Technical Training - cfile23.uf.tistory.com

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 ์‹œ์ž‘

Page 36: JMS Technical Training - cfile23.uf.tistory.com

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();

}

Page 37: JMS Technical Training - cfile23.uf.tistory.com

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

Page 38: JMS Technical Training - cfile23.uf.tistory.com

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(); }

}

Page 39: JMS Technical Training - cfile23.uf.tistory.com

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());

Page 40: JMS Technical Training - cfile23.uf.tistory.com

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();

}

Page 41: JMS Technical Training - cfile23.uf.tistory.com

41

JMS 1.1 ๋ฐ”๋€ ๊ฒƒ๋“ค

โ€ข PTP,Pub/Sub ๋„๋ฉ”์ธ์—๋Œ€ํ•ด๋™์ผ API โ€“ ๊ฐ„๋‹จํ•ด์ง„ํด๋ผ์ด์–ธํŠธํ”„๋กœ๊ทธ๋ž˜๋ฐ๋ชจ๋ธโ€“ PTP ์™€ Pub/sub ๋ฉ”์‹œ์ง•์„๋‹จ์ผํŠธ๋žœ์žญ์…˜์—ํฌํ•จ์‹œํ‚ฌ์ˆ˜์žˆ๋Š”๊ธฐ๋Šฅ

โ€ข ์ด๋Ÿฌํ•œ๊ธฐ๋Šฅ์„์ด์šฉํ• ๊ฒฝ์šฐ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ํŠธ๋žœ์žญ์…˜Session์„์ƒ์„ฑํ•œํ›„, Queue๋กœ๋ถ€ํ„ฐ๋ฉ”์‹œ์ง€๋ฅผ๋ฐ›๋Š”๊ฒƒ๊ณผTopic์—๋ฉ”์‹œ์ง€๋ฅผ๋ณด๋‚ด๋Š”๊ฒƒ์„ํ•˜๋‚˜์˜ํŠธ๋žœ์žญ์…˜์œผ๋กœ์ฒ˜๋ฆฌํ• ์ˆ˜์žˆ๋‹ค.

โ€ข JMS 1.0.2b ์™€์˜ํ˜ธํ™˜์„ฑ์ œ๊ณตโ€ข JMS 1.1 ์€ J2EE 1.4์˜์ผ๋ถ€

Page 42: JMS Technical Training - cfile23.uf.tistory.com

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);

Page 43: JMS Technical Training - cfile23.uf.tistory.com

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);

Page 44: JMS Technical Training - cfile23.uf.tistory.com

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);

Page 45: JMS Technical Training - cfile23.uf.tistory.com

45

Q&A

Page 46: JMS Technical Training - cfile23.uf.tistory.com

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 ๊ด€๋ จ์ฝ”๋“œ๋ฅผ ๊ณตํ†ตํด๋ž˜์Šค์—๋‘๊ณ ๊ณต์œ ํ•˜๋„๋กํ•˜์ž.

Page 47: JMS Technical Training - cfile23.uf.tistory.com

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();

โ€ฆ

}

}

Page 48: JMS Technical Training - cfile23.uf.tistory.com

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

Page 49: JMS Technical Training - cfile23.uf.tistory.com

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 ํ”„๋กœ๋ฐ”์ด๋”์˜์ž๋™์ฐธ์—ฌ.

Page 50: JMS Technical Training - cfile23.uf.tistory.com

50

ํŠธ๋žœ์žญ์…˜ ์ž๋™ ์ฐธ์—ฌ.

Session beanX

Session beanYClient

WebLogic EJB Container

1.

2. 3.

4.

5.

Database AQueue A database B

โ€ขํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š”ํŠธ๋žœ์žญ์…˜๊ด€๋ จ์ฝ”๋“œ์ž‘์„ฑ์ดํ•„์š”์—†๋‹ค.โ€ข๋‹จ์ผํŠธ๋žœ์žญ์…˜์ฒ˜๋ฆฌ.โ€ขํŠธ๋žœ์žญ์…˜์ด์ปค๋ฐ‹(commit)๋ ๋•Œ, 3๊ฐœ์˜์ž์›์—๋Œ€ํ•œ update๋ฅผ๋ณด์žฅํ•˜๊ธฐ์œ„ํ•ด

WebLogic EJB ์ปจํ…Œ์ด๋„ˆ์™€๋ฉ”์‹œ์ง€, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” 2PC๋ฅผ์ˆ˜ํ–‰ํ•œ๋‹ค.

Page 51: JMS Technical Training - cfile23.uf.tistory.com

51

JMS ๋ฉ”์‹œ์ง€ ์ˆ˜์‹ MDB๋ฅผ์ด์šฉํ•˜๋ผ.โ€ข ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด, ๋˜๋„๋ก MDB๋ฅผ์‚ฌ์šฉํ•˜๋ผ.

โ€“ ์ด๋Š”์ปจํ…Œ์ด๋„ˆ๊ฐ€์ธํ”„๋ผ์ ์ธ(middleware) ์ž‘์—…์„์ˆ˜ํ–‰ํ•˜๋„๋กํ•˜๊ธฐ์œ„ํ•จ์ด๋‹ค.

โ€ข ์‹คํŒจํ•œํ”„๋กœ๋ฐ”์ด๋”์—๋Œ€ํ•œ์žฌ์—ฐ๊ฒฐโ€ข ํŠธ๋žœ์žญ์…˜โ€ข ์“ฐ๋ ˆ๋“œ๊ด€๋ฆฌ

โ€ข MDB๋ฅผ์‚ฌ์šฉํ• ์ˆ˜์—†๋‹ค๋ฉด:โ€“ EJB์™€์„œ๋ธ”๋ฆฟ์€ โ€œreceiveโ€๋ฉ”์˜๋“œ๋ฅผ์ด์šฉํ•˜์—ฌ๋™๊ธฐ์ ์œผ๋กœ๋ฐ›์„์ˆ˜์žˆ๋‹ค.

โ€“ EJB์™€์„œ๋ธ”๋ฆฟ๋“ค์€๋น„๋™๊ธฐ์ ์œผ๋กœ๋ฉ”์‹œ์ง€๋ฅผ์ˆ˜์‹ ํ•˜๊ธฐ์œ„ํ•˜์—ฌJMS MessageListener ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ์‚ฌ์šฉ์„๊ถŒ์žฅํ•˜์ง€์•Š๋Š”๋‹ค.

โ€ข ์ปจํ…Œ์ด๋„ˆ์—์˜ํ•œ EJB ๊ฐ์ฒด์˜ํ’€๋ง์„๊ฐ€์ง„์ธํ„ฐํŽ˜์ด์Šค์ด๋ฏ€๋กœ..โ€ข J2EE ์ŠคํŽ™์ƒ์—์„œ์ด๊ฒƒ์„ํ—ˆ๋ฝํ•˜์ง€์•Š๋Š”๋‹ค.โ€ข ์–ด๋–ค๋ฒค๋”๋“ค์€์ด๊ฒƒ์„์‹œ๋„ํ• ๊ฒฝ์šฐ exception์„๋˜์ง„๋‹ค..

Page 52: JMS Technical Training - cfile23.uf.tistory.com

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();

}}}

Page 53: JMS Technical Training - cfile23.uf.tistory.com

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

Page 54: JMS Technical Training - cfile23.uf.tistory.com

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()๋ฅผํ˜ธ์ถœํ•˜์—ฌ์ž์›์„๋ฐ˜ํ™˜ํ•œ๋‹ค.

Page 55: JMS Technical Training - cfile23.uf.tistory.com

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);

Page 56: JMS Technical Training - cfile23.uf.tistory.com

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);}

Page 57: JMS Technical Training - cfile23.uf.tistory.com

57

MessageSelector

โ€ข Consumer๋“ค์€์ „์†ก๋œ๋ฉ”์‹œ์ง€๋“ค์ค‘์—์„œ์ผ๋ถ€๋งŒ๋ฐ›๊ธฐ๋ฅผ์›ํ•˜๋Š”๊ฒฝ์šฐ๋„์žˆ๋‹ค. ์ด๋Ÿฌํ•œ consumer๋ฅผ์œ„ํ•ด๋ฉ”์‹œ์ง€๋ฅผ์ž๋™์œผ๋กœํ•„ํ„ฐ๋งํ•˜๋Š”ํ‘œ์ค€๋ฉ”์‹œ์ง€๋ถ„๋ณ„๊ธฐ(selector)๋ฅผ์‚ฌ์šฉํ•˜์ž.

โ€ข ํ•„ํ„ฐ๋ง์€๋ฉ”์‹œ์ง€๊ฐ€ consumer์—๊ฒŒ์ „์†ก๋˜๊ธฐ์ „์— JMS ์—์„œ์ˆ˜ํ–‰๋œ๋‹ค.

โ€ข JMS ํ‘œํ˜„์‹์„์ด์šฉํ•˜์—ฌ์ž‘์„ฑํ•œ๋‹ค. โ€ข ๋ฉ”์‹œ์ง€ํ—ค๋”์™€์†์„ฑ๋“ค์—๋Œ€ํ•˜์—ฌ์ ์šฉํ•œ๋‹ค. โ€ข ํ‘œํ˜„์‹์ด์ฐธ์ด๋ฉด๋ฉ”์‹œ์ง€๋Š” consumer์—๊ฒŒ์ „์†ก๋œ๋‹ค.

Receiver = session.createReceiver(messageQueue, โ€œJMSPriority > 5โ€);

Page 58: JMS Technical Training - cfile23.uf.tistory.com

58

Best-Practice

โ€ข ๋ถˆํ•„์š”ํ•œ๋ฉ”์‹œ์ง€์†์„ฑ์ง€์ •ํ•˜์ง€๋ง๊ฒƒโ€ข MessageSelector๋ฅผ์‚ฌ์šฉํ•˜๋ผ.โ€ข ๊ฐ€๋Šฅํ•œํ•œ๋น„๋™๊ธฐ๋ฉ”์‹œ์ง€๋ฅผ์‚ฌ์šฉํ•˜๋ผ.โ€ข Resource-ref๋ฅผ์‚ฌ์šฉํ•˜๋ผ.โ€ข ์ž˜๋ชป๋œ๋ฉ”์‹œ์ง€๋Š”์—๋Ÿฌ Destination ์œผ๋กœ๋ณด๋‚ด์„œํ›„์ฒ˜๋ฆฌํ•˜๋ผ.

Page 59: JMS Technical Training - cfile23.uf.tistory.com

59

Q&A , Demo


Recommended