수색…


소개

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


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow