SlideShare a Scribd company logo
1 of 27
Download to read offline
- 1 -
Java Messaging Service
원볞 죌소 : http://docs.oracle.com/javaee/6/tutorial/doc/bncdq.html
번역자 : 김형석 수석
번역음 : 2013 년 06 년 20 음
Chapter47.
Java Message Service Concept
읎 장에서는 자바 메시지 서비슀(JMS) API 에 대핮 소개한닀. 읎 API 륌 읎용하멎
얎플늬쌀읎션 낎에서 신뢰할 수 있고, 비동Ʞ적읎며, 느슚히 연결된(loosely coupled)
컀뮀니쌀읎션 방식을 읎용하여 메시지륌 생성, 전송하고 수신하고 읜을 수 있게 된닀. 읎
장에서는 닀음 낎용듀을 닀룬닀.
 JMS API 개요
 Ʞ볞 JMS API 개념
 JMS API 프로귞래밍 몚덞
 견고한 JMS 얎플늬쌀읎션 작성 방법
 JavaEE 얎플늬쌀읎션에서 JMS 륌 사용하는 방법
 JMS 에 대한 추가 정볎
JMS API 개요
읎 장에서는 메시징(Messaging)에 대한 개념을 정의하고, JMS API 에 대한 낎용곌 읎륌
읎용할 수 있는 상황 대핮 Ʞ술한닀. 또, JavaEE 얎플늬쌀읎션 낎에서 JMS API 가 얎떻게
동작하는지에 대핎서도 섀명할 것읎닀.
메시징읎란 묎엇읞가?
메시징은 소프튞웚얎 컎포넌튞나 얎플늬쌀읎션 간에 정볎륌 죌고 받을 수
있도록(Communication) 하는 방법읎닀. 볎통 메시징 시슀템은 P2P(peer to peer)
구조읎닀. 메시징 큎띌읎얞튞는 메시지륌 전송하Ʞ도 하고 닀륞 ì–Žë–€ 메시징 큎띌읎얞튞가
볎낞 메시지륌 수신하Ʞ도 한닀. 각각의 메시징 큎띌읎얞튞듀은 메시지륌 생성(create)하고
전송(send)하고 수신하고(receive) 읜을(read)수 있는 Ʞ능을 제공하는 메시징
쀑개자(Messaging Agent)와 연결된닀.
메시징을 읎용하멎 느슚하게 연결(loosely coupled)되는 분산된 컀뮀니쌀읎션을 할 수 있게
된닀. 송신자는 목적지(destination)로 메시지륌 볎낎고, 수신자(recipient)는 ê·ž
목적지로부터 메시지륌 얻얎올 수 있닀. 하지만, 송신자(sender)와 수신자(receiver)듀읎
- 2 -
컀뮀니쌀읎션을 하Ʞ 위핎 같은 시점에 몚두 싀행 쀑음 필요는 없닀. 사싀 송신자는 수신자에
대핮 전혀 알지 못핎도 묎방하닀. 마찬가지로 수신자도 송신자에 대핮 알 필요가 없닀.
송신자와 수신자가 알고 있얎알 할 것은 메시지의 형식(format)곌 목적지에 대한 정볎가
전부읎닀. 읎런 ꎀ점에서 메시징은 원격지 얎플늬쌀읎션에 대한 정볎륌 알고 있얎알 하는
RMI(Remote Method Invocation: 원격 메소드 혞출)와 같은 견고하게 연결된(tightly
coupled) 컀뮀니쌀읎션 방식곌 구별된닀고 할 수 있닀.
메시징은 또 읎메음곌도 닀륎닀고 할 수 있는데, 읎메음은 사람곌 사람 간에, 혹은
소프튞웚얎 얎플늬쌀읎션곌 사람 간에 컀뮀니쌀읎션을 하Ʞ 위핎 읎용되지만, 메시징은
소프튞웚얎 얎플늬쌀읎션읎나 소프튞웚얎 컎포넌튞 간의 컀뮀니쌀읎션을 위핎 사용된닀.
JMS API 는 묎엇읞가?
Java Message Service 는 얎플늬쌀읎션에서 메시지륌 생성하고, 송신하고, 수신하고, 읜을
수 있도록 제공된 Java API 읎닀. 읎 API 는 Sun 곌 ê·ž 왞 몇몇 파튞너듀읎 섀계하였는데,
여Ʞ에는 Java 얞얎륌 읎용하여 닀륞 메시징 구현첎듀곌 컀뮀니쌀읎션 할 수 있도록 하는
음반적읞 읞터페읎슀듀곌 귞와 ꎀ렚된 낎용듀읎 정의되얎 있닀.
JMS API 에는, 프로귞래뚞가 알아알 하는 낎용은 최소화하멎서도, 섞렚된 메시징
얎플늬쌀읎션을 만듀 수 있도록 하는 충분한 Ʞ능듀읎 포핚되얎 있닀. 또, JMS
얎플늬쌀읎션읎 동음한 도메읞 낎에 있는 여러 JMS 프로바읎더듀곌 연동할 수 있도록
읎식성을 극대화하였닀.
JMS API 는 느슚한 연결의 컀뮀니쌀읎션을 가능하게 할 뿐만 아니띌 닀음 Ʞ능도 지원한닀.
 비동Ʞ성(Asynchronous): JMS 프로바읎더는 메시지듀읎 도착하멎 바로
큎띌읎얞튞에게 메시지륌 전달핎쀀닀. 큎띌읎얞튞가 메시지륌 얻Ʞ 위핎
프로바읎더에게 요청을 할 필요가 없닀.
 신뢰성(Reliable): JMS API 는 메시지가 한 번, 귞늬고 당 한 번만 전달되도록
볎장한닀. 메시지가 유싀되거나 쀑복되는 등의 묞제륌 핎결하는 낮은 레벚(low
level)의 Ʞ능 구조륌 갖추고 있닀.
현재 JMS 명섞의 버전은 1.1 버전읎닀. JMS 명섞륌 확읞하고 싶윌멎 닀음 URL 을 읎용하Ꞟ
바란닀: http://www.oracle.com/technetwork/java/index-jsp-142945.html
ì–Žë–€ 상황에서 JMS API 륌 읎용할 수 있는가?
닀음곌 같은 상황에서 엔터프띌읎슈 얎플늬쌀읎션듀은 RPC(Remote Procedure Call)와
같은 견고한 연결방식 대신 메시징 API 륌 선택하는 겜향읎 있닀.
 컎포넌튞가 닀륞 컎포넌튞의 읞터페읎슀에 의졎하지 말아알 할 때, 슉 컎포넌튞듀읎
손쉜게 교첎될 수 있얎알 할 때
- 3 -
 몚든 컎포넌튞 혹은 얎플늬쌀읎션듀읎 같은 시점에 싀행 쀑읎 아니더띌도
컀뮀니쌀읎션읎 가능핎알 할 때
 얎플늬쌀읎션의 비슈니슀 몚덞읎 전송한 메시지에 대한 처늬 결곌륌 슉각적윌로
응답 받을 필요가 없을 때
예륌 듀얎볎멎, 자동찚 공장에서 사용되는 엔터프띌읎슈 얎플늬쌀읎션의 컎포넌튞듀은
닀음곌 같은 방식윌로 JMS API 륌 사용할 수 있닀.
 재고 컎포넌튞는 ì–Žë–€ 제품의 재고 수쀀읎 음정량 읎하로 떚얎지멎 공장
컎포넌튞에게 메시지륌 볎낌 수 있닀. 귞늬하여 자동찚륌 더 많읎 만듀 수 있닀.
 공장 컎포넌튞는 부품 컎포넌튞듀에게 메시지륌 볎낎 필요한 부품듀을 조늜할 수
있닀.
 부품 컎포넌튞는 재고 컎포넌튞나 죌묞 컎포넌튞로 메시지륌 볎낎 재고 수량을
갱신하고 새로욎 부품을 죌묞할 수 있닀.
 공장 컎포넌튞와 부품 컎포넌튞 몚두 정산 컎포넌튞로 메시지륌 볎낎 자산을 갱신할
수 있닀.
 업묎팀에서 갱신된 칎탈로귞륌 판쎉팀윌로 발행할 수 있닀.
읎런 방식윌로 메시징을 읎용하멎 각 컎포넌튞듀읎 넀튞워크나 늬소슀륌 곌도하게 점유하지
않고도 횚윚적윌로 상혞작용할 수 있닀. 귞늌 47-1 륌 볎멎 위 예제륌 쉜게 읎핎할 수 있을
것읎닀.
제조업은 JMS API 륌 읎용하는 엔터프띌읎슈 얎플늬쌀읎션의 한 예음 뿐읎닀. 소맀(retail)
얎플늬쌀읎션, ꞈ융 서비슀 얎플늬쌀읎션, 의료 서비슀 얎플늬쌀읎션 등 수많은
얎플늬쌀읎션듀읎 메시징을 읎용할 수 있닀.
JMS API 는 JavaEE 플랫폌에서 얎떻게 동작하는가?
1998 년 JMS API 가 처음 소개되었을 때, 읎것의 가장 쀑요한 목표는 Java 얎플늬쌀읎션읎
IBM 의 MQSeries 와 같은 Ʞ졎에 졎재하던 메시징 êž°ë°˜ 믞듀웚얎(MOM Messaging
Oriented Middleware)에 접귌할 수 있도록 하는 것읎었닀. ê·ž 때 읎후로, 수 많은 개발
업첎듀읎 JMS API 에 적응하고 읎륌 구현핎 왔윌며, 귞래서 현재의 JMS 제품듀은
엔터프띌읎슈 환겜을 위한 메시징 Ʞ능을 완벜하게 제공할 수 있게 되었닀.
- 4 -
Java EE 플랫폌의 1.3 버전 배포부터 시작된 JMS API 는 플랫폌의 핵심적읞 부분읎 되얎
왔윌며, 많은 얎플늬쌀읎션 개발자듀은 JavaEE 컎포넌튞륌 읎용하여 메시징 Ʞ능을 구현할
수 있게 되었닀.
JavaEE 플랫폌 낎에 탑재되얎 있는 JMS API 에는 닀음곌 같은 Ʞ능듀읎 포핚되얎 있닀.
 얎플늬쌀읎션 큎띌읎얞튞, 엔터프띌읎슈 자바빈슈(EJB), 귞늬고 웹 컎포넌튞듀은
JMS 메시지륌 전송하거나 동Ʞ화된 방식윌로 수신할 수 있닀. 추가적윌로
얎플늬쌀읎션 큎띌읎얞튞는 JMS 메시지륌 비동Ʞ적윌로 수신할 수도 있닀. (하지만,
애플늿은 JMS API 륌 지원할 필요가 없닀.)
 엔터프띌읎슈 빈의 한 종류읞 메시지 드늬랐 빈(MDB, Message-Driven Bean)은
메시지 소비륌 비동Ʞ적윌로 수행할 수 있닀. JMS 프로바읎더는 메시지 드늬랐
빈을 읎용하여 메시지에 대한 동시 처늬 Ʞ능을 부가적윌로 구현할 수 있닀.
 메시지에 대한 송/수신 Ʞ능은 분산 튞랙잭션에 찞가할 수 있는데, 읎는 JMS 에 대한
작업곌 데읎터베읎슀에 대한 작업읎 닚음 튞랜잭션 낎에서 처늬될 수 있음을
의믞한닀.
JMS API 는 엔터프띌읎슈 얎플늬쌀읎션의 개발 방식을 닚순화시킀고, JavaEE 컎포넌튞와
Ʞ졎에 졎재하던 메시징 시슀템간에 느슚하고, 신뢰로우며, 비동Ʞ적읞 상혞작용을 가능쌀
핚윌로썚 Java EE 플랫폌의 가치륌 향상시쌰닀. 개발자듀은 특정 비슈니슀 읎벀튞에 대핮
동작하는 메시지 드늬랐 빈을 추가핚윌로썚 Ʞ졎에 작성되얎 있던 비슈니슀가 새로욎 동작을
하도록 Ʞ능을 손쉜게 추가할 수 있닀. 또, JavaEE 플랫폌은 분산 튞랜잭션곌 메시지에 대한
동시 처늬 Ʞ능을 제공핚윌로썚 JMS API 륌 향상시쌰닀. 더 자섞한 정볎륌 알고 싶닀멎
엔터프띌읎슈 자바빈슈 3.1 규격(Specification)륌 찞고하Ʞ 바란닀.
JMS 프로바읎더는 JavaEE 컀넥터 아킀텍처륌 사용하고 있는 얎플늬쌀읎션 서버와 통합될
수 있닀. 개발자듀은 늬소슀 얎댑터(resource adapter)륌 통핎 JMS 프로바읎더에 접귌할
수 있닀. 읎 Ʞ능은 JMS 프로바읎더가 여러 개의 얎플늬쌀읎션 서버에 플러귞읞 되는 것읎
가능하도록 핮 죌며, 또 얎플늬쌀읎션 서버듀읎 여러 개의 JMS 프로바읎더와 연동할 수
있도록 핮 쀀닀. 읎에 대한 자섞한 정볎는 JavaEE 컀넥터 아킀텍처 규격 v1.6 을 확읞핎
볎Ʞ 바란닀.
JMS API Ʞ볞 개념
읎 장에서는 JMS API 의 가장 Ʞ볞적읞 개념에 대핮 닀룰 것읞데, 읎 낎용은 JMS API 륌
읎용하는 ê°„ë‹ší•œ 얎플늬쌀읎션을 작성하Ʞ 위핎 반드시 알아알 할 것읎닀.
읎 닀음 장에서는 JMS API 의 프로귞래밍 몚덞에 대핮 닀룰 것읎닀. ê·ž 뒀에 소개될 장
듀에서는 메시지 드늬랐 빈을 읎용하는 얎플늬쌀읎션을 작성하Ʞ 위핎 알아알 하는 고꞉
개념을 소개할 것읎닀.
JMS API 아킀텍처
- 5 -
JMS 얎플늬쌀읎션은 닀음 부분듀로 구성된닀.
 JMS 프로바읎더(JMS Provider)는 JMS 읞터페읎슀륌 구현하고 ꎀ늬/제얎 Ʞ능을
제공하는 메시징 시슀템읎닀. JavaEE 플랫폌의 구현첎(Platform
Implementation)는 JMS 프로바읎더륌 포핚한닀.
 JMS 큎띌읎얞튞(JMS Client)는 Java ì–žì–Žë¡œ 작성된 프로귞랚읎거나 컎포넌튞로
메시지륌 생산하거나 소비한닀. JavaEE 얎플늬쌀읎션 컎포넌튞띌멎 ì–Žë–€ 것읎띌도
JMS 큎띌읎얞튞로서 동작할 수 있닀.
 메시지는 JMS 큎띌읎얞튞 사읎에 정볎륌 죌고 받는 데에 사용되는 객첎읎닀.
 ꎀ늬 대상 객첎(Administered Object)는 사전에 섀정되는 JMS 객첎로,
큎띌읎얞튞에서 사용하Ʞ 위핎 ꎀ늬자가 생성하는 객첎읎닀. JMS ꎀ늬 객첎에는 두
가지가 있는데, 하나는 목적지(destination)읎고 닀륞 하나는 컀넥션 팩토늬
(connection factory)읎닀. 읎에 대한 낎용은 [JMS ꎀ늬 대상 객첎] 장에서 섀명될
것읎닀.
귞늌 47-2 는 읎 ì„ž 부분읎 얎떻게 상혞작용하는지륌 볎여쀀닀. ꎀ늬 툎을 읎용하멎 JNDI
넀임슀페읎슀 낎에 목적지와 컀넥션 팩토늬 정볎륌 바읞드(bind)할 수 있닀. 귞렇게 되멎,
JMS 큎띌읎얞튞가 핎당 넀임슀페읎슀 낎에 있는 ꎀ늬 대상 객첎에 접귌하Ʞ 위핎 자원
죌입(resource injection)을 읎용할 수 있게 된닀. 귞늬고 ê·ž 후 JMS 프로바읎더륌 통핎
동음한 객첎에 녌늬적읞 컀넥션을 맺을 수 있게 되는 것읎닀.
메시징 도메읞듀(Messaging Domains)
JMS API 가 소개되Ʞ 전의 대부분의 메시징 제품듀은 점대점(point-to-point) 방식읎나
발행/구독(publish/subscribe) 방식 쀑 둘 쀑 하나만 지원했었닀. JMS 규격은 각각의 ì ‘ê·Œ
방식을 위핎 분늬된 도메읞을 제공하고, 각 도메읞 별로 따띌알 할 규칙듀을 정의한닀.
독늜적윌로 동작하는 (stand-alone) JMS 프로바읎더는 한 가지 혹은 두 가지 방식 몚두륌
구현할 수 있닀. JavaEE 프로바읎더는 두 가지 도메읞 몚두륌 구현핎알 한닀.
사싀, 대부분의 JMS API 구현첎듀은 점대점 방식 도메읞읎나 발행/구독 방식 도메읞 몚두륌
지원하고 있윌며, 몇몇 JMS 큎띌읎얞튞듀은 닚음 얎플늬쌀읎션 낎에서 두 가지 도메읞
몚두륌 사용하Ʞ도 한닀. 읎런 방식을 읎용하여 JMS API 는 메시징 제품듀의 Ʞ능곌
유연성을 킀웠닀고 할 수 있닀.
JMS 규격은 여Ʞ서 한 걞음 더 나아갔닀: 양쪜 도메읞에 접귌하Ʞ 위핎 닚음 JMS API 륌
읎용할 수 있게 된 것읎닀. 닀음 장에서는 위에서 소개한 두 가지의 메시징 도메읞에 대한
- 6 -
낎용곌 읎듀을 읎용하Ʞ 위한 공통 읞터페읎슀(common interface)륌 사용하는 방법을 닀룰
것읎닀.
점대점 메시징 도메읞(Point-to-Point Messaging Domain)
점대점 제품읎나 얎플늬쌀읎션은 메시지 큐(Message Queue), 송신자(sender),
수신자(receiver)의 개념을 Ʞ반윌로 만듀얎진닀. 개별 메시지듀은 특정 큐에 전달되고,
수신 큎띌읎얞튞듀은 메시지륌 ë‹Žê³  있Ʞ 위핎 생성된 큐로부터 메시지륌 추출한닀. 큐는
메시지가 소비되거나 만료되Ʞ 전까지 몚든 메시지륌 볎유하고 있게 된닀.
귞늌 47-3 에 소개되얎 있는 점대점 메시진 방식은 닀음곌 같은 특징을 지니고 있닀.
 개별 메시지듀은 당 하나의 소비자에 의핎 소비된닀.
 메시지의 송신자와 수신자는 시간에 구애되지 않고 메시지륌 죌고 받을 수 있닀.
수신자는 얞제든 메시지륌 가젞올 수 있윌며, 송신자가 메시지륌 송신하고 있을 때
싀행 쀑읎지 않아도 된닀.
 수신자는 메시지륌 성공적윌로 처늬했는지륌 고지한닀.
점대점 메시징 방식은 전송된 메시지가 당 하나의 소비자에 의핎 성공적윌로 처늬되얎알
하는 겜우에 읎용할 수 있닀.
발행/구독 메시징 도메읞(Publish/Subscribe Messaging Domain)
발행/구독(pub/sub) 제품읎나 얎플늬쌀읎션은 메시지륌 하나의 토픜(topic)에 전송하는데,
읎는 게시판(Bulletin Board)곌 비슷하게 작동한닀고 볌 수 있닀. 발행자(Publisher)와
구독자(Subscriber)듀은 볎통 익명(anonymous)읎고, 동적윌로 컚텐튞 계잵(content
hierarchy)에 발행하거나 귞것을 구독할 수 있닀. 읎 시슀템은 여러 발행자가 전달한
토픜듀을 여러 구독자에게 나누얎(distributing) 죌는 역할을 닎당한닀. 토픜듀은 현재의
구독자듀에게 메시지륌 전달되는 동안만 메시지륌 유지한닀.
발행/구독 메시징에는 닀음곌 같은 특징읎 있닀.
 각 메시지듀은 여러 구독자에 의핎 소비될 수 있닀.
- 7 -
 발행자와 구독자 사읎에는 시간적 의졎성(timing dependency)가 졎재한닀. ì–Žë–€
토픜을 구독하는 큎띌읎얞튞는 구독하Ʞ 시작한 읎후에 발행된 메시지만 소비할 수
있닀. 귞늬고 메시지륌 소비하Ʞ 위핎 지속적윌로 활성화(active)되얎 있얎알 한닀.
JMS API 는 읎 시간적 의졎성을 얎느 정도 늘늬Ʞ 위핎 구독자가 지속 구독(durable
subscriptions)을 할 수 있는 Ʞ능을 제공한닀. 읎 방식을 읎용하멎 구독자가 동작하고 있지
않은 시점에 전송된 메시지륌 수신할 수 있게 된닀. 지속 구독 방식은 큐의 유연성곌
신뢰성을 부여하멎서도 큎띌읎얞튞가 여러 수신자에게 메시지륌 전송할 수 있게 핮 쀀닀.
읎에 대한 상섞한 정볎는 [지속 구독 생성하Ʞ] 장을 찞고하Ʞ 바란닀.
각 메시지가 여러 소비자에 전달되얎 처늬되얎알 한닀멎 발행/구독 방식을 읎용하멎 된닀.
귞늌 47-4 에서 발행/구독 방식읎 섀명되얎 있닀.
공통 읞터페읎슀륌 읎용하여 프로귞래밍하Ʞ
JMS API 버전 1.1 을 읎용하여 작성된 윔드는 점대점읎나 발행/구독 도메읞 둘 쀑 하나와만
연동할 수 있었닀. 사용되는 목적지는 도메읞에 따띌 닀륎고, 얎플늬쌀읎션의 동작 방식도
큐륌 사용하냐 토픜을 사용하냐에 따띌 닀륎Ʞ 때묞읎닀. 하지만 윔드 자첎는 몚든 도메읞에
동음하게 사용될 수도 있고, 귞렇게 되멎 얎플늬쌀읎션읎 볎닀 유연하고 재사용 가능하도록
작성될 수 있닀. 읎 예제에서는 읎 공통 읞터페읎슀에 대핮 얞꞉하고 섀명할 것읎닀.
메시지 소비
메시징 제품듀은 태생적윌로 비동Ʞ적윌로 동작한닀: 메시지륌 생산하거나 소비하는 사읎에
귌원적읞 시간적 의졎성은 졎재하지 않는닀. 하지만, JMS 규격에서는 읎 용얎륌 좀 더
엄밀하게 사용하고 있닀. 메시지듀은 닀음 두 가지 방식윌로 소비될 수 있닀.
 동Ʞ화 처늬: 구독자나 수신자가 receive 메소드륌 혞출하여 목적지로부터 메시지륌
명시적윌로 가젞간닀. receive 메소드는 메시지가 도착할 때 까지 대Ʞ할 수도 있고,
지정된 음정 시간 한도 낎에 메시지가 도착하지 않윌멎 타임아웃 처늬할 수도 있닀.
 비동Ʞ화 처늬: 큎띌읎얞튞는 소비자에 메시지 늬슀너(message listener)륌 등록할
수 있닀. 메시지 늬슀너는 읎벀튞 늬슀너와 유사하닀. 얞제든 메시지가 목적지에
도착하멎, JMS 프로바읎더는 늬슀너의 onMessage 메소드륌 혞출하여 메시지륌
전달하는데, 읎 메소드는 메시지의 컚텐잠에 대핮 동작한닀.
- 8 -
JMS API Ʞ볞 개념
JMS 얎플늬쌀읎션의 Ʞ볞적읞 구성요소듀은 닀음곌 같닀.
 ꎀ늬 대상 객첎: 컀넥션 팩토늬와 목적지
 컀넥션듀(connections)
 섞션듀(sessions)
 메시지 생성자듀(message producers)
 메시지 소비자듀(message consumers)
 메시지듀(messages)
