의 ActiveMQ 메시지 큐의 간단한 이해와 차례로 가리킨의 방법 및 구현 ActiveMQ를 게시 구독

아파치의 ActiveMQ는 아파치 소프트웨어 재단의 오픈 소스 메시징 미들웨어 개발;

ActiveMQ는 자바 가상 머신을 지원하므로 단지 운영 체제 순수 자바 프로그램이기 때문에, ActiveMQ를 실행 할 수 있습니다.

ActiveMQ를가 할하는 데 사용됩니다?

메시지, 즉, JMS의 처리 방법에 관한 것이다. 같은 Jingdong, Taobao의, 그리고 깊이있는 응용 프로그램을하는 다른 사이트와 같은 대형 전자 상거래 사이트에서 메시지 큐,

큐의 주요 역할은 높은 피크 동시 액세스를 제거하는 사이트의 응답 속도를 빠르게하는 것입니다.

메시지 큐를 사용하지 않고, 직접 데이터베이스에 사용자 데이터의 요청이 높은 경우, 데이터베이스는 큰 압력을 발생합니다

또한 증가 된 시스템 응답 지연,하지만 큐의 사용을 즉시 사용자의 요청 반환에 전송 큐를 만든다.

예를 들면 : 당신은 성공이, Jingdong 팁은 사용자 프롬프트에 직접 주문을 제출할 수 없습니다 : "당신은 주문을 제출,

, 확인 대기 "를 선택한 다음 데이터베이스에 메시지 소비자 프로세스의 큐, 비동기 쓰기가 메시지 큐에서 데이터를 얻을하시기 바랍니다.

훨씬 빠른 데이터베이스보다 메시지 큐 서비스 처리 속도 때문에, 사용자의 응답 지연을 효과적으로 향상시킬 수있다.

ActiveMQ를 사용 시나리오?

1, 비동기 호출.

많은 통신에 둘, 하나.

(3)는, 시스템 통합 복수의 이종 균질 다.

4 RPC 대안으로.

5 서로 분리하는 복수의 어플리케이션.

6, 장면 지원 뒤에 이벤트 기반 아키텍처로.

7 위해 시스템의 확장 성을 향상시킬 수 있습니다.

ActiveMQ를 특징?

지원 자바 메시지 서비스 (JMS) 1.1 버전

스프링 프레임 워크

클러스터 (클러스터링)

지원되는 프로그래밍 언어는 다음과 같습니다 : C , C ++ , C #, 델파이 , 얼랑 , 어도비 플래시 , 하스켈 , 자바 , 자바 스크립트 , , PHP , 파이크 , 파이썬루비

프로토콜 지원이 포함됩니다 :은 OpenWire, REST는 , STOMP는 알림의 MQTT, -는 WS XMPP 및 AMQP를

어떻게 ActiveMQ를 설치 하는가?

다운로드 : http://www.apache.org/dyn/closer.cgi?path=/activemq/apache-activemq/5.8.0/apache-activemq-5.8.0-bin.zip

감압는 ActiveMQ를 설치를 완료하기

다음과 같은 디렉토리 구조를 추출한 후

 

 

이는 Win32를 선택하는 32 이하로하는 경우는, bin 디렉토리에있는 경우, 64 비트 선택하고 시작하는 Win64 activemq.bat 클릭합니다

세 시작 :

(1)普通启动 ./activemq start
(2)启动并指定日志文件 ./activemq start >tmp/smlog
(3)后台启动方式nohup ./activemq start >/tmp/smlog
前两种方式下在命令行窗口关闭时或者ctrl+c时导致进程退出,采用后台启动方式则可以避免这种情况

 

使用点对点的方式实现洗息队列

第一步:导入依赖

 <dependency>
        <groupId>org.apache.activemq</groupId>
        <artifactId>activemq-core</artifactId>
        <version>5.7.0</version>
    </dependency>

  

第二步:创建生产者

package com.wish.peertopeer;

import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;

public class P2pProducer {
    public static void main(String[] args) throws JMSException {
        // ConnectionFactory :连接工厂,JMS 用它创建连接
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER,
                ActiveMQConnection.DEFAULT_PASSWORD, "tcp://127.0.0.1:61616");
        // JMS 客户端到JMS Provider 的连接
        Connection connection = connectionFactory.createConnection();
        connection.start();
        // Session: 一个发送或接收消息的线程
        Session session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
        // Destination :消息的目的地;消息发送给谁.
        // 获取session注意参数值my-queue是Query的名字
        Destination destination = session.createQueue("my-queue");
        // MessageProducer:消息生产者
        MessageProducer producer = session.createProducer(destination);
        // 设置不持久化
        producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
        // 发送一条消息
        for (int i = 1; i <= 5; i++) {
            sendMsg(session, producer, i);
        }
        connection.close();
    }
    /**
     * 在指定的会话上,通过指定的消息生产者发出一条消息
     *
     * @param session
     *            消息会话
     * @param producer
     *            消息生产者
     */
    public static void sendMsg(Session session, MessageProducer producer, int i) throws JMSException {
        // 创建一条文本消息
        TextMessage message = session.createTextMessage("Hello ActiveMQ!" + i);
        // 通过消息生产者发出消息
        producer.send(message);
    }
}

  

第三步:创建消费者

package com.wish.peertopeer;

import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

public class P2pConsumer {
    public static void main(String[] args) throws JMSException {
        // ConnectionFactory :连接工厂,JMS 用它创建连接
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER,
                ActiveMQConnection.DEFAULT_PASSWORD, "tcp://127.0.0.1:61616");
        // JMS 客户端到JMS Provider 的连接
        Connection connection = connectionFactory.createConnection();
        connection.start();
        // Session: 一个发送或接收消息的线程
        Session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
        // Destination :消息的目的地;消息发送给谁.
        // 获取session注意参数值xingbo.xu-queue是一个服务器的queue,须在在ActiveMq的console配置
        Destination destination = session.createQueue("my-queue");
        // 消费者,消息接收者
        MessageConsumer consumer = session.createConsumer(destination);
        while (true) {
            TextMessage message = (TextMessage) consumer.receive();
            if (null != message) {
                System.out.println("收到消息:" + message.getText());
            } else
                break;
        }
        session.close();
        connection.close();
    }
}

  

实现效果

启动生产者

 

 

浏览http://localhost:8161/admin/queues.jsp查看

 

 

 

 

 

启动消费者

 

 

 

 

 浏览http://localhost:8161/admin/queues.jsp查看

 

 

使用发布订阅的方式实现消息队列

第一步:也是导入依赖与上面一样

第二步:创建生产者

package com.wish.publishandsubscribe;

import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

public class PapProducer {

    private static String BROKERURL = "tcp://127.0.0.1:61616";
    private static String TOPIC = "my-topic";

    public static void main(String[] args) throws JMSException {
        start();
    }

    static public void start() throws JMSException {
        System.out.println("生产者已经启动....");
        // 创建ActiveMQConnectionFactory 会话工厂
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(
                ActiveMQConnection.DEFAULT_USER, ActiveMQConnection.DEFAULT_PASSWORD, BROKERURL);
        Connection connection = activeMQConnectionFactory.createConnection();
        // 启动JMS 连接
        connection.start();
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        MessageProducer producer = session.createProducer(null);
        producer.setDeliveryMode(DeliveryMode.PERSISTENT);
        send(producer, session);
        System.out.println("发送成功!");
        connection.close();
    }

    static public void send(MessageProducer producer, Session session) throws JMSException {
        for (int i = 1; i <= 5; i++) {
            System.out.println("我是消息" + i);
            TextMessage textMessage = session.createTextMessage("我是消息" + i);
            Destination destination = session.createTopic(TOPIC);
            producer.send(destination, textMessage);
        }
    }
}

  

第三步:创建消费者

 

package com.wish.publishandsubscribe;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;
public class PapConsumer {
    private static String BROKERURL = "tcp://127.0.0.1:61616";
    private static String TOPIC = "my-topic";

    public static void main(String[] args) throws JMSException {
        start();
    }

    static public void start() throws JMSException {
        System.out.println("消费点启动...");
        // 创建ActiveMQConnectionFactory 会话工厂
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(
                ActiveMQConnection.DEFAULT_USER, ActiveMQConnection.DEFAULT_PASSWORD, BROKERURL);
        Connection connection = activeMQConnectionFactory.createConnection();
        // 启动JMS 连接
        connection.start();
        // 不开消息启事物,消息主要发送消费者,则表示消息已经签收
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        // 创建一个队列
        Topic topic = session.createTopic(TOPIC);
        MessageConsumer consumer = session.createConsumer(topic);
        // consumer.setMessageListener(new MsgListener());
        while (true) {
            TextMessage textMessage = (TextMessage) consumer.receive();
            if (textMessage != null) {
                System.out.println("接受到消息:" + textMessage.getText());
                // textMessage.acknowledge();// 手动签收
                // session.commit();
            } else {
                break;
            }
        }
        connection.close();
    }
}

  

实现效果

启动生产者

 

 浏览http://localhost:8161/admin/topics.jsp查看

 

启动消费者

 

 浏览http://localhost:8161/admin/topics.jsp查看

 

추천

출처www.cnblogs.com/wishsaber/p/12303308.html