java-ee
Java 메시징 서비스 (JMS)
수색…
소개
Java Message Service 는 응용 프로그램이 메시지 를 작성, 송신, 수신 및 읽을 수있게 해주는 Java API입니다. JMS API는 Java 프로그래밍 언어로 작성된 프로그램이 다른 메시징 구현과 통신 할 수있게 해주는 공용 인터페이스 및 관련 의미 집합을 정의합니다. JMS를 사용하면 느슨하게 연결될뿐만 아니라 비동기식으로 신뢰할 수있는 통신이 가능합니다.
비고
Java Message Service (JMS)는 응용 프로그램이 메시지를 비동기 적으로 작성, 송신, 수신 및 읽을 수있게 해주는 표준 Java API입니다.
JMS는 응용 프로그램이 다른 메시지 공급자와 상호 작용할 수 있도록하는 일반적인 인터페이스 및 클래스 집합을 정의합니다.
JMS는 JDBC와 유사합니다 : JDBC는 다른 데이터베이스 (Derby, MySQL, Oracle, DB2 등)에 연결하고 JMS는 다른 공급자 (OpenMQ, MQSeries, SonicMQ 등)와 연결합니다.
JMS 참조 구현은 Open Message Queue (OpenMQ)입니다. 오픈 소스 프로젝트이며 독립 실행 형 응용 프로그램에서 사용하거나 응용 프로그램 서버에서 빌드 할 수 있습니다. GlassFish에 통합 된 기본 JMS 공급자입니다.
ConnectionFactory 만들기
연결 팩토리는 응용 프로그램이 Connection
객체를 만들어 공급자에 연결할 수 있도록하는 관리 객체입니다. javax.jms.ConnectionFactory
는 관리자가 정의한 구성 매개 변수를 캡슐화하는 인터페이스입니다.
ConnectionFactory
클라이언트를 사용하려면 JNDI 조회 (또는 주입 사용)를 실행해야합니다. 다음 코드는 JNDI InitialContext
객체를 가져 와서 JNDI 이름 아래 ConnectionFactory
객체를 조회하는 데 사용합니다.
Context ctx = new InitialContext();
ConnectionFactory connectionFactory =
(ConnectionFactory) ctx.lookup("jms/javaee7/ConnectionFactory");
이 인터페이스에서 사용할 수있는 방법은 createConnection()
반환 방법 Connection
객체와 새로운 JMS 2.0 createContext()
반환 방법 JMSContext
.
기본 사용자 ID 또는 사용자 이름과 비밀번호를 지정하여 Connection
또는 JMSContext
를 만들 수 있습니다.
public interface ConnectionFactory {
Connection createConnection() throws JMSException;
Connection createConnection(String userName, String password) throws JMSException;
JMSContext createContext();
JMSContext createContext(String userName, String password);
JMSContext createContext(String userName, String password, int sessionMode);
JMSContext createContext(int sessionMode);
}
메시징에 ActiveMQ 라이브러리 사용 (activemq jms 공급자 별 구현)
ActiveMQ 설정
- activemq.apache.org에서 ActiveMQ 배포판을 다운로드하고 어딘가에 압축을 풉니 다.
- bin / activemq 스크립트를 사용하여 localhost에서 보안되지 않은 상태로 실행중인 서버를 즉시 시작할 수 있습니다.
- 실행 중일 때 http : // localhost : 8161 / admin / 에서 로컬 서버의 콘솔에 액세스 할 수 있습니다 .
- conf / activemq.xml을 수정하여 구성하십시오.
- 제목은 다음 예제에서 사용자 activemq jms 공급자 특정 구현을 제안하므로 activemq-all.jar를 클래스 경로에 추가해야합니다.
독립 실행 형 클라이언트를 통해 메시지 보내기
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import org.apache.activemq.ActiveMQConnectionFactory;
public class JmsClientMessageSender {
public static void main(String[] args) {
ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616"); // ActiveMQ-specific
Connection con = null;
try {
con = factory.createConnection();
Session session = con.createSession(false, Session.AUTO_ACKNOWLEDGE); // non-transacted session
Queue queue = session.createQueue("test.queue"); // only specifies queue name
MessageProducer producer = session.createProducer(queue);
Message msg = session.createTextMessage("hello queue"); // text message
producer.send(msg);
} catch (JMSException e) {
e.printStackTrace();
} finally {
if (con != null) {
try {
con.close(); // free all resources
} catch (JMSException e) { /* Ignore */ }
}
}
}
}
메시지 폴링
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;
public class JmsClientMessagePoller {
public static void main(String[] args) {
ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616"); // ActiveMQ-specific
Connection con = null;
try {
con = factory.createConnection();
Session session = con.createSession(false, Session.AUTO_ACKNOWLEDGE); // non-transacted session
Queue queue = session.createQueue("test.queue"); // only specifies queue name
MessageConsumer consumer = session.createConsumer(queue);
con.start(); // start the connection
while (true) { // run forever
Message msg = consumer.receive(); // blocking!
if (!(msg instanceof TextMessage))
throw new RuntimeException("Expected a TextMessage");
TextMessage tm = (TextMessage) msg;
System.out.println(tm.getText()); // print message content
}
} catch (JMSException e) {
e.printStackTrace();
} finally {
try {
con.close();
} catch (JMSException e) {/* Ignore */ }
}
}
}
MessageListener 사용하기
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;
public class JmsClientMessageListener {
public static void main(String[] args) {
ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616"); // ActiveMQ-specific
Connection con = null;
try {
con = factory.createConnection();
Session session = con.createSession(false, Session.AUTO_ACKNOWLEDGE); // non-transacted session
Queue queue = session.createQueue("test.queue"); // only specifies queue name
MessageConsumer consumer = session.createConsumer(queue);
consumer.setMessageListener(new MessageListener() {
public void onMessage(Message msg) {
try {
if (!(msg instanceof TextMessage))
throw new RuntimeException("no text message");
TextMessage tm = (TextMessage) msg;
System.out.println(tm.getText()); // print message
} catch (JMSException e) {
System.err.println("Error reading message");
}
}
});
con.start(); // start the connection
Thread.sleep(60 * 1000); // receive messages for 60s
} catch (JMSException e1) {
e1.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
try {
con.close(); // free all resources
} catch (JMSException e) {
e.printStackTrace();
}
}
}
}
메시징에 대한 jndi 기반 조회 사용 (구현과 관련없는 예)
이 방법을 사용하면 여러 구현되지 않은 코드를 작성하여 여러 jms 플랫폼에 배포 할 수 있습니다. 아래의 기본 예제는 activemq jms 서버에 연결하여 메시지를 보냅니다.
import java.util.Properties;
import javax.jms.JMSException;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
public class JmsClientJndi {
public static void main(String[] args) {
Properties jndiProps = new Properties();
// Following two could be set via a system property for flexibility in the code.
jndiProps.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.apache.activemq.jndi.ActiveMQInitialContextFactory");
jndiProps.setProperty(Context.PROVIDER_URL, "tcp://localhost:61616");
QueueConnection conn = null;
QueueSession session = null;
QueueSender sender = null;
InitialContext jndi = null;
try {
jndi = new InitialContext(jndiProps);
QueueConnectionFactory factory = (QueueConnectionFactory) jndi.lookup("ConnectionFactory");
conn = factory.createQueueConnection();
conn.start();
session = conn.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
Queue queue = (Queue) jndi.lookup("dynamicQueues/test.queue");
sender = session.createSender(queue);
TextMessage msg = session.createTextMessage();
msg.setText("Hello worlds !!!!! ");
sender.send(msg);
} catch (NamingException e) {
e.printStackTrace();
} catch (JMSException e) {
e.printStackTrace();
} finally {
try {
if (sender != null)
sender.close();
if (session != null)
session.close();
if (conn != null)
conn.close();
} catch (JMSException e) {
e.printStackTrace();
}
}
}
}