귞늌 47-5 륌 볎멎 위의 객첎듀읎 얎떻게 상혞작용하는지륌 확읞할 수 있닀.
읎 장에서는 몚든 객첎듀을 간략하게 섀명할 것읎고 읎듀을 사용하Ʞ 위한 명령얎와 ê°„ë‹ší•œ
윔드 조각을 볎여쀄 것읎닀. 귞늬고 마지막에는 JMS API 의 예왞 처늬 방법에 대핮 간략히
섀명할 것읎닀.
몚든 객첎듀을 통합하는 예제는 읎 장의 마지막에 추가되얎 있닀. 더 상섞한 낎용을 알고
싶윌멎 JavaEE API 묞서 쀑 JMS API 묞서륌 확읞하Ʞ 바란닀.
JMS ꎀ늬 대상 객첎(JMS Administered Objects)
JMS 의 두 부분읞 목적지(destination)곌 컀넥션 팩토늬(connection factories)는
프로귞랚적윌로 ꎀ늬되Ʞ 볎닀는 ꎀ늬자에 의핎 ꎀ늬된닀. 읎 객첎듀을 위한 Ʞ술은 JMS
API 의 구현 방식곌는 완전히 달띌 볎음 것읎닀. 귞러므로, 읎 객첎듀에 대한 작업은 ì–Žë–€
프로바읎더륌 사용하냐에 따띌 달띌질 수 있는 작업윌로 ꎀ늬자가 처늬핎알 하는 것읎닀.
- 9 -
JMS 큎띌읎얞튞듀은 읎 객첎에 접귌하Ʞ 위핎 공통윌로 사용될 수 있는 읞터페읎슀륌
읎용하며, 귞래서 큎띌읎얞튞 얎플늬쌀읎션은 윔드의 수정읎 없거나 아죌 적은 수정만윌로
하나 읎상의 JMS API 구현첎와 연동할 수 있게 된닀. 볎통 ꎀ늬자는 ꎀ늬 대상 객첎듀을
JNDI 넀임슀페읎슀 낎에 섀정하며, ê·ž ë’€ JMS 큎띌읎얞튞듀읎 자원 죌입을 읎용하여 읎
객첎듀에 접귌하게 된닀.
GlassFish 서버륌 읎용한닀멎, create-jms-resource 띌는 명령얎륌 읎용하거나 ꎀ늬자
윘솔을 읎용하여 컀넥터 자원 폌에서 JMS ꎀ늬 대상 객첎륌 생성할 수 있닀. 또, 직접
얎플늬쌀읎션에 추가할 수 있는 glassfish-resource.xml 띌는 읎늄의 파음에 필요한 자원을
추가할 수도 있닀.
NetBeans IDE 에는 GlassFish 서버에 JMS 자원듀을 생성할 수 있는 마법사 Ʞ능읎
추가되얎 있닀. 자섞한 낎용은 [NetBeans IDE 륌 읎용하여 JMS 자원 추가하Ʞ]장을
찞고하Ʞ 바란닀.
JMS 컀넥션 팩토늬(JMS Connector Factories)
컀넥션 팩토늬는 큎띌읎얞튞가 프로바읎더에 접귌하Ʞ 위핎 사용하는 객첎읎닀. 컀넥션
팩토늬는 ꎀ늬자가 섀정한 컀넥션에 대한 섀정 파띌믞터 값의 집합을 포핚하고 있닀. 각
컀넥션 팩토늬는 ConnectionFactory, QueueConnectionFactory 혹은
TopicConnectionFactory 의 읞슀턎슀읎닀. 컀넥션 팩토늬륌 생성하는 방법은 [NetBeans
IDE 륌 읎용하여 JMS 자원 추가하Ʞ]장을 찞고하Ʞ 바란닀.
볎통 JMS 큎띌읎얞튞 프로귞랚의 앞 부분에서 컀넥션 팩토늬 자원을 ConnectionFactory
변수에 죌입하여 사용하게 된닀. 예륌 듀얎 닀음 윔드는 JNDI 읎늄읎
jms/ConnectionFactory 읞 자원을 지정하여 귞것읎 ConnectionFactory 객첎에 할당되게
하고 있닀.
@Request(lookup = “jms/ConnectionFactory”)
private static ConnectionFactory connectionFactory;
위와 같읎 JavaEE 얎플늬쌀읎션에서는 JMS ꎀ늬 대상 객첎듀은 볎통 jms 띌는 하위
컚텍슀튞 명을 추가하여 사용한닀.
JMS 목적지(JMS Destination)
목적지는 큎띌읎얞튞가 메시지륌 전달하Ʞ 위핎 사용하는 대상(target)읎거나 메시지륌
소비하Ʞ 위핎 지정한 귌원(source)읎닀. 점대점 메시징 도메읞에서 목적지는
큐(queue)띌고 불늬고, 발행/구독 메시징 도메읞에서는 토픜(topic)읎띌고 불늰닀. 하나의
JMS 얎플늬쌀읎션은 여러 개의 큐와 토픜을 (둘 ë‹€) 사용할 수 있닀. 목적지륌 생성하는
방법에 대핮 알고 싶윌멎 [NetBeans IDE 륌 읎용하여 JMS 자원 추가하Ʞ]장을 찞고하Ʞ
바란닀.
- 10 -
GlassFish 서버륌 사용하는 목적지륌 생성하Ʞ 위핎서는, ê·ž 목적지륌 위한 JNDI 읎늄을
정의한 JMS 목적지 자원(JMS destination resource)륌 생성하여알 한닀.
GlassFish 서버에서 구현된 JMS 는 각 목적지 자원은 싀제 묌늬적읞 목적지륌 찞조한닀.
ꎀ늬자는 묌늬적읞 목적지륌 명시적윌로 생성할 수 있는데, 만앜 귞러지 않았닀멎
얎플늬쌀읎션 서버가 읎것읎 필요할 때 자동윌로 생성하고 ꎀ늬자가 목적지 자원을 제거할
때 제거하게 된닀.
큎띌읎얞튞 프로귞랚 낎에 컀넥션 팩토늬륌 죌입하는 것곌 마찬가지로, 볎통 목적지 자원도
죌입하여 사용한닀. 컀넥션 팩토늬와는 달늬, 목적지는 하나의 도메읞에만 지정된닀. 토픜곌
큐 몚두륌 사용하는 얎플늬쌀읎션을 작성핎알 한닀멎 목적지륌 Destination 객첎에 할당하멎
된닀.
닀음 윔드는 두 개의 자원 하나의 큐와 하나의 토픜을 정의하고 있닀. 각 자원의 읎늄은
JNDI 넀임슀페읎슀 낎에 생성된 목적지 자원에 대응된닀.
@Resource (lookup = “jms/Queue”)
private static Queue queue;
@Resource (lookup = “jms/Topic”)
private static Topic topic;
공통 읞터페읎슀륌 읎용하멎 컀넥션 팩토늬와 목적지륌 섞거나 맞출 수도 있닀. 읎는
ConnectionFactory 읞터페읎슀륌 사용하는 대신에 QueueConnectionFactory 자원을
Topic 곌 같읎 사용할 수도 있고, TopicConnectionFactory 자원을 Queue 와 같읎 사용할
수 있닀는 말읎닀. 얎플늬쌀읎션의 동작 방식은 ì–Žë–€ 목적지륌 사용하냐에 따띌 달띌질 뿐
ì–Žë–€ 종류의 컀넥션 팩토늬륌 읎용하냐에 결정되지 않는닀.
JMS 컀넥션(JMS Connections)
컀넥션은 JMS 프로바읎더와 가상의 연결을 캡슐화한닀. 예륌 듀얎 하나의 컀넥션은
큎띌읎얞튞와 프로바읎더 서비슀 데몬 간에 ì—Žë € 있는 TCP/IP 소쌓 정볎륌 표현할 수 있닀.
묌론 하나의 컀넥션을 하나 혹은 여러 개의 섞션을 생성하Ʞ 위핎 사용할 수 있닀.
ì°žê³  – JavaEE 얎플늬쌀읎션 낎에서 닚음 컀넥션윌로부터 여러 개의 섞션을 생성하는 능력은 얎플늬쌀읎션
큎띌읎얞튞에서만 사용할 수 있닀. 웹읎나 엔터프띌읎슈 빈 컎포넌튞 낎에서 하나의 컀넥션은 였직 하나의 섞션만을
생성할 수 있닀.
컀넥션듀은 Connection 읞터페읎슀륌 구현한닀. 컀넥션 팩토늬 객첎륌 가지고 있닀멎
닀음곌 같읎 컀넥션을 생성하는 데 사용할 수 있닀.
Connection connection = connectionFactory.createConnection ();
얎플늬쌀읎션읎 종료되Ʞ 전에 생성한 컀넥션을 반드시 닫아죌얎알 한닀. 컀넥션을 닫는 데
싀팚하멎 JMS 프로바읎더에 의한 자원 핎제가 싀팚할 수 있닀. 컀넥션을 닫윌멎 귞것읎
엎얎놓은 섞션뿐만 아니띌 메시지의 생산자와 소비자도 닫게 된닀.
- 11 -
connection.close ();
얎플늬쌀읎션읎 메시지륌 소비할 수 있Ʞ 전에 반드시 컀넥션의 start 메소드륌 혞출핎알
한닀: 자섞한 낎용은 [JMS 메시지 소비] 장을 찞고하띌. 만앜 컀넥션을 닫지 않고 메시지의
전달을 쀑지하고 싶닀멎 stop 메소드륌 혞출하멎 된닀.
JMS ì„žì…˜(JMS Sessions)
섞션은 메시지륌 생산하고 소비하Ʞ 위한 닚음 슀레드 컚텍슀튞(single-threaded
context)읎닀. 섞션은 닀음 객첎듀을 생성할 때 사용할 수 있닀.
 메시지 생산자(Message Producer)
 메시지 소비자(Message Consumer)
 메시지(Message)
 큐 탐색Ʞ(Queue Browser)
 임시 큐/토픜([임시 목적지 생성하Ʞ]장 ì°žì¡°)
섞션은 메시지 늬슀너의 싀행을 직렬화한닀: 읎에 대한 상섞한 낎용은 [JMS 메시지 늬슀너]
장을 찞조하띌.
섞션은 튞랜잭션 컚텍슀튞륌 제공하는데, 읎륌 읎용하멎 음렚의 메시지 전송곌 수신
작업듀을 하나의 원자화된 작업윌로 처늬하도록 할 수 있닀. 읎에 대한 상섞한 낎용은 [JMS
API 로컬 튞랜잭션 읎용하Ʞ] 장을 찞조하띌.
섞션은 Session 읞터페읎슀륌 구현한닀. 컀넥션 객첎륌 생성한 ë’€ 귞것을 읎용하여 ì„žì…˜
객첎륌 생성할 수 있닀.
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
첫 번짞 입력값은 튞랜잭션 처늬륌 할 것읞지 여부륌 결정한닀. 두 번짞는 메시지가
성공적윌로 전달되었을 때 섞션읎 메시지륌 자동적윌로 확읞할 것읞지륌 결정한닀. (읎에
대한 자섞한 낎용은 [메시지 확읞 제얎하Ʞ] 장을 찞조하띌.)
튞랜잭션 처늬가 되는 섞션을 생성하렀멎 닀음 윔드륌 읎용하멎 된닀.
Session session = connection.createSession(true, 0);
여Ʞ서 첫 번짞 입력값은 읎 섞션읎 튞랙잭션 처늬가 될 것임을 의믞한닀. 두 번짞는
튞랜잭션 처늬된 섞션을 위핎 메시지 확읞 Ʞ능을 규정하지 않는닀는 것을 의믞한닀.
튞랜잭션에 대한 더 자섞한 정볎륌 알고 싶윌멎, [JMS API 로컬 튞랜잭션 읎용하Ʞ] 장을
찞조하띌. JavaEE 얎플늬쌀읎션 낎에서 JMS 튞랜잭션읎 동작하는 방법에 대한 상섞한
정볎는 [JavaEE 얎플늬쌀읎션 낎에서 JMS API 사용하Ʞ] 장을 찞조하띌.
- 12 -
JMS 메시지 생산자(JMS Message Producer)
메시지 생산자는 섞션에 의핎 생성된, 메시지륌 목적지에 전송하Ʞ 위핎 사용되는 객첎읎닀.
읎 객첎는 MessageProducer 읞터페읎슀륌 구현한닀.
ì–Žë–€ 목적지륌 위한 MessageProducer 객첎륌 생성하Ʞ 위핎서 Session 객첎륌 읎용한닀.
아래 윔드는 Destination 객첎나 Queue 객첎나 Topic 객첎륌 위한 생산자륌 만드는 방법을
볎여죌고 있닀.
MessageProducer producer = session.createProducer (dest);
MessageProducer producer = session.createProducer (queue);
MessageProducer producer = session.createProducer (topic);
createProducer 메소드의 입력 값윌로 null 을 입력하여 믞확읞 생산자(unidentified
producer)륌 만듀 수도 있닀. 믞확읞 생산자륌 사용하게 되멎 메시지륌 전송할 때까지
목적지륌 정의하지 않아도 된닀.
메시지 생산자륌 생성한 닀음, send 메소드륌 읎용하여 메시지륌 전송할 수 있닀:
producer.send (message);
메시지륌 전송하Ʞ 위핎 메시지륌 뚌저 생성핎알 한닀: 읎에 대핎서는 [JMS Message]장을
찞고하띌.
만앜 믞확읞 생산자륌 생성하였닀멎, 닀음곌 같읎 쀑복 정의(overloaded)된 send 메소드륌
읎용하여 첫 번짞 입력 값윌로 목적지륌 지정할 수 있닀.
MessageProducer anon_prod = session.createProducer (null);
anon_prod.send (dest, message);
JMS 메시지 소비자(JMS Message Consumer)
메시지 소비자는 섞션에 의핎 생성된 객첎로 목적지로부터 전달된 메시지륌 수신하는 데에
사용된닀. 읎 객첎는 MessageConsumer 읞터페읎슀륌 구현한닀.
메시지 소비자는 JMS 큎띌읎얞튞가 JMS 프로바읎더의 ì–Žë–€ 목적지에 ꎀ심읎 있음을 등록할
수 있도록 한닀. JMS 프로바읎더는 목적지로부터 핎당 목적지에 등록된 소비자까지
메시지가 전달되는 몚든 곌정을 ꎀ늬한닀.
예륌 듀얎, ì–Žë–€ Destination 읎나 Queue 나 Topic 객첎륌 위한 MessageConsumer 객첎는
Session 객첎륌 읎용하여 만듀 수 있닀.
MessageConsumer consumer = session.createConsumer (dest);
MessageConsumer consumer = session.createConsumer (queue);
MessageConsumer consumer = session.createConsumer (topic);
- 13 -
Session.createDurableSubscriber 메소드륌 읎용하멎 지속형 토픜 구독자(durable topic
subscriber)륌 생성할 수 있닀. 읎 메소드는 목적지로 토픜을 읎용할 때에만 유횚하닀.
자섞한 낎용은 [지속형 구독자 만듀Ʞ]륌 찞조하띌.
메시지 소비자가 생성되고 나멎, 바로 활성화(active)되얎 메시지륌 수신할 수 있게 된닀.
MessageConsumer 의 close 메소드륌 읎용하멎 읎 소비자륌 비활성화(inactive) 상태로
변겜할 수 있닀. 메시지의 전달은 생성된 컀넥션의 start 메소드륌 혞출하Ʞ 전까지는
시작되지 않는닀. (읎 start 메소드륌 싀행하는 것을 잊얎서는 안 된닀. JMS 프로귞랚에서
발생하는 가장 흔한 였류 쀑 하나는 컀넥션을 시작하는 것을 잊얎버렀서 발생한 것읎닀.)
읎제 receive 메소드륌 읎용하멎 메시지륌 동Ʞ적(synchronously)윌로 소비할 수 있닀. 읎
메소드는 컀넥션을 시작한 읎후띌멎 얞제든 사용할 수 있닀.
connection.start ();
Message m = consumer.receive ();
connection.start ();
Message m = consumer.receive (1000); // 1 쎈 후 타임아웃
비동Ʞ적윌로 처늬하고 싶을 때는 메시지 늬슀너륌 읎용하멎 된닀. 읎 낎용은 닀음 장에서
닀룰 것읎닀.
JMS 메시지 늬슀너(JMS Message Listener)
메시지 늬슀너는 메시지륌 위한 비동Ʞ적 읎벀튞 핞듀러로서 동작하는 객첎읎닀. 읎 객첎는
MessageListener 읞터페읎슀륌 구현하는데, 읎 읞터페읎슀에는 onMessage 띌는 당
하나의 메소드만 포핚되얎 있닀. onMessage 메소드 낎에 메시지가 전달되었을 때
수행되얎알 하는 동작을 정의하멎 된닀.
메시지 늬슀너는 특정 MessageConsumer 객첎의 setMessageListener 메소드륌
혞출핚윌로썚 등록할 수 있닀. 예륌 듀얎, MessageListener 읞터페읎슀륌 구현한
Listener 띌는 큎래슀륌 만듀얎 두었닀멎, 닀음곌 같은 방법을 읎용하여 메시지 늬슀너륌
등록할 수 있닀.
Listener myListener = new Listener ();
consumer.setMessageListener (myListener);
ì°žê³  – JavaEE 플랫폌 낎에서 MessageListener 는 얎플늬쌀읎션 큎띌읎얞튞에서만 사용할 수 있닀. 웹 컎포넌튞나
엔터프띌읎슈 빈 낎에서는 사용할 수 없닀.
메시지 늬슀너륌 등록한 후, Connection 객첎의 start 메소드륌 혞출하여 메시지 전달을
시작할 수 있닀. (만앜 메시지 늬슀너륌 등록하Ʞ 전에 start 메소드륌 혞출하멎 몇몇
메시지가 유싀될 수도 있닀.)
메시지가 전달되Ʞ 시작된 후, JMS 프로바읎더는 메시지가 전달될 때 마닀 자동적윌로
메시지 늬슀너의 onMessage 메소드륌 혞출한닀. onMessage 메소드는 Message 타입의
- 14 -
입력값 하나륌 받는데, 읎 메소드 낎에서는 ì–Žë–€ 타입의 Message 타입윌로도 변환(cast)할
수 있닀. ([메시지 바디] 장을 찞조하띌)
메시지 늬슀너는 특정한 목적지 유형에 국한되지 않고 사용할 수 있닀. 하나의 늬슀너는 큐나
토픜 둘 쀑 하나로부터 메시지륌 수신할 수 있는데, 읎는 메시지 소비자가 생성될 때 ì–Žë–€
유형의 목적지륌 섀정했느냐에 의핎 결정된닀. 하지만 음반적윌로 메시지 늬슀너는 특정한
메시지 유형읎나 포맷에 맞게 동작한닀.
작성된 onMessage 메소드는 몚든 예왞사항을 처늬하여알 한닀. 절대로 첎크 예왞(checked
exception)을 뱉얎서는 안 되며, RuntimeException 을 뱉는 것도 프로귞래밍 였류로
간죌된닀.
메시지 소비자륌 생성하는 데 사용되었던 섞션은 핚께 등록된 몚든 읎벀튞 늬슀너의 싀행을
직렬화한닀. 얎느 순간에서걎 섞션의 메시지 늬슀너는 하나만 싀행된닀.
JavaEE 플랫폌 낎에서 메시지 드늬랐 빈은 메시지 늬슀너의 특별한 유형읎닀. 읎에 대한
자섞한 낎용은 [메시지 드늬랐 빈을 읎용하여 비동Ʞ적윌로 메시지 수신하Ʞ]장을 찞조하띌.
JMS 메시지 셀렉터 (JMS Message Selectors)
만앜 수신된 메시지륌 필터링 할 필요가 있닀멎 JMS API 의 메시지 셀렉터륌 읎용하멎 된닀.
읎것을 읎용하멎 메시지 소비자가 ꎀ심있는 메시지만 소비하게 할 수 있닀. 메시지 셀렉터는
얎플늬쌀읎션읎 아니띌 JMS 프로바읎더에 메시지 필터 작업을 할당한닀. 메시지 셀렉터륌
사용하는 얎플늬쌀읎션에 대한 예는 [JMS API 와 섞션빈을 사용하는 얎플늬쌀읎션]륌
찞고하띌.
메시지 셀렉터는 ì–Žë–€ 표현법을 포핚하고 있는 String 객첎읎닀. 읎 표현법은 SQL92 조걎
표현 구묞(SQL92 conditional expression syntax)의 부분집합을 Ʞ반윌로 만듀얎졌닀.
아래 예에서 사용된 메시지 셀렉터는 NewsType 의 값읎 Sports 거나 Opinion 읞
메시지듀을 선택하게 된닀.
NewsType = ‘Sports’ OR NewsType = ‘Opinion’
createConsumer 메소드와 createDurableSubscriber 메소드는 메시지 소비자륌 생성할 때
메시지 셀렉터륌 섀정할 수 있게 되얎 있닀.
메시지 셀렉터가 섀정되고 나멎, 메시지 소비자는 헀더 혹은 속성 값읎 핎당 메시지 셀렉터에
맞는 메시지만 수신하게 된닀. ([메시지 헀더] 장곌 [메시지 속성] 장을 확읞하띌.) 메시지
셀렉터는 메시지 바디의 낎용에 Ʞ반한 필터링을 할 수는 없닀.
JMS 메시지 (JMS Message)
- 15 -
JMS 얎플늬쌀읎션의 궁극적읞 목적은 닀륞 얎플늬쌀읎션에서 사용될 수 있는 메시지륌
생산하고 소비하는 것읎닀. JMS 메시지는 닚순하멎서도 아죌 유연한 Ʞ볞 형식윌로
만듀얎젞 있는데, 읎Ʞ종 플랫폌에 섀치된 비 JMS 얎플늬쌀읎션에서 사용되는 메시지
형식도 생성할 수 있닀.
JMS 메시지는 ì„ž 부분윌로 나뉘얎진닀; 헀더(header), 속성(properties), 귞늬고
바디(body)읎닀. 헀더만읎 필수적윌로 졎재핎알 한닀. 읎 장의 나뚞지 부분듀은 읎 ì„ž 가지
부분듀에 대핮 닀룰 것읎닀.
메시지 헀더, 속성, 바디에 대한 상섞한 낎용은 Message 읞터페읎슀의 API 묞서륌 확읞하Ꞟ
바란닀.
메시지 헀더 (Message Headers)
JMS 메시지 헀더에는 큎띌읎얞튞와 프로바읎더가 메시지륌 확읞하고 전달하는 데에
사용하는 믞늬 정의된 필드듀곌 귞에 대한 값듀읎 입력된닀. 표 47-1 은 JMS 메시지 헀더의
필드듀곌 귞에 대한 값읎 얎디에서 섀정되는지에 대한 낎용을 볎여쀀닀. 예륌 듀얎, 몚든
메시지는 유음한 식별자(unique identifier)륌 갖고 있는데, 읎는 헀더 필드의
JMSMessageID 의 값윌로 입력된닀. 또 닀륞 필드읞 JMSDestination 의 값은 메시지가
전달된 큐 혹은 토픜에 대한 정볎륌 나타낞닀. 닀륌 필드듀은 시간 정볎나 우선 순위 등을
나타낞닀.
각 헀더 필드듀은 setter 와 getter 메소드듀곌 연ꎀ되얎 있는데, 읎에 대한 낎용듀은
Message 읞터페읎슀의 묞서에 Ʞ술되얎 있닀. 몇몇 헀더 필드듀은 큎띌읎얞튞에 의핎
섀정되도록 되얎 있지만, 많은 겜우 send 나 publish 메소드가 혞출될 때 자동윌로 섀정되며,
읎렇게 섀정되는 값듀은 큎띌읎얞튞가 섀정한 값을 덮얎 쓰게 된닀.
헀더 필드 섀정 죌첎
JMSDestination send 혹은 publish 메소드
JMSDeliveryMode send 혹은 publish 메소드
JMSExpiration send 혹은 publish 메소드
JMSPriority send 혹은 publish 메소드
JMSMessageID send 혹은 publish 메소드
JMSTimestamp send 혹은 publish 메소드
JMSCorrelationID 큎띌읎얞튞
JMSReplyTo 큎띌읎얞튞
JMSType 큎띌읎얞튞
JMSRedelivered JMS 프로바읎더
표 47-1 JMS 메시지 헀더 필드 값듀을 섀정하는 ê³³
- 16 -
메시지 속성 (Message Properties)
헀더에 입력된 필드와 값 왞에 추가적읞 정볎가 필요하닀멎 속성 값듀을 읎용할 수 있닀.
닀륞 메시징 시슀템곌의 혞환성을 위핎 속성값듀을 추가할 수도 있고, 혹은 메시지 셀렉터륌
위핎 속성 값을 추가할 수도 있닀. ([JMS 메시지 셀렉터] 장을 찞고하띌.) 메시지
셀렉터에서 사용될 속성값을 섀정하는 방법에 대핎서는 [JMS API 와 섞션빈을 사용하는
얎플늬쌀읎션]장을 찞고하띌.
JMS API 는 프로바읎더가 지원할 수 있는 몇몇 사전에 정의된 속성 읎늄듀을 제공하고 있닀.
사전 정의 속성값읎든 사용자 정의 속성값읎든 몚두 필수 항목은 아니닀.
메시지 바디 (Message Bodies)
JMS API 는 닀섯 가지의 메시지 바디 형식- 혹은 메시지 유형을 정의핎 두고 있는데,
읎것듀을 읎용하멎 닀양한 형식의 데읎터륌 송/수신할 수 있윌며, 읎믞 졎재하고 있는 메시지
형식곌도 혾환될 수 있닀. 표 47-2 에서 메시지 유형듀을 확읞할 수 있닀.
메시지 유형 바디 ë‚Žìš©
TextMessage java.lang.String 객첎 (예륌 듀얎 XML 파음의 ë‚Žìš©)
MapMessage
읎늄(name)-값(value) 쌍윌로 읎룚얎진 정볎듀. 읎늄은 String 객첎읎고 값은 Java
프로귞래밍 얞얎의 원시 자료형읎닀. Enumerator 륌 읎용하여 순찚적윌로 접귌할 수도
있고 읎늄에 귌거하여 묎작위로 접귌할 수도 있닀. 입력된 정볎의 순서는 ì •í•Žì ž 있지
ì•Šë‹€.
BytesMessage
핎석되지 않은 바읎튞듀의 슀튞늌. 읎 메시지 유형은 말 귞대로 Ʞ졎의 메시지 형식에
맞추Ʞ 위핎 바디륌 읞윔딩 한닀.
StreamMessage Java 프로귞래밍 얞얎의 원시 자료형의 슀튞늌. 순찚적윌로 입력되고 순찚적윌로 읜힌닀.
ObjectMessage Java 프로귞래밍 얞얎에서 사용하는 Serializable 객첎.
Message
없음. 헀더 필드듀곌 속성듀로만 읎룚얎짐. 메시지 바디가 필요치 않은 겜우에 유용하게
사용할 수 있닀.
표 47-1 JMS 메시지 유형듀
JMS API 에는 각 유형의 메시지륌 생성하고 ê·ž 낎용을 채욞 수 있는 메소드듀을 포핚되얎
있닀. 예륌 듀얎, TextMessage 륌 생성하여 전송하렀멎, 닀음곌 같은 윔드륌 읎용하여알
한닀.
TextMessage message = session.createTextMessage ();
message.setText (msg_text); // msg_text 는 String 객첎읎닀.
producer.send (message);
메시지 소비가 완료되멎, 메시지는 원형의(generic) Message 객첎로서 도착하게 되는데,
적절한 메시지 유형윌로 캐슀팅하여 사용핎알 한닀. 메시지 컚텐잠륌 추출하Ʞ 위핎 한 개
혹은 몇 개의 getter 메소드륌 읎용할 수 있닀. 닀음 윔드는 getText 메소드륌 사용하는 예
읎닀.
- 17 -
Message m = consumer.receive();
if (m instanceof TextMessage) {
TextMessage message = (TextMessage) m;
System.out.println("Reading message: " + message.getText());
} else {
// Handle error
}
JMS QueueBrowser
큐로 전송된 메시지듀은 핎당 큐에 대한 메시지 소비자가 ê·ž 메시지듀을 소비하Ʞ 전 까지 큐
안에 낚아있게 된닀. JMS API 는 큐 낎에 있는 메시지듀을 탐색하고 각 메시지듀의 헀더
값듀을 확읞할 수 있는 QueueBrowser 객첎륌 제공한닀. QueueBrowser 객첎는
Session.createBrowser 메소드륌 읎용하여 생성할 수 있닀. 예륌 듀멎 닀음곌 같닀.
QueueBrowser browser = session.createBrowser (queue);
QueueBrowser 륌 사용하는 예제는 [Queue 낎의 메시지륌 탐색하는 ê°„ë‹ší•œ 예제] 장에서
찟아볌 수 있닀.
createBrowser 메소드는 QueueBrowser 륌 생성할 때 두 번짞 입력값윌로 메시지
셀렉터륌 지정할 수 있닀. 메시지 셀렉터에 대한 자섞한 낎용은 [JMS 메시지 셀렉터] 장을
찞고하띌.
JMS API 는 토픜을 탐색하Ʞ 위한 메컀니슘은 제공하지 않는닀. 토픜에 등록되는
메시지듀은 볎통 등록되자마자 사띌진닀. 메시지륌 소비할 메시지 소비자듀읎 등록되얎 있지
않닀멎, JMS 프로바읎더가 알아서 메시지듀을 제거한닀. 지속 구독 방식을 읎용하멎 메시지
소비자 없읎도 토픜 낎에 메시지가 ë‚šì•„ 있을 수 있지만, 여전히 메시지륌 확읞할 수 있는
방법은 졎재하지 않는닀.
JMS 예왞 처늬
JMS API 메소드듀에 의핎 던젞지는 예왞의 최상위 큎래슀는 JMSException 읎닀.
JMSException 륌 catch 하멎 JMS API 와 ꎀ렚된 몚든 예왞 상황을 처늬할 수 있닀.
API 묞서에 Ʞ술되얎 있는 JMSException 하위 큎래슀듀은 닀음곌 같닀.
 IllegalStateException
 InvalidClientIDException
 InvalidDestinationException
 InvalidSelectorException
 JMSSecurityException
 MessageEOFException
 MessageFormatException
 MessageNotReadableException
- 18 -
 MessageNotWriteableException
 ResourceAllocationException
 TransactionInProgressException
 TransactionRolledBackException
튜토늬얌 낎의 몚든 예제듀은, 귞렇게 하는 것읎 합당한 겜우, JMSException 을 catch 하고
처늬하고 있닀.
견고한 JMS 얎플늬쌀읎션 작성하Ʞ
읎 장에서는 얎플늬쌀읎션을 작성하는 데에 필요한 음정 수쀀의 안정성곌 성능을 달성하Ʞ
위핎 JMS API 륌 사용하는 방법에 대핮 닀룰 것읎닀. 많은 사람듀읎 당 한번 확싀하게
전달되얎알 하는 메시지듀읎 유싀되거나 쀑복 전송되는 묞제 때묞에 JMS 얎플늬쌀읎션을
구현하여 사용한닀. JMS API 가 읎륌 위한 Ʞ능듀을 제공하Ʞ 때묞읎닀.
메시지륌 생성하는 데에 가장 신뢰할 수 있는 방법은 메시지륌 튞랜잭션 낎에서
유지되도록(PERSISTENT) 하며 전송하는 것읎닀. JMS 메시지듀은 Ʞ볞적윌로
PERSISTENT 읎닀. 튞랜잭션읎띌는 것은 메시지륌 전송하고 수신하는 것곌 같읎 음렚의
작동을 묶얎서 하나의 작업 닚위로 만드는 것읞데, 귞렇게 핚윌로썚 몚든 작업듀읎
성공하거나 싀팚하도록 하는 것읎닀. 읎에 대한 자섞한 낎용은 [메시지 지속성 지정하Ʞ]
장곌 [JMS API 의 로컬 튞랜잭션 읎용하Ʞ] 장을 찞고하띌.
메시지륌 소비하는 방법 쀑 가장 신뢰할 수 있는 방법은 큐나 토픜에 대한 지속 구독을
튞랜잭션 낎에서 처늬하는 것읎닀. 읎에 대한 상섞한 낎용은 [임시 목적지 만듀Ʞ] 장곌
[지속 구독 방법] 장, 귞늬고 [JMS API 의 로컬 튞랜잭션 읎용하Ʞ] 장을 찞고하띌.
좀 닀륞 겜우에는 낮은 수쀀의 신뢰도륌 읎용하여 였버헀드륌 쀄읎고 성능을 향상시킬 수도
있닀. 메시지륌 여러 우선순위로 나누얎 볎낌 수 있고([메시지 우선순위 정하Ʞ] ì°žì¡°), 또
음정 시간읎 지나멎 메시지가 만료되도록 할 수도 있닀.([메시지가 만료되도록 섀정하Ʞ]
ì°žì¡°)
JMS API 는 닀양한 종류와 수쀀의 신뢰도륌 얻을 수 있도록 여러 가지 방법듀을 제공한닀.
읎 장은 JMS API 륌 읎용하여 신뢰도 높은 얎플늬쌀읎션을 개발하Ʞ 위한 Ʞ볞적읞 방법곌
좀 더 진볎된 방법을 닀룚는 두 절로 나뉘얎젞 있닀.
읎제 소개될 낎용은 JMS 큎띌읎얞튞에 적용될 수 있는 특징듀을 닀룚고 있닀. 읎듀 쀑
몇몇은 JavaEE 얎플늬쌀읎션에서는 좀 닀륎게 동작할 수도 있닀. ê·ž 찚읎점은 읎 장곌
더불얎 [JavaEE 얎플늬쌀읎션에서 JMS API 사용하Ʞ] 장에서 심도 있게 닀룰 것읎닀.
안정성있는 메시징을 위한 Ʞ볞 메컀니슘
메시지 전달을 하는 데 안정성을 볎장하Ʞ 위한 Ʞ볞적읞 메컀니슘은 닀음곌 같닀.
- 19 -
 메시지 확읞 제얎하Ʞ: 메시지 확읞을 닀양한 수쀀윌로 제얎할 수 있닀.
 메시지 Persistence 지정하Ʞ: 메시지가 (파음읎나 DB 낎에) 지속되도록 지정할 수
있는데, 읎 말은 프로바읎더에 묞제가 발생하더띌도 메시지가 유싀되지 않음을
의믞한닀.
 메시지 우선순위 섀정하Ʞ: 닀양한 수쀀의 메시지 우선순위륌 지정할 수 있는데,
결곌적윌로 메시지가 전달되는 순서에 영향을 쀄 수 있닀.
 메시지 만료 허용하Ʞ: 메시지의 만료 시간을 지정할 수 있얎 너묎 였래된 메시지는
전달되지 않도록 할 수 있닀.
 임시 목적지 생성하Ʞ: 컀넥션읎 생성되얎 사용되고 있는 시간 동안에만 유지되는
임시 저장소륌 생성할 수 있닀.
메시지 확읞 제얎하Ʞ(Controlling Message Acknowledgement)
확읞되Ʞ 전 까지는 메시지에 대한 소비가 성공적읎었닀고 간죌되지 않는닀. 성공적읞
메시지 소비는 볎통 ì„ž 닚계륌 거쳐 음얎난닀.
1. 큎띌읎얞튞가 메시지륌 수신한닀.
2. 큎띌읎얞튞가 메시지륌 처늬한닀.
3. 메시지가 확읞되었닀. 확읞 처늬는 섞션에 지정된 메시지 확읞 몚드에 따띌 JMS
프로바읎더나 큎띌읎얞튞 둘 쀑 하나에 의핎 시작된닀.
튞랜잭션 낎에서 처늬되고 있는 ì„žì…˜([JMS API 로컬 튞랜잭션 사용하Ʞ] 장 ì°žì¡°)에서는,
튞랜잭션읎 컀밋 처늬되멎 자동적윌로 확읞 처늬가 읎룚얎진닀. 튞랜잭션읎 례백 처늬되멎
몚든 메시지듀은 재전송된닀.
튞랜잭션 낎에서 처늬되지 않는 섞션은 createSession 메소드의 두 번짞 입력값에 지정된
값에 따띌 메시지 확읞 처늬가 읎룚얎진닀. 여Ʞ에는 ì„ž 가지 입력값읎 사용될 수 있닀.
 Session.AUTO_ACKNOWLEDGE: 큎띌읎얞튞의 receive 메소드가 성공적윌로
늬턎 되었거나, 메시지륌 처늬하Ʞ 위핎 혞출된 메시지 늬슀너가 성공적윌로 늬턎
되멎 자동적윌로 메시지 확읞된닀.
AUTO_ACKNOWLEDGE ì„žì…˜ 낎에서 동Ʞ화 수신(synchronous receive)을
읎용하멎 위에서 얞꞉한 메시지 소비가 ì„ž 닚계로 읎룚얎진닀는 규칙곌는 닀륎게
동작한닀. 읎 겜우에는, 메시지 죌신곌 확읞읎 한 닚계에서 같읎 발생하는데, ê·ž 뒀에
메시지에 대한 처늬가 읎룚얎진닀.
 Session.CLIENT_ACKNOWLEDGE: 큎띌읎얞튞가 메시지의 acknowledge
메소드륌 직접 혞출핚윌로썚 확읞 처늬가 읎룚얎진닀. 읎 몚드에서는 확읞읎 ì„žì…˜
레벚에서 음얎난닀. 소비된 메시지에 대핮 확읞 처늬륌 하게 되멎 자동적윌로 ê·ž
섞션에서 소비된 몚든 메시지듀의 수신에 대핮 확읞 처늬가 된닀. 예륌 듀얎, 메시지
소비자가 ì—Ž 개의 메시지륌 소비하던 쀑 닀섯 번짞에서 확읞 처늬륌 수행하멎 ì—Ž
개의 몚든 메시지에 대핮 확읞 처늬가 읎룚얎진닀.
ì°žê³  – JavaEE 플랫폌에서, CLIENT_ACKNOWLEDGE 섞션은 얎플늬쌀읎션 큎띌읎얞튞에서만 사용할 수 있윌며,
웹 컎포넌튞나 엔터프띌읎슈 빈에서는 사용할 수 없닀.
- 20 -
 Session.DUPS_OK_ACKNOWLEDGE: 읎 옵션을 읎용하멎 섞션은 전달된
메시지에 대핮 나쀑에 확읞 처늬륌 하게 된닀. 읎것을 읎용하멎 JMS 프로바읎더에
묞제가 생Ʞ는 겜우 메시지가 쀑복 발송되는 겜우가 있는데, 귞렇Ʞ 때묞에 반드시
쀑복 메시지륌 적절히 처늬할 수 있는 큎띌읎얞튞에서만 사용되얎알 한닀. (만앜
JMS 프로바읎더가 메시지륌 재전송한닀멎, JMS 메시지 헀더의 JMSRedelivered
값읎 true 로 섀정되얎알 한닀.) 읎 옵션은 메시지 쀑복 전송을 막Ʞ 위한 작업
였버헀드륌 쀄읎는 데 도움을 쀀닀.
큐로부터 메시지가 수신되었지만 섞션읎 끝날 때까지 확읞 처늬가 읎룚얎지지 않윌멎, JMS
프로바읎더가 읎듀을 볎유하고 있닀가 닀음에 소비자가 큐에 접귌할 때 메시지륌 닀시
전송하게 된닀. 프로바읎더는 지속형 TopicSubscriber 듀에서 사용되는 섞션읎 종료된
겜우에도 처늬 확읞되지 않은 메시지가 있윌멎 위와 같읎 볎유한닀. ([지속 구독 생성하Ʞ]장
ì°žì¡°) 지속 구독읎 아닌 TopicSubscriber 륌 위한 메시지듀읎 처늬가 확읞되지 않은 채로
섞션읎 완료되게 되멎 핎당 메시지듀은 버렀지게 된닀.
큐나 지속형 구독 방식을 사용하고 있는 겜우, Session.recover 메소드륌 읎용하여 튞랜잭션
처늬되지 않는 섞션을 종료하고 처늬 확읞되지 않은 메시지부터 닀시 시작하도록 할 수 있닀.
싀제로 섞션의 전송된 메시지듀읎 읎전에 확읞된 메시지 읎후로는 전송되지 않은 것윌로
늬셋 된닀. ê·ž 후에 전송되는 메시지는 원래 전송되었던 상황곌는 좀 닀륌 수 있는데,
메시지가 만료되었거나 혹은 높은 우선 순위의 메시지가 뚌저 전달될 수도 있Ʞ 때묞읎닀.
지속형읎 아닌 TopicSubscriber 의 겜우에는 섞션읎 recover 될 때 확읞되지 않은
메시지듀은 버렀질 수도 있닀.
[메시지 처늬 확읞 예] 장에서 얞꞉되는 예제 프로귞랚에서 메시지 처늬가 완료되Ʞ 전
까지는 메시지 처늬 확읞을 하지 않도록 하는 두 가지 방법을 확읞할 수 있닀.
메시지 Persistence 지정하Ʞ(Specifying Message Persistence)
JMS API 는 JMS 프로바읎더에 묞제가 발생하였을 겜우 메시지가 버렀질지 여부륌
결정하는 두 가지 전송 몚드륌 지원한닀. 읎 몚드듀은 DeliveryMode 읞터페읎슀의 필드로
정의되얎 있닀.
 PERSISTENT 몚드는, Ʞ볞적윌로 읎 몚드가 사용되는데, JMS 프로바읎더가
정지하거나 묞제가 발생하는 겜우에도 메시지가 유싀되지 않도록 별도의 처늬륌
하도록 한닀. 읎 몚드륌 읎용하여 전송되는 메시지듀은 전송되는 곌정에서 안정적읞
저장 장치(storage)에 쌓읎게 된닀.
 NON_PERSISTENT 몚드는 JMS 프로바읎더가 메시지륌 저장하거나
프로바읎더에 묞제가 발생했을 때 메시지가 유싀되지 않을 것을 볎장할 것을
요구하지 않는닀.
읎 몚드듀은 두 가지 방법윌로 지정될 수 있닀.
 메시지 생산자에 의핎 전달되는 몚든 메시지듀에 동음한 전달 몚드가 지정되도록
하Ʞ 위핎 MessageProducer 읞터페읎슀의 setDeliveryMode 메소드륌 읎용할 수
있닀. 예륌 듀얎, 닀음 윔드는 생산자의 전달 몚드륌 NON_PERSISTENT 로
- 21 -
지정한닀.
producer.setDeliveryMode (DeliveryMode.NON_PERSISTENT);
 특정한 메시지에 대핮 별도로 몚드륌 지정하Ʞ 위핎 ꞎ 형식의 publish 메소드륌
읎용할 수도 있닀. 두 번짞 입력값읎 전달 몚드읎닀. 예륌 듀얎, 아래 send 메소드륌
혞출하는 윔드는 message 가 NON_PERSISTENT 몚드로 전달되도록 한닀.
producer.send (message, DeliveryMode.NON_PERSISTENT, 3, 10000);
ì„ž 번짞와 ë„€ 번짞 입력값듀은 우선순위와 만료 시간읞데, 닀음 두 개 장에서 닀뀄질
것읎닀.
전달 몚드륌 지정하지 않윌멎 Ʞ볞적윌로 PERSISTENT 몚드가 사용된닀. 성능을 높읎고
저장소의 였버헀드륌 쀄읎고자 한닀멎 NON_PERSISTENT 몚드륌 사용하는 것읎
바람직하닀. 하지만 메시지가 유싀되얎도 묎방한 겜우에만 사용핎알 할 것읎닀.
메시지 우선 순위 섀정하Ʞ(Setting Message Priority Levels)
JMS 프로바읎더가 ꞎ꞉ 메시지륌 뚌저 전달하도록 메시지의 우선 순위륌 지정할 수 있닀.
메시지 우선 순위륌 정하는 방법에는 닀음 두 가지가 있닀.
 MessageProducer 의 setPriority 메소드륌 읎용하여 메시지 생산자에 의핎
전달되는 몚든 메시지가 동음한 우선 순위륌 갖도록 할 수 있닀. 예륌 듀얎, 아래
윔드는 producer 의 우선 순위륌 7 로 섀정한닀.
producer.setPriority (7);
 특정 메시지의 우선 순위륌 지정하Ʞ 위핎 ꞎ send 나 publish 메소드륌 읎용할 수
있닀. ì„ž 번짞 입력값읎 우선순위읎닀. 예륌 듀얎, 아래 send 메소드 혞출은
message 의 우선 순위륌 3 윌로 지정한닀.
producer.send (message, DeliveryMode.NON_PERSISTENT, 3, 10000);
0(가장 낮음)부터 9(가장 높음)까지 10 개의 닚계륌 지정할 수 있닀. 우선 순위륌 지정하지
않는닀멎 Ʞ볞적윌로 4 로 처늬된닀. JMS 프로바읎더듀은 우선 순위가 높은 메시지륌 낮은
메시지볎닀 뚌저 볎낎렀고 시도할 것읎닀. 하지만 반드시 ê·ž 정확한 순서대로 전달되지는
않을 것읎닀.
메시지 만료 허용하Ʞ(Allowing Message Expiration)
Ʞ볞적윌로 메시지듀은 절대로 만료되지 않는닀. 하지만, 음정 Ʞ간읎 지나멎 쓞몚 없얎지는
메시지가 있닀고 한닀멎, 귞에 대핮 만료 시간을 지정하고 싶을 것읎닀. 읎 역시 두 가지
방법윌로 섀정할 수 있닀.
 MessageProducer 읞터페읎슀의 setTimeToLive 메소드륌 읎용하여 특정 메시지
생산자에 의핎 전달되는 몚든 메시지의 만료 시간을 동음하게 지정할 수 있닀. 예륌
듀얎 아래 윔드는 producer 가 전달하는 몚든 메시지듀의 수명을
1 분(=60000ms)로 지정할 수 있닀.
producer.setTimeToLive (60000);
- 22 -
 send 혹은 publish 메소드륌 읎용하여 특정 메시지의 만료 시간을 지정할 수 있닀.
ë„€ 번짞 입력 값읎 밀늬 섞컚드로 지정되는 만료 시간읎닀. 예륌 듀얎 아래 윔드는
메시지의 수명을 10 쎈로 제한한닀.
producer.send (message, DeliveryMode.NON_PERSISTENT, 3, 10000);
timeToLive 의 값을 0 윌로 섀정하멎 ê·ž 메시지는 만료되지 않는닀.
메시지가 전달될 때, timeToLive 에 현재 시각에 만료 시간 값을 더한 값읎 섀정된닀. 지정된
만료시간 읎후로도 전송되지 않은 메시지는 몚두 폐Ʞ된닀. 쓞몚 없는 메시지륌
폐Ʞ핚윌로썚 저장 공간곌 계산량을 볎전할 수 있게 된닀.
임시 목적지 생성하Ʞ(Creating Temporary Destination)
볎통 JMS 목적지(큐와 토픜)는 프로귞랚적윌로 만듀얎지는 것읎 아니띌 ꎀ늬자에 의핎
만듀얎진닀. 볎통 JMS 프로바읎더듀은 목적지륌 생성하거나 제거할 수 있는 도구륌
제공하는데, 읎런 툎듀은 였랫동안 지속되는 목적지륌 위핎 사용된닀.
JMS API 는 읎뿐만 아니띌 특정한 컀넥션읎 생성된 후 삎아있는 동안에만 유지되는
목적지(TemporaryQueue 나 TemporaryTopic)을 생성하는 Ʞ능도 제공한닀. 읎 임시
목적지듀은 Session.createTemporaryQueue 메소드나 Session.createTemporaryTopic
메소드륌 읎용하여 만듀 수 있닀.
임시 저장소 낎에 있는 메시지륌 소비할 수 있는 메시지 소비자는 핎당 저장소륌 생성하Ʞ
위핎 사용했던 컀넥션을 읎용하여 생성된 소비자듀뿐읎닀. 몚든 메시지 생산자듀읎 임시
목적지로 메시지륌 전송할 수 있닀. 임시 목적지가 속핎 있는 컀넥션을 닫윌멎(close), 임시
목적지 역시 닫히게 되고 ê·ž 안에 저장되얎 있던 낎용듀은 몚두 사띌진닀.
임시 목적지는 닚순한 요청/응답 메컀니슘을 구현하Ʞ 위핎 사용될 수 있닀. 임시 목적지륌
생성하고, 메시지의 JMSReplyTo 헀더 값을 ê·ž 목적지로 지정한 ë’€ 전송하멎, ê·ž 메시지륌
수신하여 소비한 메시지 소비자가 ê·ž 값을 읎용하여 닀시 ê·ž 임시 목적지로 응답 메시지륌
전송할 수 있닀. 읎 때 메시지 소비자는 JMSCorrelationID 헀더 필드 값을 원래 전달되었던
메시지의 JMSMessageID 값윌로 입력하여 원래 메시지륌 찞조하도록 할 수도 있닀. 예륌
듀얎, onMessage 메소드에서 session 을 하나 생성하여 메시지륌 볎낞 쪜윌로 응답을 볎낌
수 있닀. 닀음 윔드에서와 같읎 말읎닀.
producer = session.createProducer (msg.getJMSReplyTo ());
replyMsg = session.createTextMessage ("Consumer " +
"processed message: " + msg.getText ());
replyMsg.setJMSCorrelationID (msg.getJMSMessageID ());
producer.send (replyMsg);
더 상섞한 낎용은 [Java 메시지 서비슀 예제] 장을 찞고하Ꞟ 바란닀.
안정성을 위한 진볎된 메컀니슘
- 23 -
메시지 전달을 볎닀 안정적윌로 하Ʞ 위한 고꞉ 메컀니슘은 닀음곌 같닀.
 지속 구독 생성하Ʞ: 위에서 읎믞 얞꞉하였지만, 토픜에 대핮 지속 구독(durable
topic subscription)을 할 수 있는데, 읎륌 읎용하멎 구독자가 싀행되고 있지 않은
상태에서 발행된 메시지도 수신할 수 있게 된닀. 지속 구독 방식은 발행/구독 방식의
메시지 도메읞에도 큐륌 사용하는 정도의 안정성을 볎장핎 쀀닀.
 로컬 튞랜잭션 읎용하Ʞ: 로컬 튞랜잭션을 읎용하멎 메시지륌 전송하고 수신하는
음렚의 작업듀을 원자화된 하나의 작업윌로 묶을 수 있닀. 작업 쀑 하나가
싀팚하Ʞ만 하멎 몚든 작업읎 례백 된닀.
지속 구독 생성하Ʞ(Creating Durable Subscriptions)
발행/구독 얎플늬쌀읎션듀읎 몚든 발행된 메시지듀을 수신할 수 있도록 볎장하Ʞ 위핎서는,
발행자듀에 PERSISTENT 전달 몚드륌, 귞늬고 구독자에게는 지속 구독을 사용하도록
하여알 한닀.
토픜읎 목적지로 섀정되얎 있는 겜우에서는 Session.createComsumer 메소드는 지속되지
않는 구독자(nondurable subscriber)륌 생성하게 된닀. 지속되지 않는 구독자는 자신읎
싀행되고 있는 순간에 발행된 메시지만 수신할 수 있닀.
좀 더 많은 자원을 사용하Ʞ는 하지만, Session.createDurableSubscriber 메소드륌
읎용하멎 지속되는 구독자륌 생성할 수 있닀. 지속 구독을 읎용할 겜우에는 동음 시점에
싀행되고 있는 구독자는 였직 하나여알 한닀.
지속되는 구독자는 JMS 프로바읎더에 유지되고 있는 유음한 식별자(unique identity)륌
지정핚윌로썚 지속 구독을 등록할 수 있닀. ê·ž 뒀에 였는 동음한 식별자륌 가지고 있는
구독자는 읎전 구독자가 작업하지 않고 낚겚둔 낎용을 읎얎서 구독하게 된닀. 만앜 지속
구독을 하고 있는 싀행쀑읞 구독자가 하나도 없닀멎, JMS 프로바읎더는 구독자가
수신하거나 혹은 메시지가 완료될 때까지 구독자듀의 메시지륌 유지하게 된닀.
지속 구독을 위한 유음한 식별자륌 만드는 방법은 아래 항목을 섀정하멎 된닀.
 컀넥션을 위한 큎띌읎얞튞 ID
 구독자륌 위한 토픜의 읎늄곌 구독명
특정 큎띌읎얞튞에 대한 컀넥션 팩토늬륌 위핎 큎띌읎얞튞 ID 는 명령 싀행쀄읎나 ꎀ늬자
윘솔을 읎용하여 섀정할 수 있닀.
컀넥션곌 섞션을 생성하Ʞ 위핎 읎 컀넥션 팩토늬륌 읎용한 닀음, 두 개의 입력값을 갖는
createDurableSubscriber 메소드륌 혞출한닀: 토픜곌 구독명을 나타낮는 String 값을
입력한닀.
String subName = "MySub";
MessageConsumer topicSubscriber = session.createDurableSubscriber (myTopic, subName);
- 24 -
subscriber 는 Connection 객첎나 TopicConnection 객첎의 start 메소드륌 혞출하멎
활성화된닀. 나쀑에 읎 subscriber 객첎에 close 륌 혞출할 수 있닀.
topicSubscriber.close ();
JMS 프로바읎더는 큐에 전송된 메시지륌 저장했던 것곌 같읎 토픜윌로 전송되거나 발행된
메시지듀을 저장한닀.
만앜 프로귞랚읎나 닀륞 얎플늬쌀읎션읎 동음한 컀넥션 팩토늬, 큎띌읎얞튞 ID, 토픜,
구독명을 읎용하여 createDurableSubscriber 메소드륌 혞출하멎, JMS 프로바읎더는 ê·ž
구독자가 비활성 상태였을 때 발행되었던 몚든 메시지륌 전송하게 된닀.
지속 구독을 삭제하렀멎, 뚌저 구독자륌 close 한 닀음, 구독명을 읎용하여 unsubscribe
메소드륌 혞출하멎 된닀.
topicSubscriber.close ();
session.unsubscribe (“MySub”);
unsubscribe 메소드는 프로바디얎가 핎당 구독자륌 위핎 유지하고 있던 상태 정볎륌
삭제하도록 한닀.
귞늌 47-6 곌 47-7 은 비지속 구독자와 지속 구독자간의 찚읎점을 볎여죌고 있닀. 볎통의
겜우-비지속 구독자의 겜우에는, 구독자와 구독읎 동음 시점에 시작되고 종료되며, 싀제로
동음하닀. 구독자가 닫히게 되었을 때, 구독 역시 끝나게 된닀. 여Ʞ서 create 는 토픜에 대한
Session.createConsumer 륌 의믞하고 close 는 MessageConsumer.close 륌 의믞한닀. 첫
번짞 close 와 두 번짞 create 사읎에 발행된 메시지듀은 ì–Žë– í•œ 것도 구독자에 의핎
소비되지 않는닀. 귞늌 47-6 에서 구독자는 M1, M2, M5, M6 메시지듀을 소비하지만
M3 곌 M4 는 유싀된닀.
지속 구독의 겜우, 구독자는 닫혔닀가 닀시 생성될 수 있윌며 얎플늬쌀읎션읎 unsubscribe
메소드륌 혞출하Ʞ 전 까지는 구독읎 지속되고 메시지듀을 계속 유지하게 된닀. 귞늌 47-
7 에서 create 는 Session.createDurableSubscriber 륌 의믞하고, close 는
MessageConsumer.close 륌, 귞늬고 unsubscribe 는 Session.unsubscribe 륌 의믞한닀.
구독자가 닫혀 있던 순간에 발행되었던 메시지듀을 구독자가 닀시 생성되멎 전달되게 된닀.
귞래서 구독자가 닫혀 있는 상태에서 전달되었던 M2, M4, M5 메시지듀도 유싀되지 않는
것읎닀.
- 25 -
지속 구독을 읎용하는 JavaEE 얎플늬쌀읎션에 대한 예제는, [메시지 확읞 예제], [지속 구독
예제], 귞늬고 [JMS API 와 섞션빈을 사용하는 얎플늬쌀읎션] 장을 찞고하Ʞ 바란닀.
JMS API 로컬 튞랜잭션 읎용하Ʞ(Using JMS API Local Transaction)
여러 개의 음렚의 작업듀은 튞랜잭션읎띌 불늬는 하나의 원자화된 작업윌로 묶음 수 있닀.
만앜 ì–Žë–€ 하나의 작업읎 싀팚하게 되멎 튞랜잭션 낎의 몚든 작업읎 례백 되고, 몚든 작업읎
처음부터 닀시 시작될 수 있닀. 몚든 작업듀읎 성공적윌로 끝나멎 튞랜잭션은 컀밋 된닀.
JMS 큎띌읎얞튞 낎에서도 메시지의 전송곌 수신을 하나의 닚위로 묶Ʞ 위핎 로컬
튞랜잭션을 읎용할 수 있닀. JMS API 의 Session 읞터페읎슀에는 JMS 큎띌읎얞튞에서
사용할 수 있는 commit 곌 rollback 메소드가 정의되얎 있닀. 튞랜잭션 commit 은 몚든
메시지듀읎 전송되었고 몚든 소비된 메시지듀읎 확읞되었음을 의믞한닀. 튞랜잭션
rollback 은 몚든 메시지듀읎 파ꎎ되고 몚든 소비된 메시지듀읎 복구되얎 만료되지 않는 읎상
닀시 전달되는 것을 의믞한닀. ([메시지 만료 허용하Ʞ]장 ì°žì¡°)
튞랜잭션 처늬되는 섞션은 얞제나 튞랜잭션에 ꎀ여하게 된닀. commit 읎나 rollback
메소드가 혞출되멎, ê·ž 슉시 싀행 쀑읎던 튞랜잭션은 종료되고 새로욎 튞랜잭션읎 시작된닀.
튞랜잭션 처늬되고 있는 섞션을 닫윌멎 아직 완료되지 않은 전송/수신 작업 몚두륌 포핚한
현재 진행 쀑읞 튞랜잭션에 대핮 례백 처늬륌 하게 된닀.
엔터프띌읎슈 자바빈 컎포넌튞 낎에서는 Session.commit 곌 Session.rollback 메소드륌
사용할 수 없닀. ê·ž 대신 분산 튞랜잭션(distributed transaction)을 읎용할 수 있는데, ê·ž
낎용은 [JavaEE 얎플늬쌀읎션 낎에서 JMS API 륌 사용하Ʞ] 장을 찞조하Ʞ 바란닀.
묌론 몇 개의 전송곌 수신을 하나의 JMS API 로컬 튞랜잭션 낎에 묶을 수 있닀. 귞렇게 할
겜우, 작업의 순서륌 멎밀히 삎펎볎아알 한닀. 튞랜잭션읎 몚든 전송곌 몚든 수신에 대핮
잡혀 있거나 항상 전송볎닀 수신읎 뚌저 음얎나게 된닀멎 아묎런 묞제가 없닀. 하지만
요청/응답 메컀니슘을 사용하렀고 하는 겜우에서는, 하나의 튞랜잭션 낎에서 메시지륌
전송하고 응답을 받Ʞ 위핎 Ʞ닀늬게 될 것읞데, 귞렇게 되멎 튞랜잭션읎 컀밋 될 때까지
전송 작업읎 완료될 수 없윌므로 프로귞랚읎 멈춰버늬게 된닀.(program will hang) 아래
윔드가 읎 예륌 볎여죌고 있닀.
// Don’t do this!
outMsg.setJMSReplyTo (replyQueue);
- 26 -
producer.send (outQueue, outMsg);
consumer = session.createConsumer (replyQueue);
inMsg = consumer.receive ();
session.commit ();
튞랜잭션읎 컀밋 되Ʞ 전에는 싀제적윌로 메시지 전송읎 처늬되지 ì•Šêž° 때묞에 튞랜잭션
낎에는 ì–Žë– í•œ 겜우에도 메시지 전송에 의졎하는 메시지 수신읎 있얎서는 안 된닀.
추가적윌로, 하나의 메시지에 대한 생산곌 소비는 동음 튞랜잭션의 부분읎 될 수 없닀.
튞랜잭션읎띌는 것은 JMS 큎띌읎얞튞와 JMS 프로바읎더 간에 음얎나는 것윌로 메시지에
대한 생산곌 소비 사읎에 개입하Ʞ 때묞읎닀. 귞늌 47-8 에서 읎 상혞작용을 볌 수 있닀.
Client1 에서 하나 혹은 ê·ž 읎상의 메시지듀을 하나 읎상의 목적지로 전송하는 것은 닚음
튞랜잭션윌로 묶음 수 있는데, 읎는 하나의 섞션을 읎용하는 JMS 프로바읎더에 대한 하나의
상혞작용만 수행하Ʞ 때묞읎닀. 비슷하게 Client2 가 하나 혹은 ê·ž 읎상의 목적지로부터 하나
읎상의 메시지륌 수신하는 것 역시 하나의 튞랜잭션윌로 묶음 수 있닀. 하지만 두 큎띌읎얞튞
사읎에 ì–Žë– í•œ 직접적읞 상혞작용읎 발생하지 않고, 사용하는 섞션도 각각 닀륎Ʞ 때묞에, 읎
둘 간에는 튞랜잭션읎 음얎날 수 없닀.
닀륞 말로 섀명하멎, 하나의 섞션에 대핮 메시지륌 생산하거나 소비하는 작업은
튞랜잭션윌로 처늬될 수 있지만, 서로 닀륞 섞션간에 메시지가 생산/소비되는 것은
튞랜잭션윌로 처늬될 수 없닀.
읎는 메시징곌 동Ʞ화된 프로섞싱(synchronized processing) 간의 Ʞ볞적읞 찚읎점읎닀.
데읎터륌 죌고 받Ʞ 위핎 서로 닚닚하게 연결하는 대신, 메시지 생산자와 소비자는 JMS
프로바읎더가 제공하는 필요한 메시지륌 당 한번만 전달하도록 볎장하는 안정적읞 ì ‘ê·Œ
방식을 읎용하는 것읎닀.
섞션을 생성할 때, 튞랜잭션 처늬륌 할 것읞지 아닌지륌 결정할 수 있닀. createSession
메소드의 첫 번짞 입력값읎 boolean 값읞데, 읎 값읎 true 읎멎 읎 섞션읎 튞랜잭션 처늬됚을
의믞한닀. 묌론 false 읎멎 튞랜잭션 처늬되지 않음을 의믞한닀. 두 번짞 입력값은 처늬 확읞
몚드읞데, 읎는 튞랜잭션 처늬되지 않는 섞션음 때에만 의믞가 있닀. ([메시지 확읞 제얎하Ʞ]
장 ì°žì¡°) 섞션읎 튞랜잭션윌로 지정되멎, 두 번짞 입력값은 묎시되며, 귞렇Ʞ 때묞에 읎런
겜우에는 두 번짞 입력 값을 0 윌로 지정하는 것읎 윔드륌 좀 더 읜Ʞ 쉜게 핮 쀄 것읎닀. 닀음
예에서와 같읎 말읎닀.
session = connection.createSession (true, 0);
로컬 튞랜잭션에 대한 commit 곌 rollback 메소드는 핎당 섞션에 연ꎀ되얎 있닀. 여러 개의
작업을 수행한닀 하더띌도 하나의 섞션만 읎용한닀멎 큐와 토픜에 대한 ìž‘ì—…ë“€ 역시 하나의
- 27 -
튞랜잭션윌로 묶음 수 있닀. 예륌 듀얎, 동음한 섞션의 큐로부터 메시지륌 수신하여 같은
섞션의 토픜윌로 메시지륌 전송하는 작업곌 같은 음렚의 작업듀도 튞랜잭션윌로 묶음 수
있닀는 말읎닀.
또, 메시지 늬슀너의 생성자에 큎띌읎얞튞 프로귞랚의 섞션을 입력하여 메시지 생산자륌
만드는 데 사용할 수도 있닀. 읎 방법을 읎용하여 비동Ʞ 메시지 소비자 낎에서 메시지륌
수신하고 전송하는 데에 동음한 섞션을 읎용할 수 있닀.
[로컬 튞랜잭션 예제] 장에서 JMS API 로컬 튞랜잭션을 읎용하는 예륌 확읞할 수 있닀.

More Related Content

Viewers also liked

2013 UX Design Trend Report Part 3_SYS4U I&C
2013 UX Design Trend Report Part 3_SYS4U I&C2013 UX Design Trend Report Part 3_SYS4U I&C
2013 UX Design Trend Report Part 3_SYS4U I&C
sys4u
 
iOS Human Interface Guidlines #14_SYS4U
iOS Human Interface Guidlines #14_SYS4UiOS Human Interface Guidlines #14_SYS4U
iOS Human Interface Guidlines #14_SYS4U
sys4u
 
2012 UX Design Trend Report Part 2_SYS4U I&C
2012 UX Design Trend Report Part 2_SYS4U I&C2012 UX Design Trend Report Part 2_SYS4U I&C
2012 UX Design Trend Report Part 2_SYS4U I&C
sys4u
 
Web Accessibility_SYS4U
Web Accessibility_SYS4UWeb Accessibility_SYS4U
Web Accessibility_SYS4U
sys4u
 
UIX UNIT_Several UI Teminologies Easy To Miss_SYS4U I&C
UIX UNIT_Several UI Teminologies Easy To Miss_SYS4U I&CUIX UNIT_Several UI Teminologies Easy To Miss_SYS4U I&C
UIX UNIT_Several UI Teminologies Easy To Miss_SYS4U I&C
sys4u
 
iOS_Human_Interface_Guidlines_#4_SYS4U
iOS_Human_Interface_Guidlines_#4_SYS4UiOS_Human_Interface_Guidlines_#4_SYS4U
iOS_Human_Interface_Guidlines_#4_SYS4U
sys4u
 
iOS Human Interface Guidlines #12_SYS4U
iOS Human Interface Guidlines #12_SYS4UiOS Human Interface Guidlines #12_SYS4U
iOS Human Interface Guidlines #12_SYS4U
sys4u
 
2012 UX Design Trend Report Part 1_SYS4U I&C
2012 UX Design Trend Report Part 1_SYS4U I&C2012 UX Design Trend Report Part 1_SYS4U I&C
2012 UX Design Trend Report Part 1_SYS4U I&C
sys4u
 
UX Planning Training Course_SYS4U I&C
UX Planning Training Course_SYS4U I&CUX Planning Training Course_SYS4U I&C
UX Planning Training Course_SYS4U I&C
sys4u
 
UX Layout Design_SYS4U
UX Layout Design_SYS4UUX Layout Design_SYS4U
UX Layout Design_SYS4U
sys4u
 
Introduction to Fork Join Framework_SYS4U I&C
Introduction to Fork Join Framework_SYS4U I&CIntroduction to Fork Join Framework_SYS4U I&C
Introduction to Fork Join Framework_SYS4U I&C
sys4u
 
iOS Human_Interface_Guidlines_#2_SYS4U
iOS Human_Interface_Guidlines_#2_SYS4UiOS Human_Interface_Guidlines_#2_SYS4U
iOS Human_Interface_Guidlines_#2_SYS4U
sys4u
 
JQuery륌 읎용하여 웹 위젯 작성하Ʞ_(죌)시슀포유아읎앀씚
JQuery륌 읎용하여 웹 위젯 작성하Ʞ_(죌)시슀포유아읎앀씚JQuery륌 읎용하여 웹 위젯 작성하Ʞ_(죌)시슀포유아읎앀씚
JQuery륌 읎용하여 웹 위젯 작성하Ʞ_(죌)시슀포유아읎앀씚
sys4u
 
iOS Human Interface Guidlines #8_SYS4U
iOS Human Interface Guidlines #8_SYS4UiOS Human Interface Guidlines #8_SYS4U
iOS Human Interface Guidlines #8_SYS4U
sys4u
 
iOS Human Interface Guidlines #11_SYS4U
iOS Human Interface Guidlines #11_SYS4UiOS Human Interface Guidlines #11_SYS4U
iOS Human Interface Guidlines #11_SYS4U
sys4u
 
iOS Human Interface Guidlines #7_SYS4U
iOS Human Interface Guidlines #7_SYS4UiOS Human Interface Guidlines #7_SYS4U
iOS Human Interface Guidlines #7_SYS4U
sys4u
 
Observer Design Pattern in Java_SYS4U
Observer Design Pattern in Java_SYS4UObserver Design Pattern in Java_SYS4U
Observer Design Pattern in Java_SYS4U
sys4u
 
Memory_leak_patterns_in_JavaScript_SYS4U
Memory_leak_patterns_in_JavaScript_SYS4UMemory_leak_patterns_in_JavaScript_SYS4U
Memory_leak_patterns_in_JavaScript_SYS4U
sys4u
 
From Java code to Java heap_SYS4U I&C
From Java code to Java heap_SYS4U I&CFrom Java code to Java heap_SYS4U I&C
From Java code to Java heap_SYS4U I&C
sys4u
 

Viewers also liked (19)

2013 UX Design Trend Report Part 3_SYS4U I&C
2013 UX Design Trend Report Part 3_SYS4U I&C2013 UX Design Trend Report Part 3_SYS4U I&C
2013 UX Design Trend Report Part 3_SYS4U I&C
 
iOS Human Interface Guidlines #14_SYS4U
iOS Human Interface Guidlines #14_SYS4UiOS Human Interface Guidlines #14_SYS4U
iOS Human Interface Guidlines #14_SYS4U
 
2012 UX Design Trend Report Part 2_SYS4U I&C
2012 UX Design Trend Report Part 2_SYS4U I&C2012 UX Design Trend Report Part 2_SYS4U I&C
2012 UX Design Trend Report Part 2_SYS4U I&C
 
Web Accessibility_SYS4U
Web Accessibility_SYS4UWeb Accessibility_SYS4U
Web Accessibility_SYS4U
 
UIX UNIT_Several UI Teminologies Easy To Miss_SYS4U I&C
UIX UNIT_Several UI Teminologies Easy To Miss_SYS4U I&CUIX UNIT_Several UI Teminologies Easy To Miss_SYS4U I&C
UIX UNIT_Several UI Teminologies Easy To Miss_SYS4U I&C
 
iOS_Human_Interface_Guidlines_#4_SYS4U
iOS_Human_Interface_Guidlines_#4_SYS4UiOS_Human_Interface_Guidlines_#4_SYS4U
iOS_Human_Interface_Guidlines_#4_SYS4U
 
iOS Human Interface Guidlines #12_SYS4U
iOS Human Interface Guidlines #12_SYS4UiOS Human Interface Guidlines #12_SYS4U
iOS Human Interface Guidlines #12_SYS4U
 
2012 UX Design Trend Report Part 1_SYS4U I&C
2012 UX Design Trend Report Part 1_SYS4U I&C2012 UX Design Trend Report Part 1_SYS4U I&C
2012 UX Design Trend Report Part 1_SYS4U I&C
 
UX Planning Training Course_SYS4U I&C
UX Planning Training Course_SYS4U I&CUX Planning Training Course_SYS4U I&C
UX Planning Training Course_SYS4U I&C
 
UX Layout Design_SYS4U
UX Layout Design_SYS4UUX Layout Design_SYS4U
UX Layout Design_SYS4U
 
Introduction to Fork Join Framework_SYS4U I&C
Introduction to Fork Join Framework_SYS4U I&CIntroduction to Fork Join Framework_SYS4U I&C
Introduction to Fork Join Framework_SYS4U I&C
 
iOS Human_Interface_Guidlines_#2_SYS4U
iOS Human_Interface_Guidlines_#2_SYS4UiOS Human_Interface_Guidlines_#2_SYS4U
iOS Human_Interface_Guidlines_#2_SYS4U
 
JQuery륌 읎용하여 웹 위젯 작성하Ʞ_(죌)시슀포유아읎앀씚
JQuery륌 읎용하여 웹 위젯 작성하Ʞ_(죌)시슀포유아읎앀씚JQuery륌 읎용하여 웹 위젯 작성하Ʞ_(죌)시슀포유아읎앀씚
JQuery륌 읎용하여 웹 위젯 작성하Ʞ_(죌)시슀포유아읎앀씚
 
iOS Human Interface Guidlines #8_SYS4U
iOS Human Interface Guidlines #8_SYS4UiOS Human Interface Guidlines #8_SYS4U
iOS Human Interface Guidlines #8_SYS4U
 
iOS Human Interface Guidlines #11_SYS4U
iOS Human Interface Guidlines #11_SYS4UiOS Human Interface Guidlines #11_SYS4U
iOS Human Interface Guidlines #11_SYS4U
 
iOS Human Interface Guidlines #7_SYS4U
iOS Human Interface Guidlines #7_SYS4UiOS Human Interface Guidlines #7_SYS4U
iOS Human Interface Guidlines #7_SYS4U
 
Observer Design Pattern in Java_SYS4U
Observer Design Pattern in Java_SYS4UObserver Design Pattern in Java_SYS4U
Observer Design Pattern in Java_SYS4U
 
Memory_leak_patterns_in_JavaScript_SYS4U
Memory_leak_patterns_in_JavaScript_SYS4UMemory_leak_patterns_in_JavaScript_SYS4U
Memory_leak_patterns_in_JavaScript_SYS4U
 
From Java code to Java heap_SYS4U I&C
From Java code to Java heap_SYS4U I&CFrom Java code to Java heap_SYS4U I&C
From Java code to Java heap_SYS4U I&C
 

Similar to JavaEE6 Tutorial - Java Message Service_sys4u

C Language II
C Language IIC Language II
C Language II
Suho Kwon
 
1.슀프링프레임워크 개요
1.슀프링프레임워크 개요1.슀프링프레임워크 개요
Sql Server 2005 개요
Sql Server 2005 개요Sql Server 2005 개요
Sql Server 2005 개요
beamofhope
 

Similar to JavaEE6 Tutorial - Java Message Service_sys4u (20)

Active MQ
Active MQActive MQ
Active MQ
 
2015 Open Cloud Engine Handbook
2015 Open Cloud Engine Handbook2015 Open Cloud Engine Handbook
2015 Open Cloud Engine Handbook
 
Better Scalable Flexible Soa Platform 0.8.0
Better Scalable Flexible Soa Platform 0.8.0Better Scalable Flexible Soa Platform 0.8.0
Better Scalable Flexible Soa Platform 0.8.0
 
MANTL을 MANTL답게! ELK로 만듀얎갑니닀
MANTL을 MANTL답게! ELK로 만듀얎갑니닀MANTL을 MANTL답게! ELK로 만듀얎갑니닀
MANTL을 MANTL답게! ELK로 만듀얎갑니닀
 
Micro Service Architecture
Micro Service ArchitectureMicro Service Architecture
Micro Service Architecture
 
병렬처늬
병렬처늬병렬처늬
병렬처늬
 
[Uws] enterprise application architecture, msa, java9, spring 소개
[Uws] enterprise application architecture, msa, java9, spring 소개[Uws] enterprise application architecture, msa, java9, spring 소개
[Uws] enterprise application architecture, msa, java9, spring 소개
 
Microservices
Microservices Microservices
Microservices
 
Java rmi 개발 가읎드
Java rmi 개발 가읎드Java rmi 개발 가읎드
Java rmi 개발 가읎드
 
Microservice Architecture
Microservice ArchitectureMicroservice Architecture
Microservice Architecture
 
m-Station Channel Xpander5 020325
m-Station Channel Xpander5 020325m-Station Channel Xpander5 020325
m-Station Channel Xpander5 020325
 
C Language II
C Language IIC Language II
C Language II
 
JavaEE6 - 섀계 찚원의 닚순성
JavaEE6 - 섀계 찚원의 닚순성JavaEE6 - 섀계 찚원의 닚순성
JavaEE6 - 섀계 찚원의 닚순성
 
1.슀프링프레임워크 개요
1.슀프링프레임워크 개요1.슀프링프레임워크 개요
1.슀프링프레임워크 개요
 
TestCloud2018-1(answer)
TestCloud2018-1(answer)TestCloud2018-1(answer)
TestCloud2018-1(answer)
 
WAS의 동작곌 WEB, Servlet, JSP_Wh apm
WAS의 동작곌 WEB, Servlet, JSP_Wh apmWAS의 동작곌 WEB, Servlet, JSP_Wh apm
WAS의 동작곌 WEB, Servlet, JSP_Wh apm
 
Sencha Ext JS 구축사례 : 윔드슀믞슀 툎슈
Sencha Ext JS 구축사례 : 윔드슀믞슀 툎슈Sencha Ext JS 구축사례 : 윔드슀믞슀 툎슈
Sencha Ext JS 구축사례 : 윔드슀믞슀 툎슈
 
테슀터도 알아알 할 웹 개발(테슀튞 교육 3장 1절 부분발췌)
테슀터도 알아알 할 웹 개발(테슀튞 교육 3장 1절 부분발췌)테슀터도 알아알 할 웹 개발(테슀튞 교육 3장 1절 부분발췌)
테슀터도 알아알 할 웹 개발(테슀튞 교육 3장 1절 부분발췌)
 
Sql Server 2005 개요
Sql Server 2005 개요Sql Server 2005 개요
Sql Server 2005 개요
 
개발자 지향 WAS : IBM WebSphere Liberty Server
개발자 지향 WAS : IBM WebSphere Liberty Server개발자 지향 WAS : IBM WebSphere Liberty Server
개발자 지향 WAS : IBM WebSphere Liberty Server
 

More from sys4u

iOS Human Interface Guidlines #13_SYS4U
iOS Human Interface Guidlines #13_SYS4UiOS Human Interface Guidlines #13_SYS4U
iOS Human Interface Guidlines #13_SYS4U
sys4u
 
iOS Human Interface Guidlines #10_SYS4U
iOS Human Interface Guidlines #10_SYS4UiOS Human Interface Guidlines #10_SYS4U
iOS Human Interface Guidlines #10_SYS4U
sys4u
 
iOS Human Interface Guidlines #5_SYS4U
iOS Human Interface Guidlines #5_SYS4UiOS Human Interface Guidlines #5_SYS4U
iOS Human Interface Guidlines #5_SYS4U
sys4u
 
30_eCommerce_sites_using_html5_SYS4U
30_eCommerce_sites_using_html5_SYS4U30_eCommerce_sites_using_html5_SYS4U
30_eCommerce_sites_using_html5_SYS4U
sys4u
 
iOS Human Interface Guidlines #3_SYS4U
iOS Human Interface Guidlines #3_SYS4UiOS Human Interface Guidlines #3_SYS4U
iOS Human Interface Guidlines #3_SYS4U
sys4u
 
Advanced SWOT Analysis of e-commerce_SYS4U
Advanced SWOT Analysis of e-commerce_SYS4UAdvanced SWOT Analysis of e-commerce_SYS4U
Advanced SWOT Analysis of e-commerce_SYS4U
sys4u
 
Proxy_design_pattern_in_Java_SYS4U
Proxy_design_pattern_in_Java_SYS4UProxy_design_pattern_in_Java_SYS4U
Proxy_design_pattern_in_Java_SYS4U
sys4u
 
Implementing_AOP_in_Spring_SYS4U
Implementing_AOP_in_Spring_SYS4UImplementing_AOP_in_Spring_SYS4U
Implementing_AOP_in_Spring_SYS4U
sys4u
 
iOS Human_Interface_Guidlines_#1_SYS4U
iOS Human_Interface_Guidlines_#1_SYS4UiOS Human_Interface_Guidlines_#1_SYS4U
iOS Human_Interface_Guidlines_#1_SYS4U
sys4u
 
Promotions_2nd_SYS4U I&C
Promotions_2nd_SYS4U I&CPromotions_2nd_SYS4U I&C
Promotions_2nd_SYS4U I&C
sys4u
 
JavaScript Profiling With The Chrome Developer Tools_SYS4U I&C
JavaScript Profiling With The Chrome Developer Tools_SYS4U I&CJavaScript Profiling With The Chrome Developer Tools_SYS4U I&C
JavaScript Profiling With The Chrome Developer Tools_SYS4U I&C
sys4u
 

More from sys4u (11)

iOS Human Interface Guidlines #13_SYS4U
iOS Human Interface Guidlines #13_SYS4UiOS Human Interface Guidlines #13_SYS4U
iOS Human Interface Guidlines #13_SYS4U
 
iOS Human Interface Guidlines #10_SYS4U
iOS Human Interface Guidlines #10_SYS4UiOS Human Interface Guidlines #10_SYS4U
iOS Human Interface Guidlines #10_SYS4U
 
iOS Human Interface Guidlines #5_SYS4U
iOS Human Interface Guidlines #5_SYS4UiOS Human Interface Guidlines #5_SYS4U
iOS Human Interface Guidlines #5_SYS4U
 
30_eCommerce_sites_using_html5_SYS4U
30_eCommerce_sites_using_html5_SYS4U30_eCommerce_sites_using_html5_SYS4U
30_eCommerce_sites_using_html5_SYS4U
 
iOS Human Interface Guidlines #3_SYS4U
iOS Human Interface Guidlines #3_SYS4UiOS Human Interface Guidlines #3_SYS4U
iOS Human Interface Guidlines #3_SYS4U
 
Advanced SWOT Analysis of e-commerce_SYS4U
Advanced SWOT Analysis of e-commerce_SYS4UAdvanced SWOT Analysis of e-commerce_SYS4U
Advanced SWOT Analysis of e-commerce_SYS4U
 
Proxy_design_pattern_in_Java_SYS4U
Proxy_design_pattern_in_Java_SYS4UProxy_design_pattern_in_Java_SYS4U
Proxy_design_pattern_in_Java_SYS4U
 
Implementing_AOP_in_Spring_SYS4U
Implementing_AOP_in_Spring_SYS4UImplementing_AOP_in_Spring_SYS4U
Implementing_AOP_in_Spring_SYS4U
 
iOS Human_Interface_Guidlines_#1_SYS4U
iOS Human_Interface_Guidlines_#1_SYS4UiOS Human_Interface_Guidlines_#1_SYS4U
iOS Human_Interface_Guidlines_#1_SYS4U
 
Promotions_2nd_SYS4U I&C
Promotions_2nd_SYS4U I&CPromotions_2nd_SYS4U I&C
Promotions_2nd_SYS4U I&C
 
JavaScript Profiling With The Chrome Developer Tools_SYS4U I&C
JavaScript Profiling With The Chrome Developer Tools_SYS4U I&CJavaScript Profiling With The Chrome Developer Tools_SYS4U I&C
JavaScript Profiling With The Chrome Developer Tools_SYS4U I&C
 

JavaEE6 Tutorial - Java Message Service_sys4u

  • 1. - 1 - Java Messaging Service 원볞 죌소 : http://docs.oracle.com/javaee/6/tutorial/doc/bncdq.html 번역자 : 김형석 수석 번역음 : 2013 년 06 년 20 음 Chapter47. Java Message Service Concept 읎 장에서는 자바 메시지 서비슀(JMS) API 에 대핮 소개한닀. 읎 API 륌 읎용하멎 얎플늬쌀읎션 낎에서 신뢰할 수 있고, 비동Ʞ적읎며, 느슚히 연결된(loosely coupled) 컀뮀니쌀읎션 방식을 읎용하여 메시지륌 생성, 전송하고 수신하고 읜을 수 있게 된닀. 읎 장에서는 닀음 낎용듀을 닀룬닀.  JMS API 개요  Ʞ볞 JMS API 개념  JMS API 프로귞래밍 몚덞  견고한 JMS 얎플늬쌀읎션 작성 방법  JavaEE 얎플늬쌀읎션에서 JMS 륌 사용하는 방법  JMS 에 대한 추가 정볎 JMS API 개요 읎 장에서는 메시징(Messaging)에 대한 개념을 정의하고, JMS API 에 대한 낎용곌 읎륌 읎용할 수 있는 상황 대핮 Ʞ술한닀. 또, JavaEE 얎플늬쌀읎션 낎에서 JMS API 가 얎떻게 동작하는지에 대핎서도 섀명할 것읎닀. 메시징읎란 묎엇읞가? 메시징은 소프튞웚얎 컎포넌튞나 얎플늬쌀읎션 간에 정볎륌 죌고 받을 수 있도록(Communication) 하는 방법읎닀. 볎통 메시징 시슀템은 P2P(peer to peer) 구조읎닀. 메시징 큎띌읎얞튞는 메시지륌 전송하Ʞ도 하고 닀륞 ì–Žë–€ 메시징 큎띌읎얞튞가 볎낞 메시지륌 수신하Ʞ도 한닀. 각각의 메시징 큎띌읎얞튞듀은 메시지륌 생성(create)하고 전송(send)하고 수신하고(receive) 읜을(read)수 있는 Ʞ능을 제공하는 메시징 쀑개자(Messaging Agent)와 연결된닀. 메시징을 읎용하멎 느슚하게 연결(loosely coupled)되는 분산된 컀뮀니쌀읎션을 할 수 있게 된닀. 송신자는 목적지(destination)로 메시지륌 볎낎고, 수신자(recipient)는 ê·ž 목적지로부터 메시지륌 얻얎올 수 있닀. 하지만, 송신자(sender)와 수신자(receiver)듀읎
  • 2. - 2 - 컀뮀니쌀읎션을 하Ʞ 위핎 같은 시점에 몚두 싀행 쀑음 필요는 없닀. 사싀 송신자는 수신자에 대핮 전혀 알지 못핎도 묎방하닀. 마찬가지로 수신자도 송신자에 대핮 알 필요가 없닀. 송신자와 수신자가 알고 있얎알 할 것은 메시지의 형식(format)곌 목적지에 대한 정볎가 전부읎닀. 읎런 ꎀ점에서 메시징은 원격지 얎플늬쌀읎션에 대한 정볎륌 알고 있얎알 하는 RMI(Remote Method Invocation: 원격 메소드 혞출)와 같은 견고하게 연결된(tightly coupled) 컀뮀니쌀읎션 방식곌 구별된닀고 할 수 있닀. 메시징은 또 읎메음곌도 닀륎닀고 할 수 있는데, 읎메음은 사람곌 사람 간에, 혹은 소프튞웚얎 얎플늬쌀읎션곌 사람 간에 컀뮀니쌀읎션을 하Ʞ 위핎 읎용되지만, 메시징은 소프튞웚얎 얎플늬쌀읎션읎나 소프튞웚얎 컎포넌튞 간의 컀뮀니쌀읎션을 위핎 사용된닀. JMS API 는 묎엇읞가? Java Message Service 는 얎플늬쌀읎션에서 메시지륌 생성하고, 송신하고, 수신하고, 읜을 수 있도록 제공된 Java API 읎닀. 읎 API 는 Sun 곌 ê·ž 왞 몇몇 파튞너듀읎 섀계하였는데, 여Ʞ에는 Java 얞얎륌 읎용하여 닀륞 메시징 구현첎듀곌 컀뮀니쌀읎션 할 수 있도록 하는 음반적읞 읞터페읎슀듀곌 귞와 ꎀ렚된 낎용듀읎 정의되얎 있닀. JMS API 에는, 프로귞래뚞가 알아알 하는 낎용은 최소화하멎서도, 섞렚된 메시징 얎플늬쌀읎션을 만듀 수 있도록 하는 충분한 Ʞ능듀읎 포핚되얎 있닀. 또, JMS 얎플늬쌀읎션읎 동음한 도메읞 낎에 있는 여러 JMS 프로바읎더듀곌 연동할 수 있도록 읎식성을 극대화하였닀. JMS API 는 느슚한 연결의 컀뮀니쌀읎션을 가능하게 할 뿐만 아니띌 닀음 Ʞ능도 지원한닀.  비동Ʞ성(Asynchronous): JMS 프로바읎더는 메시지듀읎 도착하멎 바로 큎띌읎얞튞에게 메시지륌 전달핎쀀닀. 큎띌읎얞튞가 메시지륌 얻Ʞ 위핎 프로바읎더에게 요청을 할 필요가 없닀.  신뢰성(Reliable): JMS API 는 메시지가 한 번, 귞늬고 당 한 번만 전달되도록 볎장한닀. 메시지가 유싀되거나 쀑복되는 등의 묞제륌 핎결하는 낮은 레벚(low level)의 Ʞ능 구조륌 갖추고 있닀. 현재 JMS 명섞의 버전은 1.1 버전읎닀. JMS 명섞륌 확읞하고 싶윌멎 닀음 URL 을 읎용하Ꞟ 바란닀: http://www.oracle.com/technetwork/java/index-jsp-142945.html ì–Žë–€ 상황에서 JMS API 륌 읎용할 수 있는가? 닀음곌 같은 상황에서 엔터프띌읎슈 얎플늬쌀읎션듀은 RPC(Remote Procedure Call)와 같은 견고한 연결방식 대신 메시징 API 륌 선택하는 겜향읎 있닀.  컎포넌튞가 닀륞 컎포넌튞의 읞터페읎슀에 의졎하지 말아알 할 때, 슉 컎포넌튞듀읎 손쉜게 교첎될 수 있얎알 할 때
  • 3. - 3 -  몚든 컎포넌튞 혹은 얎플늬쌀읎션듀읎 같은 시점에 싀행 쀑읎 아니더띌도 컀뮀니쌀읎션읎 가능핎알 할 때  얎플늬쌀읎션의 비슈니슀 몚덞읎 전송한 메시지에 대한 처늬 결곌륌 슉각적윌로 응답 받을 필요가 없을 때 예륌 듀얎볎멎, 자동찚 공장에서 사용되는 엔터프띌읎슈 얎플늬쌀읎션의 컎포넌튞듀은 닀음곌 같은 방식윌로 JMS API 륌 사용할 수 있닀.  재고 컎포넌튞는 ì–Žë–€ 제품의 재고 수쀀읎 음정량 읎하로 떚얎지멎 공장 컎포넌튞에게 메시지륌 볎낌 수 있닀. 귞늬하여 자동찚륌 더 많읎 만듀 수 있닀.  공장 컎포넌튞는 부품 컎포넌튞듀에게 메시지륌 볎낎 필요한 부품듀을 조늜할 수 있닀.  부품 컎포넌튞는 재고 컎포넌튞나 죌묞 컎포넌튞로 메시지륌 볎낎 재고 수량을 갱신하고 새로욎 부품을 죌묞할 수 있닀.  공장 컎포넌튞와 부품 컎포넌튞 몚두 정산 컎포넌튞로 메시지륌 볎낎 자산을 갱신할 수 있닀.  업묎팀에서 갱신된 칎탈로귞륌 판쎉팀윌로 발행할 수 있닀. 읎런 방식윌로 메시징을 읎용하멎 각 컎포넌튞듀읎 넀튞워크나 늬소슀륌 곌도하게 점유하지 않고도 횚윚적윌로 상혞작용할 수 있닀. 귞늌 47-1 륌 볎멎 위 예제륌 쉜게 읎핎할 수 있을 것읎닀. 제조업은 JMS API 륌 읎용하는 엔터프띌읎슈 얎플늬쌀읎션의 한 예음 뿐읎닀. 소맀(retail) 얎플늬쌀읎션, ꞈ융 서비슀 얎플늬쌀읎션, 의료 서비슀 얎플늬쌀읎션 등 수많은 얎플늬쌀읎션듀읎 메시징을 읎용할 수 있닀. JMS API 는 JavaEE 플랫폌에서 얎떻게 동작하는가? 1998 년 JMS API 가 처음 소개되었을 때, 읎것의 가장 쀑요한 목표는 Java 얎플늬쌀읎션읎 IBM 의 MQSeries 와 같은 Ʞ졎에 졎재하던 메시징 êž°ë°˜ 믞듀웚얎(MOM Messaging Oriented Middleware)에 접귌할 수 있도록 하는 것읎었닀. ê·ž 때 읎후로, 수 많은 개발 업첎듀읎 JMS API 에 적응하고 읎륌 구현핎 왔윌며, 귞래서 현재의 JMS 제품듀은 엔터프띌읎슈 환겜을 위한 메시징 Ʞ능을 완벜하게 제공할 수 있게 되었닀.
  • 4. - 4 - Java EE 플랫폌의 1.3 버전 배포부터 시작된 JMS API 는 플랫폌의 핵심적읞 부분읎 되얎 왔윌며, 많은 얎플늬쌀읎션 개발자듀은 JavaEE 컎포넌튞륌 읎용하여 메시징 Ʞ능을 구현할 수 있게 되었닀. JavaEE 플랫폌 낎에 탑재되얎 있는 JMS API 에는 닀음곌 같은 Ʞ능듀읎 포핚되얎 있닀.  얎플늬쌀읎션 큎띌읎얞튞, 엔터프띌읎슈 자바빈슈(EJB), 귞늬고 웹 컎포넌튞듀은 JMS 메시지륌 전송하거나 동Ʞ화된 방식윌로 수신할 수 있닀. 추가적윌로 얎플늬쌀읎션 큎띌읎얞튞는 JMS 메시지륌 비동Ʞ적윌로 수신할 수도 있닀. (하지만, 애플늿은 JMS API 륌 지원할 필요가 없닀.)  엔터프띌읎슈 빈의 한 종류읞 메시지 드늬랐 빈(MDB, Message-Driven Bean)은 메시지 소비륌 비동Ʞ적윌로 수행할 수 있닀. JMS 프로바읎더는 메시지 드늬랐 빈을 읎용하여 메시지에 대한 동시 처늬 Ʞ능을 부가적윌로 구현할 수 있닀.  메시지에 대한 송/수신 Ʞ능은 분산 튞랙잭션에 찞가할 수 있는데, 읎는 JMS 에 대한 작업곌 데읎터베읎슀에 대한 작업읎 닚음 튞랜잭션 낎에서 처늬될 수 있음을 의믞한닀. JMS API 는 엔터프띌읎슈 얎플늬쌀읎션의 개발 방식을 닚순화시킀고, JavaEE 컎포넌튞와 Ʞ졎에 졎재하던 메시징 시슀템간에 느슚하고, 신뢰로우며, 비동Ʞ적읞 상혞작용을 가능쌀 핚윌로썚 Java EE 플랫폌의 가치륌 향상시쌰닀. 개발자듀은 특정 비슈니슀 읎벀튞에 대핮 동작하는 메시지 드늬랐 빈을 추가핚윌로썚 Ʞ졎에 작성되얎 있던 비슈니슀가 새로욎 동작을 하도록 Ʞ능을 손쉜게 추가할 수 있닀. 또, JavaEE 플랫폌은 분산 튞랜잭션곌 메시지에 대한 동시 처늬 Ʞ능을 제공핚윌로썚 JMS API 륌 향상시쌰닀. 더 자섞한 정볎륌 알고 싶닀멎 엔터프띌읎슈 자바빈슈 3.1 규격(Specification)륌 찞고하Ʞ 바란닀. JMS 프로바읎더는 JavaEE 컀넥터 아킀텍처륌 사용하고 있는 얎플늬쌀읎션 서버와 통합될 수 있닀. 개발자듀은 늬소슀 얎댑터(resource adapter)륌 통핎 JMS 프로바읎더에 접귌할 수 있닀. 읎 Ʞ능은 JMS 프로바읎더가 여러 개의 얎플늬쌀읎션 서버에 플러귞읞 되는 것읎 가능하도록 핮 죌며, 또 얎플늬쌀읎션 서버듀읎 여러 개의 JMS 프로바읎더와 연동할 수 있도록 핮 쀀닀. 읎에 대한 자섞한 정볎는 JavaEE 컀넥터 아킀텍처 규격 v1.6 을 확읞핎 볎Ʞ 바란닀. JMS API Ʞ볞 개념 읎 장에서는 JMS API 의 가장 Ʞ볞적읞 개념에 대핮 닀룰 것읞데, 읎 낎용은 JMS API 륌 읎용하는 ê°„ë‹ší•œ 얎플늬쌀읎션을 작성하Ʞ 위핎 반드시 알아알 할 것읎닀. 읎 닀음 장에서는 JMS API 의 프로귞래밍 몚덞에 대핮 닀룰 것읎닀. ê·ž 뒀에 소개될 장 듀에서는 메시지 드늬랐 빈을 읎용하는 얎플늬쌀읎션을 작성하Ʞ 위핎 알아알 하는 고꞉ 개념을 소개할 것읎닀. JMS API 아킀텍처
  • 5. - 5 - JMS 얎플늬쌀읎션은 닀음 부분듀로 구성된닀.  JMS 프로바읎더(JMS Provider)는 JMS 읞터페읎슀륌 구현하고 ꎀ늬/제얎 Ʞ능을 제공하는 메시징 시슀템읎닀. JavaEE 플랫폌의 구현첎(Platform Implementation)는 JMS 프로바읎더륌 포핚한닀.  JMS 큎띌읎얞튞(JMS Client)는 Java ì–žì–Žë¡œ 작성된 프로귞랚읎거나 컎포넌튞로 메시지륌 생산하거나 소비한닀. JavaEE 얎플늬쌀읎션 컎포넌튞띌멎 ì–Žë–€ 것읎띌도 JMS 큎띌읎얞튞로서 동작할 수 있닀.  메시지는 JMS 큎띌읎얞튞 사읎에 정볎륌 죌고 받는 데에 사용되는 객첎읎닀.  ꎀ늬 대상 객첎(Administered Object)는 사전에 섀정되는 JMS 객첎로, 큎띌읎얞튞에서 사용하Ʞ 위핎 ꎀ늬자가 생성하는 객첎읎닀. JMS ꎀ늬 객첎에는 두 가지가 있는데, 하나는 목적지(destination)읎고 닀륞 하나는 컀넥션 팩토늬 (connection factory)읎닀. 읎에 대한 낎용은 [JMS ꎀ늬 대상 객첎] 장에서 섀명될 것읎닀. 귞늌 47-2 는 읎 ì„ž 부분읎 얎떻게 상혞작용하는지륌 볎여쀀닀. ꎀ늬 툎을 읎용하멎 JNDI 넀임슀페읎슀 낎에 목적지와 컀넥션 팩토늬 정볎륌 바읞드(bind)할 수 있닀. 귞렇게 되멎, JMS 큎띌읎얞튞가 핎당 넀임슀페읎슀 낎에 있는 ꎀ늬 대상 객첎에 접귌하Ʞ 위핎 자원 죌입(resource injection)을 읎용할 수 있게 된닀. 귞늬고 ê·ž 후 JMS 프로바읎더륌 통핎 동음한 객첎에 녌늬적읞 컀넥션을 맺을 수 있게 되는 것읎닀. 메시징 도메읞듀(Messaging Domains) JMS API 가 소개되Ʞ 전의 대부분의 메시징 제품듀은 점대점(point-to-point) 방식읎나 발행/구독(publish/subscribe) 방식 쀑 둘 쀑 하나만 지원했었닀. JMS 규격은 각각의 ì ‘ê·Œ 방식을 위핎 분늬된 도메읞을 제공하고, 각 도메읞 별로 따띌알 할 규칙듀을 정의한닀. 독늜적윌로 동작하는 (stand-alone) JMS 프로바읎더는 한 가지 혹은 두 가지 방식 몚두륌 구현할 수 있닀. JavaEE 프로바읎더는 두 가지 도메읞 몚두륌 구현핎알 한닀. 사싀, 대부분의 JMS API 구현첎듀은 점대점 방식 도메읞읎나 발행/구독 방식 도메읞 몚두륌 지원하고 있윌며, 몇몇 JMS 큎띌읎얞튞듀은 닚음 얎플늬쌀읎션 낎에서 두 가지 도메읞 몚두륌 사용하Ʞ도 한닀. 읎런 방식을 읎용하여 JMS API 는 메시징 제품듀의 Ʞ능곌 유연성을 킀웠닀고 할 수 있닀. JMS 규격은 여Ʞ서 한 걞음 더 나아갔닀: 양쪜 도메읞에 접귌하Ʞ 위핎 닚음 JMS API 륌 읎용할 수 있게 된 것읎닀. 닀음 장에서는 위에서 소개한 두 가지의 메시징 도메읞에 대한
  • 6. - 6 - 낎용곌 읎듀을 읎용하Ʞ 위한 공통 읞터페읎슀(common interface)륌 사용하는 방법을 닀룰 것읎닀. 점대점 메시징 도메읞(Point-to-Point Messaging Domain) 점대점 제품읎나 얎플늬쌀읎션은 메시지 큐(Message Queue), 송신자(sender), 수신자(receiver)의 개념을 Ʞ반윌로 만듀얎진닀. 개별 메시지듀은 특정 큐에 전달되고, 수신 큎띌읎얞튞듀은 메시지륌 ë‹Žê³  있Ʞ 위핎 생성된 큐로부터 메시지륌 추출한닀. 큐는 메시지가 소비되거나 만료되Ʞ 전까지 몚든 메시지륌 볎유하고 있게 된닀. 귞늌 47-3 에 소개되얎 있는 점대점 메시진 방식은 닀음곌 같은 특징을 지니고 있닀.  개별 메시지듀은 당 하나의 소비자에 의핎 소비된닀.  메시지의 송신자와 수신자는 시간에 구애되지 않고 메시지륌 죌고 받을 수 있닀. 수신자는 얞제든 메시지륌 가젞올 수 있윌며, 송신자가 메시지륌 송신하고 있을 때 싀행 쀑읎지 않아도 된닀.  수신자는 메시지륌 성공적윌로 처늬했는지륌 고지한닀. 점대점 메시징 방식은 전송된 메시지가 당 하나의 소비자에 의핎 성공적윌로 처늬되얎알 하는 겜우에 읎용할 수 있닀. 발행/구독 메시징 도메읞(Publish/Subscribe Messaging Domain) 발행/구독(pub/sub) 제품읎나 얎플늬쌀읎션은 메시지륌 하나의 토픜(topic)에 전송하는데, 읎는 게시판(Bulletin Board)곌 비슷하게 작동한닀고 볌 수 있닀. 발행자(Publisher)와 구독자(Subscriber)듀은 볎통 익명(anonymous)읎고, 동적윌로 컚텐튞 계잵(content hierarchy)에 발행하거나 귞것을 구독할 수 있닀. 읎 시슀템은 여러 발행자가 전달한 토픜듀을 여러 구독자에게 나누얎(distributing) 죌는 역할을 닎당한닀. 토픜듀은 현재의 구독자듀에게 메시지륌 전달되는 동안만 메시지륌 유지한닀. 발행/구독 메시징에는 닀음곌 같은 특징읎 있닀.  각 메시지듀은 여러 구독자에 의핎 소비될 수 있닀.
  • 7. - 7 -  발행자와 구독자 사읎에는 시간적 의졎성(timing dependency)가 졎재한닀. ì–Žë–€ 토픜을 구독하는 큎띌읎얞튞는 구독하Ʞ 시작한 읎후에 발행된 메시지만 소비할 수 있닀. 귞늬고 메시지륌 소비하Ʞ 위핎 지속적윌로 활성화(active)되얎 있얎알 한닀. JMS API 는 읎 시간적 의졎성을 얎느 정도 늘늬Ʞ 위핎 구독자가 지속 구독(durable subscriptions)을 할 수 있는 Ʞ능을 제공한닀. 읎 방식을 읎용하멎 구독자가 동작하고 있지 않은 시점에 전송된 메시지륌 수신할 수 있게 된닀. 지속 구독 방식은 큐의 유연성곌 신뢰성을 부여하멎서도 큎띌읎얞튞가 여러 수신자에게 메시지륌 전송할 수 있게 핮 쀀닀. 읎에 대한 상섞한 정볎는 [지속 구독 생성하Ʞ] 장을 찞고하Ʞ 바란닀. 각 메시지가 여러 소비자에 전달되얎 처늬되얎알 한닀멎 발행/구독 방식을 읎용하멎 된닀. 귞늌 47-4 에서 발행/구독 방식읎 섀명되얎 있닀. 공통 읞터페읎슀륌 읎용하여 프로귞래밍하Ʞ JMS API 버전 1.1 을 읎용하여 작성된 윔드는 점대점읎나 발행/구독 도메읞 둘 쀑 하나와만 연동할 수 있었닀. 사용되는 목적지는 도메읞에 따띌 닀륎고, 얎플늬쌀읎션의 동작 방식도 큐륌 사용하냐 토픜을 사용하냐에 따띌 닀륎Ʞ 때묞읎닀. 하지만 윔드 자첎는 몚든 도메읞에 동음하게 사용될 수도 있고, 귞렇게 되멎 얎플늬쌀읎션읎 볎닀 유연하고 재사용 가능하도록 작성될 수 있닀. 읎 예제에서는 읎 공통 읞터페읎슀에 대핮 얞꞉하고 섀명할 것읎닀. 메시지 소비 메시징 제품듀은 태생적윌로 비동Ʞ적윌로 동작한닀: 메시지륌 생산하거나 소비하는 사읎에 귌원적읞 시간적 의졎성은 졎재하지 않는닀. 하지만, JMS 규격에서는 읎 용얎륌 좀 더 엄밀하게 사용하고 있닀. 메시지듀은 닀음 두 가지 방식윌로 소비될 수 있닀.  동Ʞ화 처늬: 구독자나 수신자가 receive 메소드륌 혞출하여 목적지로부터 메시지륌 명시적윌로 가젞간닀. receive 메소드는 메시지가 도착할 때 까지 대Ʞ할 수도 있고, 지정된 음정 시간 한도 낎에 메시지가 도착하지 않윌멎 타임아웃 처늬할 수도 있닀.  비동Ʞ화 처늬: 큎띌읎얞튞는 소비자에 메시지 늬슀너(message listener)륌 등록할 수 있닀. 메시지 늬슀너는 읎벀튞 늬슀너와 유사하닀. 얞제든 메시지가 목적지에 도착하멎, JMS 프로바읎더는 늬슀너의 onMessage 메소드륌 혞출하여 메시지륌 전달하는데, 읎 메소드는 메시지의 컚텐잠에 대핮 동작한닀.
  • 8. - 8 - JMS API Ʞ볞 개념 JMS 얎플늬쌀읎션의 Ʞ볞적읞 구성요소듀은 닀음곌 같닀.  ꎀ늬 대상 객첎: 컀넥션 팩토늬와 목적지  컀넥션듀(connections)  섞션듀(sessions)  메시지 생성자듀(message producers)  메시지 소비자듀(message consumers)  메시지듀(messages) 귞늌 47-5 륌 볎멎 위의 객첎듀읎 얎떻게 상혞작용하는지륌 확읞할 수 있닀. 읎 장에서는 몚든 객첎듀을 간략하게 섀명할 것읎고 읎듀을 사용하Ʞ 위한 명령얎와 ê°„ë‹ší•œ 윔드 조각을 볎여쀄 것읎닀. 귞늬고 마지막에는 JMS API 의 예왞 처늬 방법에 대핮 간략히 섀명할 것읎닀. 몚든 객첎듀을 통합하는 예제는 읎 장의 마지막에 추가되얎 있닀. 더 상섞한 낎용을 알고 싶윌멎 JavaEE API 묞서 쀑 JMS API 묞서륌 확읞하Ʞ 바란닀. JMS ꎀ늬 대상 객첎(JMS Administered Objects) JMS 의 두 부분읞 목적지(destination)곌 컀넥션 팩토늬(connection factories)는 프로귞랚적윌로 ꎀ늬되Ʞ 볎닀는 ꎀ늬자에 의핎 ꎀ늬된닀. 읎 객첎듀을 위한 Ʞ술은 JMS API 의 구현 방식곌는 완전히 달띌 볎음 것읎닀. 귞러므로, 읎 객첎듀에 대한 작업은 ì–Žë–€ 프로바읎더륌 사용하냐에 따띌 달띌질 수 있는 작업윌로 ꎀ늬자가 처늬핎알 하는 것읎닀.
  • 9. - 9 - JMS 큎띌읎얞튞듀은 읎 객첎에 접귌하Ʞ 위핎 공통윌로 사용될 수 있는 읞터페읎슀륌 읎용하며, 귞래서 큎띌읎얞튞 얎플늬쌀읎션은 윔드의 수정읎 없거나 아죌 적은 수정만윌로 하나 읎상의 JMS API 구현첎와 연동할 수 있게 된닀. 볎통 ꎀ늬자는 ꎀ늬 대상 객첎듀을 JNDI 넀임슀페읎슀 낎에 섀정하며, ê·ž ë’€ JMS 큎띌읎얞튞듀읎 자원 죌입을 읎용하여 읎 객첎듀에 접귌하게 된닀. GlassFish 서버륌 읎용한닀멎, create-jms-resource 띌는 명령얎륌 읎용하거나 ꎀ늬자 윘솔을 읎용하여 컀넥터 자원 폌에서 JMS ꎀ늬 대상 객첎륌 생성할 수 있닀. 또, 직접 얎플늬쌀읎션에 추가할 수 있는 glassfish-resource.xml 띌는 읎늄의 파음에 필요한 자원을 추가할 수도 있닀. NetBeans IDE 에는 GlassFish 서버에 JMS 자원듀을 생성할 수 있는 마법사 Ʞ능읎 추가되얎 있닀. 자섞한 낎용은 [NetBeans IDE 륌 읎용하여 JMS 자원 추가하Ʞ]장을 찞고하Ʞ 바란닀. JMS 컀넥션 팩토늬(JMS Connector Factories) 컀넥션 팩토늬는 큎띌읎얞튞가 프로바읎더에 접귌하Ʞ 위핎 사용하는 객첎읎닀. 컀넥션 팩토늬는 ꎀ늬자가 섀정한 컀넥션에 대한 섀정 파띌믞터 값의 집합을 포핚하고 있닀. 각 컀넥션 팩토늬는 ConnectionFactory, QueueConnectionFactory 혹은 TopicConnectionFactory 의 읞슀턎슀읎닀. 컀넥션 팩토늬륌 생성하는 방법은 [NetBeans IDE 륌 읎용하여 JMS 자원 추가하Ʞ]장을 찞고하Ʞ 바란닀. 볎통 JMS 큎띌읎얞튞 프로귞랚의 앞 부분에서 컀넥션 팩토늬 자원을 ConnectionFactory 변수에 죌입하여 사용하게 된닀. 예륌 듀얎 닀음 윔드는 JNDI 읎늄읎 jms/ConnectionFactory 읞 자원을 지정하여 귞것읎 ConnectionFactory 객첎에 할당되게 하고 있닀. @Request(lookup = “jms/ConnectionFactory”) private static ConnectionFactory connectionFactory; 위와 같읎 JavaEE 얎플늬쌀읎션에서는 JMS ꎀ늬 대상 객첎듀은 볎통 jms 띌는 하위 컚텍슀튞 명을 추가하여 사용한닀. JMS 목적지(JMS Destination) 목적지는 큎띌읎얞튞가 메시지륌 전달하Ʞ 위핎 사용하는 대상(target)읎거나 메시지륌 소비하Ʞ 위핎 지정한 귌원(source)읎닀. 점대점 메시징 도메읞에서 목적지는 큐(queue)띌고 불늬고, 발행/구독 메시징 도메읞에서는 토픜(topic)읎띌고 불늰닀. 하나의 JMS 얎플늬쌀읎션은 여러 개의 큐와 토픜을 (둘 ë‹€) 사용할 수 있닀. 목적지륌 생성하는 방법에 대핮 알고 싶윌멎 [NetBeans IDE 륌 읎용하여 JMS 자원 추가하Ʞ]장을 찞고하Ʞ 바란닀.
  • 10. - 10 - GlassFish 서버륌 사용하는 목적지륌 생성하Ʞ 위핎서는, ê·ž 목적지륌 위한 JNDI 읎늄을 정의한 JMS 목적지 자원(JMS destination resource)륌 생성하여알 한닀. GlassFish 서버에서 구현된 JMS 는 각 목적지 자원은 싀제 묌늬적읞 목적지륌 찞조한닀. ꎀ늬자는 묌늬적읞 목적지륌 명시적윌로 생성할 수 있는데, 만앜 귞러지 않았닀멎 얎플늬쌀읎션 서버가 읎것읎 필요할 때 자동윌로 생성하고 ꎀ늬자가 목적지 자원을 제거할 때 제거하게 된닀. 큎띌읎얞튞 프로귞랚 낎에 컀넥션 팩토늬륌 죌입하는 것곌 마찬가지로, 볎통 목적지 자원도 죌입하여 사용한닀. 컀넥션 팩토늬와는 달늬, 목적지는 하나의 도메읞에만 지정된닀. 토픜곌 큐 몚두륌 사용하는 얎플늬쌀읎션을 작성핎알 한닀멎 목적지륌 Destination 객첎에 할당하멎 된닀. 닀음 윔드는 두 개의 자원 하나의 큐와 하나의 토픜을 정의하고 있닀. 각 자원의 읎늄은 JNDI 넀임슀페읎슀 낎에 생성된 목적지 자원에 대응된닀. @Resource (lookup = “jms/Queue”) private static Queue queue; @Resource (lookup = “jms/Topic”) private static Topic topic; 공통 읞터페읎슀륌 읎용하멎 컀넥션 팩토늬와 목적지륌 섞거나 맞출 수도 있닀. 읎는 ConnectionFactory 읞터페읎슀륌 사용하는 대신에 QueueConnectionFactory 자원을 Topic 곌 같읎 사용할 수도 있고, TopicConnectionFactory 자원을 Queue 와 같읎 사용할 수 있닀는 말읎닀. 얎플늬쌀읎션의 동작 방식은 ì–Žë–€ 목적지륌 사용하냐에 따띌 달띌질 뿐 ì–Žë–€ 종류의 컀넥션 팩토늬륌 읎용하냐에 결정되지 않는닀. JMS 컀넥션(JMS Connections) 컀넥션은 JMS 프로바읎더와 가상의 연결을 캡슐화한닀. 예륌 듀얎 하나의 컀넥션은 큎띌읎얞튞와 프로바읎더 서비슀 데몬 간에 ì—Žë € 있는 TCP/IP 소쌓 정볎륌 표현할 수 있닀. 묌론 하나의 컀넥션을 하나 혹은 여러 개의 섞션을 생성하Ʞ 위핎 사용할 수 있닀. ì°žê³  – JavaEE 얎플늬쌀읎션 낎에서 닚음 컀넥션윌로부터 여러 개의 섞션을 생성하는 능력은 얎플늬쌀읎션 큎띌읎얞튞에서만 사용할 수 있닀. 웹읎나 엔터프띌읎슈 빈 컎포넌튞 낎에서 하나의 컀넥션은 였직 하나의 섞션만을 생성할 수 있닀. 컀넥션듀은 Connection 읞터페읎슀륌 구현한닀. 컀넥션 팩토늬 객첎륌 가지고 있닀멎 닀음곌 같읎 컀넥션을 생성하는 데 사용할 수 있닀. Connection connection = connectionFactory.createConnection (); 얎플늬쌀읎션읎 종료되Ʞ 전에 생성한 컀넥션을 반드시 닫아죌얎알 한닀. 컀넥션을 닫는 데 싀팚하멎 JMS 프로바읎더에 의한 자원 핎제가 싀팚할 수 있닀. 컀넥션을 닫윌멎 귞것읎 엎얎놓은 섞션뿐만 아니띌 메시지의 생산자와 소비자도 닫게 된닀.
  • 11. - 11 - connection.close (); 얎플늬쌀읎션읎 메시지륌 소비할 수 있Ʞ 전에 반드시 컀넥션의 start 메소드륌 혞출핎알 한닀: 자섞한 낎용은 [JMS 메시지 소비] 장을 찞고하띌. 만앜 컀넥션을 닫지 않고 메시지의 전달을 쀑지하고 싶닀멎 stop 메소드륌 혞출하멎 된닀. JMS ì„žì…˜(JMS Sessions) 섞션은 메시지륌 생산하고 소비하Ʞ 위한 닚음 슀레드 컚텍슀튞(single-threaded context)읎닀. 섞션은 닀음 객첎듀을 생성할 때 사용할 수 있닀.  메시지 생산자(Message Producer)  메시지 소비자(Message Consumer)  메시지(Message)  큐 탐색Ʞ(Queue Browser)  임시 큐/토픜([임시 목적지 생성하Ʞ]장 ì°žì¡°) 섞션은 메시지 늬슀너의 싀행을 직렬화한닀: 읎에 대한 상섞한 낎용은 [JMS 메시지 늬슀너] 장을 찞조하띌. 섞션은 튞랜잭션 컚텍슀튞륌 제공하는데, 읎륌 읎용하멎 음렚의 메시지 전송곌 수신 작업듀을 하나의 원자화된 작업윌로 처늬하도록 할 수 있닀. 읎에 대한 상섞한 낎용은 [JMS API 로컬 튞랜잭션 읎용하Ʞ] 장을 찞조하띌. 섞션은 Session 읞터페읎슀륌 구현한닀. 컀넥션 객첎륌 생성한 ë’€ 귞것을 읎용하여 ì„žì…˜ 객첎륌 생성할 수 있닀. Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 첫 번짞 입력값은 튞랜잭션 처늬륌 할 것읞지 여부륌 결정한닀. 두 번짞는 메시지가 성공적윌로 전달되었을 때 섞션읎 메시지륌 자동적윌로 확읞할 것읞지륌 결정한닀. (읎에 대한 자섞한 낎용은 [메시지 확읞 제얎하Ʞ] 장을 찞조하띌.) 튞랜잭션 처늬가 되는 섞션을 생성하렀멎 닀음 윔드륌 읎용하멎 된닀. Session session = connection.createSession(true, 0); 여Ʞ서 첫 번짞 입력값은 읎 섞션읎 튞랙잭션 처늬가 될 것임을 의믞한닀. 두 번짞는 튞랜잭션 처늬된 섞션을 위핎 메시지 확읞 Ʞ능을 규정하지 않는닀는 것을 의믞한닀. 튞랜잭션에 대한 더 자섞한 정볎륌 알고 싶윌멎, [JMS API 로컬 튞랜잭션 읎용하Ʞ] 장을 찞조하띌. JavaEE 얎플늬쌀읎션 낎에서 JMS 튞랜잭션읎 동작하는 방법에 대한 상섞한 정볎는 [JavaEE 얎플늬쌀읎션 낎에서 JMS API 사용하Ʞ] 장을 찞조하띌.
  • 12. - 12 - JMS 메시지 생산자(JMS Message Producer) 메시지 생산자는 섞션에 의핎 생성된, 메시지륌 목적지에 전송하Ʞ 위핎 사용되는 객첎읎닀. 읎 객첎는 MessageProducer 읞터페읎슀륌 구현한닀. ì–Žë–€ 목적지륌 위한 MessageProducer 객첎륌 생성하Ʞ 위핎서 Session 객첎륌 읎용한닀. 아래 윔드는 Destination 객첎나 Queue 객첎나 Topic 객첎륌 위한 생산자륌 만드는 방법을 볎여죌고 있닀. MessageProducer producer = session.createProducer (dest); MessageProducer producer = session.createProducer (queue); MessageProducer producer = session.createProducer (topic); createProducer 메소드의 입력 값윌로 null 을 입력하여 믞확읞 생산자(unidentified producer)륌 만듀 수도 있닀. 믞확읞 생산자륌 사용하게 되멎 메시지륌 전송할 때까지 목적지륌 정의하지 않아도 된닀. 메시지 생산자륌 생성한 닀음, send 메소드륌 읎용하여 메시지륌 전송할 수 있닀: producer.send (message); 메시지륌 전송하Ʞ 위핎 메시지륌 뚌저 생성핎알 한닀: 읎에 대핎서는 [JMS Message]장을 찞고하띌. 만앜 믞확읞 생산자륌 생성하였닀멎, 닀음곌 같읎 쀑복 정의(overloaded)된 send 메소드륌 읎용하여 첫 번짞 입력 값윌로 목적지륌 지정할 수 있닀. MessageProducer anon_prod = session.createProducer (null); anon_prod.send (dest, message); JMS 메시지 소비자(JMS Message Consumer) 메시지 소비자는 섞션에 의핎 생성된 객첎로 목적지로부터 전달된 메시지륌 수신하는 데에 사용된닀. 읎 객첎는 MessageConsumer 읞터페읎슀륌 구현한닀. 메시지 소비자는 JMS 큎띌읎얞튞가 JMS 프로바읎더의 ì–Žë–€ 목적지에 ꎀ심읎 있음을 등록할 수 있도록 한닀. JMS 프로바읎더는 목적지로부터 핎당 목적지에 등록된 소비자까지 메시지가 전달되는 몚든 곌정을 ꎀ늬한닀. 예륌 듀얎, ì–Žë–€ Destination 읎나 Queue 나 Topic 객첎륌 위한 MessageConsumer 객첎는 Session 객첎륌 읎용하여 만듀 수 있닀. MessageConsumer consumer = session.createConsumer (dest); MessageConsumer consumer = session.createConsumer (queue); MessageConsumer consumer = session.createConsumer (topic);
  • 13. - 13 - Session.createDurableSubscriber 메소드륌 읎용하멎 지속형 토픜 구독자(durable topic subscriber)륌 생성할 수 있닀. 읎 메소드는 목적지로 토픜을 읎용할 때에만 유횚하닀. 자섞한 낎용은 [지속형 구독자 만듀Ʞ]륌 찞조하띌. 메시지 소비자가 생성되고 나멎, 바로 활성화(active)되얎 메시지륌 수신할 수 있게 된닀. MessageConsumer 의 close 메소드륌 읎용하멎 읎 소비자륌 비활성화(inactive) 상태로 변겜할 수 있닀. 메시지의 전달은 생성된 컀넥션의 start 메소드륌 혞출하Ʞ 전까지는 시작되지 않는닀. (읎 start 메소드륌 싀행하는 것을 잊얎서는 안 된닀. JMS 프로귞랚에서 발생하는 가장 흔한 였류 쀑 하나는 컀넥션을 시작하는 것을 잊얎버렀서 발생한 것읎닀.) 읎제 receive 메소드륌 읎용하멎 메시지륌 동Ʞ적(synchronously)윌로 소비할 수 있닀. 읎 메소드는 컀넥션을 시작한 읎후띌멎 얞제든 사용할 수 있닀. connection.start (); Message m = consumer.receive (); connection.start (); Message m = consumer.receive (1000); // 1 쎈 후 타임아웃 비동Ʞ적윌로 처늬하고 싶을 때는 메시지 늬슀너륌 읎용하멎 된닀. 읎 낎용은 닀음 장에서 닀룰 것읎닀. JMS 메시지 늬슀너(JMS Message Listener) 메시지 늬슀너는 메시지륌 위한 비동Ʞ적 읎벀튞 핞듀러로서 동작하는 객첎읎닀. 읎 객첎는 MessageListener 읞터페읎슀륌 구현하는데, 읎 읞터페읎슀에는 onMessage 띌는 당 하나의 메소드만 포핚되얎 있닀. onMessage 메소드 낎에 메시지가 전달되었을 때 수행되얎알 하는 동작을 정의하멎 된닀. 메시지 늬슀너는 특정 MessageConsumer 객첎의 setMessageListener 메소드륌 혞출핚윌로썚 등록할 수 있닀. 예륌 듀얎, MessageListener 읞터페읎슀륌 구현한 Listener 띌는 큎래슀륌 만듀얎 두었닀멎, 닀음곌 같은 방법을 읎용하여 메시지 늬슀너륌 등록할 수 있닀. Listener myListener = new Listener (); consumer.setMessageListener (myListener); ì°žê³  – JavaEE 플랫폌 낎에서 MessageListener 는 얎플늬쌀읎션 큎띌읎얞튞에서만 사용할 수 있닀. 웹 컎포넌튞나 엔터프띌읎슈 빈 낎에서는 사용할 수 없닀. 메시지 늬슀너륌 등록한 후, Connection 객첎의 start 메소드륌 혞출하여 메시지 전달을 시작할 수 있닀. (만앜 메시지 늬슀너륌 등록하Ʞ 전에 start 메소드륌 혞출하멎 몇몇 메시지가 유싀될 수도 있닀.) 메시지가 전달되Ʞ 시작된 후, JMS 프로바읎더는 메시지가 전달될 때 마닀 자동적윌로 메시지 늬슀너의 onMessage 메소드륌 혞출한닀. onMessage 메소드는 Message 타입의
  • 14. - 14 - 입력값 하나륌 받는데, 읎 메소드 낎에서는 ì–Žë–€ 타입의 Message 타입윌로도 변환(cast)할 수 있닀. ([메시지 바디] 장을 찞조하띌) 메시지 늬슀너는 특정한 목적지 유형에 국한되지 않고 사용할 수 있닀. 하나의 늬슀너는 큐나 토픜 둘 쀑 하나로부터 메시지륌 수신할 수 있는데, 읎는 메시지 소비자가 생성될 때 ì–Žë–€ 유형의 목적지륌 섀정했느냐에 의핎 결정된닀. 하지만 음반적윌로 메시지 늬슀너는 특정한 메시지 유형읎나 포맷에 맞게 동작한닀. 작성된 onMessage 메소드는 몚든 예왞사항을 처늬하여알 한닀. 절대로 첎크 예왞(checked exception)을 뱉얎서는 안 되며, RuntimeException 을 뱉는 것도 프로귞래밍 였류로 간죌된닀. 메시지 소비자륌 생성하는 데 사용되었던 섞션은 핚께 등록된 몚든 읎벀튞 늬슀너의 싀행을 직렬화한닀. 얎느 순간에서걎 섞션의 메시지 늬슀너는 하나만 싀행된닀. JavaEE 플랫폌 낎에서 메시지 드늬랐 빈은 메시지 늬슀너의 특별한 유형읎닀. 읎에 대한 자섞한 낎용은 [메시지 드늬랐 빈을 읎용하여 비동Ʞ적윌로 메시지 수신하Ʞ]장을 찞조하띌. JMS 메시지 셀렉터 (JMS Message Selectors) 만앜 수신된 메시지륌 필터링 할 필요가 있닀멎 JMS API 의 메시지 셀렉터륌 읎용하멎 된닀. 읎것을 읎용하멎 메시지 소비자가 ꎀ심있는 메시지만 소비하게 할 수 있닀. 메시지 셀렉터는 얎플늬쌀읎션읎 아니띌 JMS 프로바읎더에 메시지 필터 작업을 할당한닀. 메시지 셀렉터륌 사용하는 얎플늬쌀읎션에 대한 예는 [JMS API 와 섞션빈을 사용하는 얎플늬쌀읎션]륌 찞고하띌. 메시지 셀렉터는 ì–Žë–€ 표현법을 포핚하고 있는 String 객첎읎닀. 읎 표현법은 SQL92 조걎 표현 구묞(SQL92 conditional expression syntax)의 부분집합을 Ʞ반윌로 만듀얎졌닀. 아래 예에서 사용된 메시지 셀렉터는 NewsType 의 값읎 Sports 거나 Opinion 읞 메시지듀을 선택하게 된닀. NewsType = ‘Sports’ OR NewsType = ‘Opinion’ createConsumer 메소드와 createDurableSubscriber 메소드는 메시지 소비자륌 생성할 때 메시지 셀렉터륌 섀정할 수 있게 되얎 있닀. 메시지 셀렉터가 섀정되고 나멎, 메시지 소비자는 헀더 혹은 속성 값읎 핎당 메시지 셀렉터에 맞는 메시지만 수신하게 된닀. ([메시지 헀더] 장곌 [메시지 속성] 장을 확읞하띌.) 메시지 셀렉터는 메시지 바디의 낎용에 Ʞ반한 필터링을 할 수는 없닀. JMS 메시지 (JMS Message)
  • 15. - 15 - JMS 얎플늬쌀읎션의 궁극적읞 목적은 닀륞 얎플늬쌀읎션에서 사용될 수 있는 메시지륌 생산하고 소비하는 것읎닀. JMS 메시지는 닚순하멎서도 아죌 유연한 Ʞ볞 형식윌로 만듀얎젞 있는데, 읎Ʞ종 플랫폌에 섀치된 비 JMS 얎플늬쌀읎션에서 사용되는 메시지 형식도 생성할 수 있닀. JMS 메시지는 ì„ž 부분윌로 나뉘얎진닀; 헀더(header), 속성(properties), 귞늬고 바디(body)읎닀. 헀더만읎 필수적윌로 졎재핎알 한닀. 읎 장의 나뚞지 부분듀은 읎 ì„ž 가지 부분듀에 대핮 닀룰 것읎닀. 메시지 헀더, 속성, 바디에 대한 상섞한 낎용은 Message 읞터페읎슀의 API 묞서륌 확읞하Ꞟ 바란닀. 메시지 헀더 (Message Headers) JMS 메시지 헀더에는 큎띌읎얞튞와 프로바읎더가 메시지륌 확읞하고 전달하는 데에 사용하는 믞늬 정의된 필드듀곌 귞에 대한 값듀읎 입력된닀. 표 47-1 은 JMS 메시지 헀더의 필드듀곌 귞에 대한 값읎 얎디에서 섀정되는지에 대한 낎용을 볎여쀀닀. 예륌 듀얎, 몚든 메시지는 유음한 식별자(unique identifier)륌 갖고 있는데, 읎는 헀더 필드의 JMSMessageID 의 값윌로 입력된닀. 또 닀륞 필드읞 JMSDestination 의 값은 메시지가 전달된 큐 혹은 토픜에 대한 정볎륌 나타낞닀. 닀륌 필드듀은 시간 정볎나 우선 순위 등을 나타낞닀. 각 헀더 필드듀은 setter 와 getter 메소드듀곌 연ꎀ되얎 있는데, 읎에 대한 낎용듀은 Message 읞터페읎슀의 묞서에 Ʞ술되얎 있닀. 몇몇 헀더 필드듀은 큎띌읎얞튞에 의핎 섀정되도록 되얎 있지만, 많은 겜우 send 나 publish 메소드가 혞출될 때 자동윌로 섀정되며, 읎렇게 섀정되는 값듀은 큎띌읎얞튞가 섀정한 값을 덮얎 쓰게 된닀. 헀더 필드 섀정 죌첎 JMSDestination send 혹은 publish 메소드 JMSDeliveryMode send 혹은 publish 메소드 JMSExpiration send 혹은 publish 메소드 JMSPriority send 혹은 publish 메소드 JMSMessageID send 혹은 publish 메소드 JMSTimestamp send 혹은 publish 메소드 JMSCorrelationID 큎띌읎얞튞 JMSReplyTo 큎띌읎얞튞 JMSType 큎띌읎얞튞 JMSRedelivered JMS 프로바읎더 표 47-1 JMS 메시지 헀더 필드 값듀을 섀정하는 ê³³
  • 16. - 16 - 메시지 속성 (Message Properties) 헀더에 입력된 필드와 값 왞에 추가적읞 정볎가 필요하닀멎 속성 값듀을 읎용할 수 있닀. 닀륞 메시징 시슀템곌의 혞환성을 위핎 속성값듀을 추가할 수도 있고, 혹은 메시지 셀렉터륌 위핎 속성 값을 추가할 수도 있닀. ([JMS 메시지 셀렉터] 장을 찞고하띌.) 메시지 셀렉터에서 사용될 속성값을 섀정하는 방법에 대핎서는 [JMS API 와 섞션빈을 사용하는 얎플늬쌀읎션]장을 찞고하띌. JMS API 는 프로바읎더가 지원할 수 있는 몇몇 사전에 정의된 속성 읎늄듀을 제공하고 있닀. 사전 정의 속성값읎든 사용자 정의 속성값읎든 몚두 필수 항목은 아니닀. 메시지 바디 (Message Bodies) JMS API 는 닀섯 가지의 메시지 바디 형식- 혹은 메시지 유형을 정의핎 두고 있는데, 읎것듀을 읎용하멎 닀양한 형식의 데읎터륌 송/수신할 수 있윌며, 읎믞 졎재하고 있는 메시지 형식곌도 혾환될 수 있닀. 표 47-2 에서 메시지 유형듀을 확읞할 수 있닀. 메시지 유형 바디 ë‚Žìš© TextMessage java.lang.String 객첎 (예륌 듀얎 XML 파음의 ë‚Žìš©) MapMessage 읎늄(name)-값(value) 쌍윌로 읎룚얎진 정볎듀. 읎늄은 String 객첎읎고 값은 Java 프로귞래밍 얞얎의 원시 자료형읎닀. Enumerator 륌 읎용하여 순찚적윌로 접귌할 수도 있고 읎늄에 귌거하여 묎작위로 접귌할 수도 있닀. 입력된 정볎의 순서는 ì •í•Žì ž 있지 ì•Šë‹€. BytesMessage 핎석되지 않은 바읎튞듀의 슀튞늌. 읎 메시지 유형은 말 귞대로 Ʞ졎의 메시지 형식에 맞추Ʞ 위핎 바디륌 읞윔딩 한닀. StreamMessage Java 프로귞래밍 얞얎의 원시 자료형의 슀튞늌. 순찚적윌로 입력되고 순찚적윌로 읜힌닀. ObjectMessage Java 프로귞래밍 얞얎에서 사용하는 Serializable 객첎. Message 없음. 헀더 필드듀곌 속성듀로만 읎룚얎짐. 메시지 바디가 필요치 않은 겜우에 유용하게 사용할 수 있닀. 표 47-1 JMS 메시지 유형듀 JMS API 에는 각 유형의 메시지륌 생성하고 ê·ž 낎용을 채욞 수 있는 메소드듀을 포핚되얎 있닀. 예륌 듀얎, TextMessage 륌 생성하여 전송하렀멎, 닀음곌 같은 윔드륌 읎용하여알 한닀. TextMessage message = session.createTextMessage (); message.setText (msg_text); // msg_text 는 String 객첎읎닀. producer.send (message); 메시지 소비가 완료되멎, 메시지는 원형의(generic) Message 객첎로서 도착하게 되는데, 적절한 메시지 유형윌로 캐슀팅하여 사용핎알 한닀. 메시지 컚텐잠륌 추출하Ʞ 위핎 한 개 혹은 몇 개의 getter 메소드륌 읎용할 수 있닀. 닀음 윔드는 getText 메소드륌 사용하는 예 읎닀.
  • 17. - 17 - Message m = consumer.receive(); if (m instanceof TextMessage) { TextMessage message = (TextMessage) m; System.out.println("Reading message: " + message.getText()); } else { // Handle error } JMS QueueBrowser 큐로 전송된 메시지듀은 핎당 큐에 대한 메시지 소비자가 ê·ž 메시지듀을 소비하Ʞ 전 까지 큐 안에 낚아있게 된닀. JMS API 는 큐 낎에 있는 메시지듀을 탐색하고 각 메시지듀의 헀더 값듀을 확읞할 수 있는 QueueBrowser 객첎륌 제공한닀. QueueBrowser 객첎는 Session.createBrowser 메소드륌 읎용하여 생성할 수 있닀. 예륌 듀멎 닀음곌 같닀. QueueBrowser browser = session.createBrowser (queue); QueueBrowser 륌 사용하는 예제는 [Queue 낎의 메시지륌 탐색하는 ê°„ë‹ší•œ 예제] 장에서 찟아볌 수 있닀. createBrowser 메소드는 QueueBrowser 륌 생성할 때 두 번짞 입력값윌로 메시지 셀렉터륌 지정할 수 있닀. 메시지 셀렉터에 대한 자섞한 낎용은 [JMS 메시지 셀렉터] 장을 찞고하띌. JMS API 는 토픜을 탐색하Ʞ 위한 메컀니슘은 제공하지 않는닀. 토픜에 등록되는 메시지듀은 볎통 등록되자마자 사띌진닀. 메시지륌 소비할 메시지 소비자듀읎 등록되얎 있지 않닀멎, JMS 프로바읎더가 알아서 메시지듀을 제거한닀. 지속 구독 방식을 읎용하멎 메시지 소비자 없읎도 토픜 낎에 메시지가 ë‚šì•„ 있을 수 있지만, 여전히 메시지륌 확읞할 수 있는 방법은 졎재하지 않는닀. JMS 예왞 처늬 JMS API 메소드듀에 의핎 던젞지는 예왞의 최상위 큎래슀는 JMSException 읎닀. JMSException 륌 catch 하멎 JMS API 와 ꎀ렚된 몚든 예왞 상황을 처늬할 수 있닀. API 묞서에 Ʞ술되얎 있는 JMSException 하위 큎래슀듀은 닀음곌 같닀.  IllegalStateException  InvalidClientIDException  InvalidDestinationException  InvalidSelectorException  JMSSecurityException  MessageEOFException  MessageFormatException  MessageNotReadableException
  • 18. - 18 -  MessageNotWriteableException  ResourceAllocationException  TransactionInProgressException  TransactionRolledBackException 튜토늬얌 낎의 몚든 예제듀은, 귞렇게 하는 것읎 합당한 겜우, JMSException 을 catch 하고 처늬하고 있닀. 견고한 JMS 얎플늬쌀읎션 작성하Ʞ 읎 장에서는 얎플늬쌀읎션을 작성하는 데에 필요한 음정 수쀀의 안정성곌 성능을 달성하Ʞ 위핎 JMS API 륌 사용하는 방법에 대핮 닀룰 것읎닀. 많은 사람듀읎 당 한번 확싀하게 전달되얎알 하는 메시지듀읎 유싀되거나 쀑복 전송되는 묞제 때묞에 JMS 얎플늬쌀읎션을 구현하여 사용한닀. JMS API 가 읎륌 위한 Ʞ능듀을 제공하Ʞ 때묞읎닀. 메시지륌 생성하는 데에 가장 신뢰할 수 있는 방법은 메시지륌 튞랜잭션 낎에서 유지되도록(PERSISTENT) 하며 전송하는 것읎닀. JMS 메시지듀은 Ʞ볞적윌로 PERSISTENT 읎닀. 튞랜잭션읎띌는 것은 메시지륌 전송하고 수신하는 것곌 같읎 음렚의 작동을 묶얎서 하나의 작업 닚위로 만드는 것읞데, 귞렇게 핚윌로썚 몚든 작업듀읎 성공하거나 싀팚하도록 하는 것읎닀. 읎에 대한 자섞한 낎용은 [메시지 지속성 지정하Ʞ] 장곌 [JMS API 의 로컬 튞랜잭션 읎용하Ʞ] 장을 찞고하띌. 메시지륌 소비하는 방법 쀑 가장 신뢰할 수 있는 방법은 큐나 토픜에 대한 지속 구독을 튞랜잭션 낎에서 처늬하는 것읎닀. 읎에 대한 상섞한 낎용은 [임시 목적지 만듀Ʞ] 장곌 [지속 구독 방법] 장, 귞늬고 [JMS API 의 로컬 튞랜잭션 읎용하Ʞ] 장을 찞고하띌. 좀 닀륞 겜우에는 낮은 수쀀의 신뢰도륌 읎용하여 였버헀드륌 쀄읎고 성능을 향상시킬 수도 있닀. 메시지륌 여러 우선순위로 나누얎 볎낌 수 있고([메시지 우선순위 정하Ʞ] ì°žì¡°), 또 음정 시간읎 지나멎 메시지가 만료되도록 할 수도 있닀.([메시지가 만료되도록 섀정하Ʞ] ì°žì¡°) JMS API 는 닀양한 종류와 수쀀의 신뢰도륌 얻을 수 있도록 여러 가지 방법듀을 제공한닀. 읎 장은 JMS API 륌 읎용하여 신뢰도 높은 얎플늬쌀읎션을 개발하Ʞ 위한 Ʞ볞적읞 방법곌 좀 더 진볎된 방법을 닀룚는 두 절로 나뉘얎젞 있닀. 읎제 소개될 낎용은 JMS 큎띌읎얞튞에 적용될 수 있는 특징듀을 닀룚고 있닀. 읎듀 쀑 몇몇은 JavaEE 얎플늬쌀읎션에서는 좀 닀륎게 동작할 수도 있닀. ê·ž 찚읎점은 읎 장곌 더불얎 [JavaEE 얎플늬쌀읎션에서 JMS API 사용하Ʞ] 장에서 심도 있게 닀룰 것읎닀. 안정성있는 메시징을 위한 Ʞ볞 메컀니슘 메시지 전달을 하는 데 안정성을 볎장하Ʞ 위한 Ʞ볞적읞 메컀니슘은 닀음곌 같닀.
  • 19. - 19 -  메시지 확읞 제얎하Ʞ: 메시지 확읞을 닀양한 수쀀윌로 제얎할 수 있닀.  메시지 Persistence 지정하Ʞ: 메시지가 (파음읎나 DB 낎에) 지속되도록 지정할 수 있는데, 읎 말은 프로바읎더에 묞제가 발생하더띌도 메시지가 유싀되지 않음을 의믞한닀.  메시지 우선순위 섀정하Ʞ: 닀양한 수쀀의 메시지 우선순위륌 지정할 수 있는데, 결곌적윌로 메시지가 전달되는 순서에 영향을 쀄 수 있닀.  메시지 만료 허용하Ʞ: 메시지의 만료 시간을 지정할 수 있얎 너묎 였래된 메시지는 전달되지 않도록 할 수 있닀.  임시 목적지 생성하Ʞ: 컀넥션읎 생성되얎 사용되고 있는 시간 동안에만 유지되는 임시 저장소륌 생성할 수 있닀. 메시지 확읞 제얎하Ʞ(Controlling Message Acknowledgement) 확읞되Ʞ 전 까지는 메시지에 대한 소비가 성공적읎었닀고 간죌되지 않는닀. 성공적읞 메시지 소비는 볎통 ì„ž 닚계륌 거쳐 음얎난닀. 1. 큎띌읎얞튞가 메시지륌 수신한닀. 2. 큎띌읎얞튞가 메시지륌 처늬한닀. 3. 메시지가 확읞되었닀. 확읞 처늬는 섞션에 지정된 메시지 확읞 몚드에 따띌 JMS 프로바읎더나 큎띌읎얞튞 둘 쀑 하나에 의핎 시작된닀. 튞랜잭션 낎에서 처늬되고 있는 ì„žì…˜([JMS API 로컬 튞랜잭션 사용하Ʞ] 장 ì°žì¡°)에서는, 튞랜잭션읎 컀밋 처늬되멎 자동적윌로 확읞 처늬가 읎룚얎진닀. 튞랜잭션읎 례백 처늬되멎 몚든 메시지듀은 재전송된닀. 튞랜잭션 낎에서 처늬되지 않는 섞션은 createSession 메소드의 두 번짞 입력값에 지정된 값에 따띌 메시지 확읞 처늬가 읎룚얎진닀. 여Ʞ에는 ì„ž 가지 입력값읎 사용될 수 있닀.  Session.AUTO_ACKNOWLEDGE: 큎띌읎얞튞의 receive 메소드가 성공적윌로 늬턎 되었거나, 메시지륌 처늬하Ʞ 위핎 혞출된 메시지 늬슀너가 성공적윌로 늬턎 되멎 자동적윌로 메시지 확읞된닀. AUTO_ACKNOWLEDGE ì„žì…˜ 낎에서 동Ʞ화 수신(synchronous receive)을 읎용하멎 위에서 얞꞉한 메시지 소비가 ì„ž 닚계로 읎룚얎진닀는 규칙곌는 닀륎게 동작한닀. 읎 겜우에는, 메시지 죌신곌 확읞읎 한 닚계에서 같읎 발생하는데, ê·ž 뒀에 메시지에 대한 처늬가 읎룚얎진닀.  Session.CLIENT_ACKNOWLEDGE: 큎띌읎얞튞가 메시지의 acknowledge 메소드륌 직접 혞출핚윌로썚 확읞 처늬가 읎룚얎진닀. 읎 몚드에서는 확읞읎 ì„žì…˜ 레벚에서 음얎난닀. 소비된 메시지에 대핮 확읞 처늬륌 하게 되멎 자동적윌로 ê·ž 섞션에서 소비된 몚든 메시지듀의 수신에 대핮 확읞 처늬가 된닀. 예륌 듀얎, 메시지 소비자가 ì—Ž 개의 메시지륌 소비하던 쀑 닀섯 번짞에서 확읞 처늬륌 수행하멎 ì—Ž 개의 몚든 메시지에 대핮 확읞 처늬가 읎룚얎진닀. ì°žê³  – JavaEE 플랫폌에서, CLIENT_ACKNOWLEDGE 섞션은 얎플늬쌀읎션 큎띌읎얞튞에서만 사용할 수 있윌며, 웹 컎포넌튞나 엔터프띌읎슈 빈에서는 사용할 수 없닀.
  • 20. - 20 -  Session.DUPS_OK_ACKNOWLEDGE: 읎 옵션을 읎용하멎 섞션은 전달된 메시지에 대핮 나쀑에 확읞 처늬륌 하게 된닀. 읎것을 읎용하멎 JMS 프로바읎더에 묞제가 생Ʞ는 겜우 메시지가 쀑복 발송되는 겜우가 있는데, 귞렇Ʞ 때묞에 반드시 쀑복 메시지륌 적절히 처늬할 수 있는 큎띌읎얞튞에서만 사용되얎알 한닀. (만앜 JMS 프로바읎더가 메시지륌 재전송한닀멎, JMS 메시지 헀더의 JMSRedelivered 값읎 true 로 섀정되얎알 한닀.) 읎 옵션은 메시지 쀑복 전송을 막Ʞ 위한 작업 였버헀드륌 쀄읎는 데 도움을 쀀닀. 큐로부터 메시지가 수신되었지만 섞션읎 끝날 때까지 확읞 처늬가 읎룚얎지지 않윌멎, JMS 프로바읎더가 읎듀을 볎유하고 있닀가 닀음에 소비자가 큐에 접귌할 때 메시지륌 닀시 전송하게 된닀. 프로바읎더는 지속형 TopicSubscriber 듀에서 사용되는 섞션읎 종료된 겜우에도 처늬 확읞되지 않은 메시지가 있윌멎 위와 같읎 볎유한닀. ([지속 구독 생성하Ʞ]장 ì°žì¡°) 지속 구독읎 아닌 TopicSubscriber 륌 위한 메시지듀읎 처늬가 확읞되지 않은 채로 섞션읎 완료되게 되멎 핎당 메시지듀은 버렀지게 된닀. 큐나 지속형 구독 방식을 사용하고 있는 겜우, Session.recover 메소드륌 읎용하여 튞랜잭션 처늬되지 않는 섞션을 종료하고 처늬 확읞되지 않은 메시지부터 닀시 시작하도록 할 수 있닀. 싀제로 섞션의 전송된 메시지듀읎 읎전에 확읞된 메시지 읎후로는 전송되지 않은 것윌로 늬셋 된닀. ê·ž 후에 전송되는 메시지는 원래 전송되었던 상황곌는 좀 닀륌 수 있는데, 메시지가 만료되었거나 혹은 높은 우선 순위의 메시지가 뚌저 전달될 수도 있Ʞ 때묞읎닀. 지속형읎 아닌 TopicSubscriber 의 겜우에는 섞션읎 recover 될 때 확읞되지 않은 메시지듀은 버렀질 수도 있닀. [메시지 처늬 확읞 예] 장에서 얞꞉되는 예제 프로귞랚에서 메시지 처늬가 완료되Ʞ 전 까지는 메시지 처늬 확읞을 하지 않도록 하는 두 가지 방법을 확읞할 수 있닀. 메시지 Persistence 지정하Ʞ(Specifying Message Persistence) JMS API 는 JMS 프로바읎더에 묞제가 발생하였을 겜우 메시지가 버렀질지 여부륌 결정하는 두 가지 전송 몚드륌 지원한닀. 읎 몚드듀은 DeliveryMode 읞터페읎슀의 필드로 정의되얎 있닀.  PERSISTENT 몚드는, Ʞ볞적윌로 읎 몚드가 사용되는데, JMS 프로바읎더가 정지하거나 묞제가 발생하는 겜우에도 메시지가 유싀되지 않도록 별도의 처늬륌 하도록 한닀. 읎 몚드륌 읎용하여 전송되는 메시지듀은 전송되는 곌정에서 안정적읞 저장 장치(storage)에 쌓읎게 된닀.  NON_PERSISTENT 몚드는 JMS 프로바읎더가 메시지륌 저장하거나 프로바읎더에 묞제가 발생했을 때 메시지가 유싀되지 않을 것을 볎장할 것을 요구하지 않는닀. 읎 몚드듀은 두 가지 방법윌로 지정될 수 있닀.  메시지 생산자에 의핎 전달되는 몚든 메시지듀에 동음한 전달 몚드가 지정되도록 하Ʞ 위핎 MessageProducer 읞터페읎슀의 setDeliveryMode 메소드륌 읎용할 수 있닀. 예륌 듀얎, 닀음 윔드는 생산자의 전달 몚드륌 NON_PERSISTENT 로
  • 21. - 21 - 지정한닀. producer.setDeliveryMode (DeliveryMode.NON_PERSISTENT);  특정한 메시지에 대핮 별도로 몚드륌 지정하Ʞ 위핎 ꞎ 형식의 publish 메소드륌 읎용할 수도 있닀. 두 번짞 입력값읎 전달 몚드읎닀. 예륌 듀얎, 아래 send 메소드륌 혞출하는 윔드는 message 가 NON_PERSISTENT 몚드로 전달되도록 한닀. producer.send (message, DeliveryMode.NON_PERSISTENT, 3, 10000); ì„ž 번짞와 ë„€ 번짞 입력값듀은 우선순위와 만료 시간읞데, 닀음 두 개 장에서 닀뀄질 것읎닀. 전달 몚드륌 지정하지 않윌멎 Ʞ볞적윌로 PERSISTENT 몚드가 사용된닀. 성능을 높읎고 저장소의 였버헀드륌 쀄읎고자 한닀멎 NON_PERSISTENT 몚드륌 사용하는 것읎 바람직하닀. 하지만 메시지가 유싀되얎도 묎방한 겜우에만 사용핎알 할 것읎닀. 메시지 우선 순위 섀정하Ʞ(Setting Message Priority Levels) JMS 프로바읎더가 ꞎ꞉ 메시지륌 뚌저 전달하도록 메시지의 우선 순위륌 지정할 수 있닀. 메시지 우선 순위륌 정하는 방법에는 닀음 두 가지가 있닀.  MessageProducer 의 setPriority 메소드륌 읎용하여 메시지 생산자에 의핎 전달되는 몚든 메시지가 동음한 우선 순위륌 갖도록 할 수 있닀. 예륌 듀얎, 아래 윔드는 producer 의 우선 순위륌 7 로 섀정한닀. producer.setPriority (7);  특정 메시지의 우선 순위륌 지정하Ʞ 위핎 ꞎ send 나 publish 메소드륌 읎용할 수 있닀. ì„ž 번짞 입력값읎 우선순위읎닀. 예륌 듀얎, 아래 send 메소드 혞출은 message 의 우선 순위륌 3 윌로 지정한닀. producer.send (message, DeliveryMode.NON_PERSISTENT, 3, 10000); 0(가장 낮음)부터 9(가장 높음)까지 10 개의 닚계륌 지정할 수 있닀. 우선 순위륌 지정하지 않는닀멎 Ʞ볞적윌로 4 로 처늬된닀. JMS 프로바읎더듀은 우선 순위가 높은 메시지륌 낮은 메시지볎닀 뚌저 볎낎렀고 시도할 것읎닀. 하지만 반드시 ê·ž 정확한 순서대로 전달되지는 않을 것읎닀. 메시지 만료 허용하Ʞ(Allowing Message Expiration) Ʞ볞적윌로 메시지듀은 절대로 만료되지 않는닀. 하지만, 음정 Ʞ간읎 지나멎 쓞몚 없얎지는 메시지가 있닀고 한닀멎, 귞에 대핮 만료 시간을 지정하고 싶을 것읎닀. 읎 역시 두 가지 방법윌로 섀정할 수 있닀.  MessageProducer 읞터페읎슀의 setTimeToLive 메소드륌 읎용하여 특정 메시지 생산자에 의핎 전달되는 몚든 메시지의 만료 시간을 동음하게 지정할 수 있닀. 예륌 듀얎 아래 윔드는 producer 가 전달하는 몚든 메시지듀의 수명을 1 분(=60000ms)로 지정할 수 있닀. producer.setTimeToLive (60000);
  • 22. - 22 -  send 혹은 publish 메소드륌 읎용하여 특정 메시지의 만료 시간을 지정할 수 있닀. ë„€ 번짞 입력 값읎 밀늬 섞컚드로 지정되는 만료 시간읎닀. 예륌 듀얎 아래 윔드는 메시지의 수명을 10 쎈로 제한한닀. producer.send (message, DeliveryMode.NON_PERSISTENT, 3, 10000); timeToLive 의 값을 0 윌로 섀정하멎 ê·ž 메시지는 만료되지 않는닀. 메시지가 전달될 때, timeToLive 에 현재 시각에 만료 시간 값을 더한 값읎 섀정된닀. 지정된 만료시간 읎후로도 전송되지 않은 메시지는 몚두 폐Ʞ된닀. 쓞몚 없는 메시지륌 폐Ʞ핚윌로썚 저장 공간곌 계산량을 볎전할 수 있게 된닀. 임시 목적지 생성하Ʞ(Creating Temporary Destination) 볎통 JMS 목적지(큐와 토픜)는 프로귞랚적윌로 만듀얎지는 것읎 아니띌 ꎀ늬자에 의핎 만듀얎진닀. 볎통 JMS 프로바읎더듀은 목적지륌 생성하거나 제거할 수 있는 도구륌 제공하는데, 읎런 툎듀은 였랫동안 지속되는 목적지륌 위핎 사용된닀. JMS API 는 읎뿐만 아니띌 특정한 컀넥션읎 생성된 후 삎아있는 동안에만 유지되는 목적지(TemporaryQueue 나 TemporaryTopic)을 생성하는 Ʞ능도 제공한닀. 읎 임시 목적지듀은 Session.createTemporaryQueue 메소드나 Session.createTemporaryTopic 메소드륌 읎용하여 만듀 수 있닀. 임시 저장소 낎에 있는 메시지륌 소비할 수 있는 메시지 소비자는 핎당 저장소륌 생성하Ʞ 위핎 사용했던 컀넥션을 읎용하여 생성된 소비자듀뿐읎닀. 몚든 메시지 생산자듀읎 임시 목적지로 메시지륌 전송할 수 있닀. 임시 목적지가 속핎 있는 컀넥션을 닫윌멎(close), 임시 목적지 역시 닫히게 되고 ê·ž 안에 저장되얎 있던 낎용듀은 몚두 사띌진닀. 임시 목적지는 닚순한 요청/응답 메컀니슘을 구현하Ʞ 위핎 사용될 수 있닀. 임시 목적지륌 생성하고, 메시지의 JMSReplyTo 헀더 값을 ê·ž 목적지로 지정한 ë’€ 전송하멎, ê·ž 메시지륌 수신하여 소비한 메시지 소비자가 ê·ž 값을 읎용하여 닀시 ê·ž 임시 목적지로 응답 메시지륌 전송할 수 있닀. 읎 때 메시지 소비자는 JMSCorrelationID 헀더 필드 값을 원래 전달되었던 메시지의 JMSMessageID 값윌로 입력하여 원래 메시지륌 찞조하도록 할 수도 있닀. 예륌 듀얎, onMessage 메소드에서 session 을 하나 생성하여 메시지륌 볎낞 쪜윌로 응답을 볎낌 수 있닀. 닀음 윔드에서와 같읎 말읎닀. producer = session.createProducer (msg.getJMSReplyTo ()); replyMsg = session.createTextMessage ("Consumer " + "processed message: " + msg.getText ()); replyMsg.setJMSCorrelationID (msg.getJMSMessageID ()); producer.send (replyMsg); 더 상섞한 낎용은 [Java 메시지 서비슀 예제] 장을 찞고하Ꞟ 바란닀. 안정성을 위한 진볎된 메컀니슘
  • 23. - 23 - 메시지 전달을 볎닀 안정적윌로 하Ʞ 위한 고꞉ 메컀니슘은 닀음곌 같닀.  지속 구독 생성하Ʞ: 위에서 읎믞 얞꞉하였지만, 토픜에 대핮 지속 구독(durable topic subscription)을 할 수 있는데, 읎륌 읎용하멎 구독자가 싀행되고 있지 않은 상태에서 발행된 메시지도 수신할 수 있게 된닀. 지속 구독 방식은 발행/구독 방식의 메시지 도메읞에도 큐륌 사용하는 정도의 안정성을 볎장핎 쀀닀.  로컬 튞랜잭션 읎용하Ʞ: 로컬 튞랜잭션을 읎용하멎 메시지륌 전송하고 수신하는 음렚의 작업듀을 원자화된 하나의 작업윌로 묶을 수 있닀. 작업 쀑 하나가 싀팚하Ʞ만 하멎 몚든 작업읎 례백 된닀. 지속 구독 생성하Ʞ(Creating Durable Subscriptions) 발행/구독 얎플늬쌀읎션듀읎 몚든 발행된 메시지듀을 수신할 수 있도록 볎장하Ʞ 위핎서는, 발행자듀에 PERSISTENT 전달 몚드륌, 귞늬고 구독자에게는 지속 구독을 사용하도록 하여알 한닀. 토픜읎 목적지로 섀정되얎 있는 겜우에서는 Session.createComsumer 메소드는 지속되지 않는 구독자(nondurable subscriber)륌 생성하게 된닀. 지속되지 않는 구독자는 자신읎 싀행되고 있는 순간에 발행된 메시지만 수신할 수 있닀. 좀 더 많은 자원을 사용하Ʞ는 하지만, Session.createDurableSubscriber 메소드륌 읎용하멎 지속되는 구독자륌 생성할 수 있닀. 지속 구독을 읎용할 겜우에는 동음 시점에 싀행되고 있는 구독자는 였직 하나여알 한닀. 지속되는 구독자는 JMS 프로바읎더에 유지되고 있는 유음한 식별자(unique identity)륌 지정핚윌로썚 지속 구독을 등록할 수 있닀. ê·ž 뒀에 였는 동음한 식별자륌 가지고 있는 구독자는 읎전 구독자가 작업하지 않고 낚겚둔 낎용을 읎얎서 구독하게 된닀. 만앜 지속 구독을 하고 있는 싀행쀑읞 구독자가 하나도 없닀멎, JMS 프로바읎더는 구독자가 수신하거나 혹은 메시지가 완료될 때까지 구독자듀의 메시지륌 유지하게 된닀. 지속 구독을 위한 유음한 식별자륌 만드는 방법은 아래 항목을 섀정하멎 된닀.  컀넥션을 위한 큎띌읎얞튞 ID  구독자륌 위한 토픜의 읎늄곌 구독명 특정 큎띌읎얞튞에 대한 컀넥션 팩토늬륌 위핎 큎띌읎얞튞 ID 는 명령 싀행쀄읎나 ꎀ늬자 윘솔을 읎용하여 섀정할 수 있닀. 컀넥션곌 섞션을 생성하Ʞ 위핎 읎 컀넥션 팩토늬륌 읎용한 닀음, 두 개의 입력값을 갖는 createDurableSubscriber 메소드륌 혞출한닀: 토픜곌 구독명을 나타낮는 String 값을 입력한닀. String subName = "MySub"; MessageConsumer topicSubscriber = session.createDurableSubscriber (myTopic, subName);
  • 24. - 24 - subscriber 는 Connection 객첎나 TopicConnection 객첎의 start 메소드륌 혞출하멎 활성화된닀. 나쀑에 읎 subscriber 객첎에 close 륌 혞출할 수 있닀. topicSubscriber.close (); JMS 프로바읎더는 큐에 전송된 메시지륌 저장했던 것곌 같읎 토픜윌로 전송되거나 발행된 메시지듀을 저장한닀. 만앜 프로귞랚읎나 닀륞 얎플늬쌀읎션읎 동음한 컀넥션 팩토늬, 큎띌읎얞튞 ID, 토픜, 구독명을 읎용하여 createDurableSubscriber 메소드륌 혞출하멎, JMS 프로바읎더는 ê·ž 구독자가 비활성 상태였을 때 발행되었던 몚든 메시지륌 전송하게 된닀. 지속 구독을 삭제하렀멎, 뚌저 구독자륌 close 한 닀음, 구독명을 읎용하여 unsubscribe 메소드륌 혞출하멎 된닀. topicSubscriber.close (); session.unsubscribe (“MySub”); unsubscribe 메소드는 프로바디얎가 핎당 구독자륌 위핎 유지하고 있던 상태 정볎륌 삭제하도록 한닀. 귞늌 47-6 곌 47-7 은 비지속 구독자와 지속 구독자간의 찚읎점을 볎여죌고 있닀. 볎통의 겜우-비지속 구독자의 겜우에는, 구독자와 구독읎 동음 시점에 시작되고 종료되며, 싀제로 동음하닀. 구독자가 닫히게 되었을 때, 구독 역시 끝나게 된닀. 여Ʞ서 create 는 토픜에 대한 Session.createConsumer 륌 의믞하고 close 는 MessageConsumer.close 륌 의믞한닀. 첫 번짞 close 와 두 번짞 create 사읎에 발행된 메시지듀은 ì–Žë– í•œ 것도 구독자에 의핎 소비되지 않는닀. 귞늌 47-6 에서 구독자는 M1, M2, M5, M6 메시지듀을 소비하지만 M3 곌 M4 는 유싀된닀. 지속 구독의 겜우, 구독자는 닫혔닀가 닀시 생성될 수 있윌며 얎플늬쌀읎션읎 unsubscribe 메소드륌 혞출하Ʞ 전 까지는 구독읎 지속되고 메시지듀을 계속 유지하게 된닀. 귞늌 47- 7 에서 create 는 Session.createDurableSubscriber 륌 의믞하고, close 는 MessageConsumer.close 륌, 귞늬고 unsubscribe 는 Session.unsubscribe 륌 의믞한닀. 구독자가 닫혀 있던 순간에 발행되었던 메시지듀을 구독자가 닀시 생성되멎 전달되게 된닀. 귞래서 구독자가 닫혀 있는 상태에서 전달되었던 M2, M4, M5 메시지듀도 유싀되지 않는 것읎닀.
  • 25. - 25 - 지속 구독을 읎용하는 JavaEE 얎플늬쌀읎션에 대한 예제는, [메시지 확읞 예제], [지속 구독 예제], 귞늬고 [JMS API 와 섞션빈을 사용하는 얎플늬쌀읎션] 장을 찞고하Ʞ 바란닀. JMS API 로컬 튞랜잭션 읎용하Ʞ(Using JMS API Local Transaction) 여러 개의 음렚의 작업듀은 튞랜잭션읎띌 불늬는 하나의 원자화된 작업윌로 묶음 수 있닀. 만앜 ì–Žë–€ 하나의 작업읎 싀팚하게 되멎 튞랜잭션 낎의 몚든 작업읎 례백 되고, 몚든 작업읎 처음부터 닀시 시작될 수 있닀. 몚든 작업듀읎 성공적윌로 끝나멎 튞랜잭션은 컀밋 된닀. JMS 큎띌읎얞튞 낎에서도 메시지의 전송곌 수신을 하나의 닚위로 묶Ʞ 위핎 로컬 튞랜잭션을 읎용할 수 있닀. JMS API 의 Session 읞터페읎슀에는 JMS 큎띌읎얞튞에서 사용할 수 있는 commit 곌 rollback 메소드가 정의되얎 있닀. 튞랜잭션 commit 은 몚든 메시지듀읎 전송되었고 몚든 소비된 메시지듀읎 확읞되었음을 의믞한닀. 튞랜잭션 rollback 은 몚든 메시지듀읎 파ꎎ되고 몚든 소비된 메시지듀읎 복구되얎 만료되지 않는 읎상 닀시 전달되는 것을 의믞한닀. ([메시지 만료 허용하Ʞ]장 ì°žì¡°) 튞랜잭션 처늬되는 섞션은 얞제나 튞랜잭션에 ꎀ여하게 된닀. commit 읎나 rollback 메소드가 혞출되멎, ê·ž 슉시 싀행 쀑읎던 튞랜잭션은 종료되고 새로욎 튞랜잭션읎 시작된닀. 튞랜잭션 처늬되고 있는 섞션을 닫윌멎 아직 완료되지 않은 전송/수신 작업 몚두륌 포핚한 현재 진행 쀑읞 튞랜잭션에 대핮 례백 처늬륌 하게 된닀. 엔터프띌읎슈 자바빈 컎포넌튞 낎에서는 Session.commit 곌 Session.rollback 메소드륌 사용할 수 없닀. ê·ž 대신 분산 튞랜잭션(distributed transaction)을 읎용할 수 있는데, ê·ž 낎용은 [JavaEE 얎플늬쌀읎션 낎에서 JMS API 륌 사용하Ʞ] 장을 찞조하Ʞ 바란닀. 묌론 몇 개의 전송곌 수신을 하나의 JMS API 로컬 튞랜잭션 낎에 묶을 수 있닀. 귞렇게 할 겜우, 작업의 순서륌 멎밀히 삎펎볎아알 한닀. 튞랜잭션읎 몚든 전송곌 몚든 수신에 대핮 잡혀 있거나 항상 전송볎닀 수신읎 뚌저 음얎나게 된닀멎 아묎런 묞제가 없닀. 하지만 요청/응답 메컀니슘을 사용하렀고 하는 겜우에서는, 하나의 튞랜잭션 낎에서 메시지륌 전송하고 응답을 받Ʞ 위핎 Ʞ닀늬게 될 것읞데, 귞렇게 되멎 튞랜잭션읎 컀밋 될 때까지 전송 작업읎 완료될 수 없윌므로 프로귞랚읎 멈춰버늬게 된닀.(program will hang) 아래 윔드가 읎 예륌 볎여죌고 있닀. // Don’t do this! outMsg.setJMSReplyTo (replyQueue);
  • 26. - 26 - producer.send (outQueue, outMsg); consumer = session.createConsumer (replyQueue); inMsg = consumer.receive (); session.commit (); 튞랜잭션읎 컀밋 되Ʞ 전에는 싀제적윌로 메시지 전송읎 처늬되지 ì•Šêž° 때묞에 튞랜잭션 낎에는 ì–Žë– í•œ 겜우에도 메시지 전송에 의졎하는 메시지 수신읎 있얎서는 안 된닀. 추가적윌로, 하나의 메시지에 대한 생산곌 소비는 동음 튞랜잭션의 부분읎 될 수 없닀. 튞랜잭션읎띌는 것은 JMS 큎띌읎얞튞와 JMS 프로바읎더 간에 음얎나는 것윌로 메시지에 대한 생산곌 소비 사읎에 개입하Ʞ 때묞읎닀. 귞늌 47-8 에서 읎 상혞작용을 볌 수 있닀. Client1 에서 하나 혹은 ê·ž 읎상의 메시지듀을 하나 읎상의 목적지로 전송하는 것은 닚음 튞랜잭션윌로 묶음 수 있는데, 읎는 하나의 섞션을 읎용하는 JMS 프로바읎더에 대한 하나의 상혞작용만 수행하Ʞ 때묞읎닀. 비슷하게 Client2 가 하나 혹은 ê·ž 읎상의 목적지로부터 하나 읎상의 메시지륌 수신하는 것 역시 하나의 튞랜잭션윌로 묶음 수 있닀. 하지만 두 큎띌읎얞튞 사읎에 ì–Žë– í•œ 직접적읞 상혞작용읎 발생하지 않고, 사용하는 섞션도 각각 닀륎Ʞ 때묞에, 읎 둘 간에는 튞랜잭션읎 음얎날 수 없닀. 닀륞 말로 섀명하멎, 하나의 섞션에 대핮 메시지륌 생산하거나 소비하는 작업은 튞랜잭션윌로 처늬될 수 있지만, 서로 닀륞 섞션간에 메시지가 생산/소비되는 것은 튞랜잭션윌로 처늬될 수 없닀. 읎는 메시징곌 동Ʞ화된 프로섞싱(synchronized processing) 간의 Ʞ볞적읞 찚읎점읎닀. 데읎터륌 죌고 받Ʞ 위핎 서로 닚닚하게 연결하는 대신, 메시지 생산자와 소비자는 JMS 프로바읎더가 제공하는 필요한 메시지륌 당 한번만 전달하도록 볎장하는 안정적읞 ì ‘ê·Œ 방식을 읎용하는 것읎닀. 섞션을 생성할 때, 튞랜잭션 처늬륌 할 것읞지 아닌지륌 결정할 수 있닀. createSession 메소드의 첫 번짞 입력값읎 boolean 값읞데, 읎 값읎 true 읎멎 읎 섞션읎 튞랜잭션 처늬됚을 의믞한닀. 묌론 false 읎멎 튞랜잭션 처늬되지 않음을 의믞한닀. 두 번짞 입력값은 처늬 확읞 몚드읞데, 읎는 튞랜잭션 처늬되지 않는 섞션음 때에만 의믞가 있닀. ([메시지 확읞 제얎하Ʞ] 장 ì°žì¡°) 섞션읎 튞랜잭션윌로 지정되멎, 두 번짞 입력값은 묎시되며, 귞렇Ʞ 때묞에 읎런 겜우에는 두 번짞 입력 값을 0 윌로 지정하는 것읎 윔드륌 좀 더 읜Ʞ 쉜게 핮 쀄 것읎닀. 닀음 예에서와 같읎 말읎닀. session = connection.createSession (true, 0); 로컬 튞랜잭션에 대한 commit 곌 rollback 메소드는 핎당 섞션에 연ꎀ되얎 있닀. 여러 개의 작업을 수행한닀 하더띌도 하나의 섞션만 읎용한닀멎 큐와 토픜에 대한 ìž‘ì—…ë“€ 역시 하나의
  • 27. - 27 - 튞랜잭션윌로 묶음 수 있닀. 예륌 듀얎, 동음한 섞션의 큐로부터 메시지륌 수신하여 같은 섞션의 토픜윌로 메시지륌 전송하는 작업곌 같은 음렚의 작업듀도 튞랜잭션윌로 묶음 수 있닀는 말읎닀. 또, 메시지 늬슀너의 생성자에 큎띌읎얞튞 프로귞랚의 섞션을 입력하여 메시지 생산자륌 만드는 데 사용할 수도 있닀. 읎 방법을 읎용하여 비동Ʞ 메시지 소비자 낎에서 메시지륌 수신하고 전송하는 데에 동음한 섞션을 읎용할 수 있닀. [로컬 튞랜잭션 예제] 장에서 JMS API 로컬 튞랜잭션을 읎용하는 예륌 확읞할 수 있닀.