AMQP-RabbitMQ/1/概念/一對一簡單模型

# JMS,AMQP,MQTT的區別與聯繫

  • JMS
    Java消息傳遞服務(Java Messaging Service )
  • AMQP
    高級消息隊列協議(Advanced Message Queueing Protocol
  • MQTT
    消息隊列遙測傳輸(Message Queueing Telemetry Transport )

簡單理解:
*JMS是專門爲Java設計的一套消息服務API,像ActiveMQ就是對它的實現
*AMQP爲了解決不同平臺之間的通信問題,定義了一種名爲amqp通信協議,從而實現平臺和語言無關性。
*MQTT也是一種通信協議。相比於AMQP的複雜性,它簡單的多。所以amqp用於處理相對較重的任務,如兩個系統平臺之間的消息傳輸。而mqtt因爲非常輕量,所以大量應用於物聯網

# RabbitMQ常用命令

  • 修改密碼 rabbitmqctl change_password Username Newpassword
  • 顯示所有用戶 rabbitmqctl list_users
  • 啓動 rabbitmq-server start
  • 關閉 rabbitmqctl stop
  • homebrew安裝配置文件地址 /usr/local/etc/rabbitmq/rabbitmq-env.conf
  • 管理平臺地址 http://localhost:15672/
    image.png
    image.png

1. 簡單模型

The simplest thing that does something

  • 模型圖示

簡單模型

  • 生產者
package com.futao.springmvcdemo.mq.rabbit.simple;

import com.futao.springmvcdemo.mq.rabbit.RabbitMqConnectionTools;
import com.futao.springmvcdemo.mq.rabbit.RabbitMqQueueEnum;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import lombok.Cleanup;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;

/**
 * 簡單發送者
 *
 * @author futao
 * Created on 2019-04-22.
 */
@Slf4j
public class Send {
    @SneakyThrows
    public static void main(String[] args) {
        @Cleanup
        Connection connection = RabbitMqConnectionTools.getConnection();
        @Cleanup
        Channel channel = connection.createChannel();
        //定義一個隊列
        channel.queueDeclare(RabbitMqQueueEnum.SIMPLE.getQueueName(), false, false, false, null);
        String msg = "Hello RabbitMq!";
        channel.basicPublish("", RabbitMqQueueEnum.SIMPLE.getQueueName(), null, msg.getBytes());
        log.info("Send msg:[{}] success", msg);
    }
}
  • 消費者
package com.futao.springmvcdemo.mq.rabbit.simple;

import com.futao.springmvcdemo.mq.rabbit.RabbitMqConnectionTools;
import com.futao.springmvcdemo.mq.rabbit.RabbitMqQueueEnum;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DeliverCallback;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;

/**
 * 簡單消費者
 *
 * @author futao
 * Created on 2019-04-22.
 */
@Slf4j
public class Recv {
    @SneakyThrows
    public static void main(String[] args) {
        Channel channel = RabbitMqConnectionTools.getChannel();
        channel.queueDeclare(RabbitMqQueueEnum.SIMPLE.getQueueName(), false, false, false, null);
        log.info("Waiting for message...");
        DeliverCallback deliverCallback = ((consumerTag, message) -> {
            log.info("收到消息:[{}],tag:[{}]", new java.lang.String(message.getBody()), consumerTag);
        });
        channel.basicConsume(RabbitMqQueueEnum.SIMPLE.getQueueName(), true, deliverCallback, consumerTag -> {
        });
    }
}
  • 特點:一對一。一個生產者,一個消費者。

# 通用代碼

  • 工具類 - 鏈接工廠
package com.futao.springmvcdemo.mq.rabbit;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import lombok.SneakyThrows;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * rabbitMq配置類
 *
 * @author futao
 * Created on 2019-04-19.
 */
public class RabbitMqConnectionTools {
    /**
     * 獲取鏈接
     *
     * @return
     * @throws IOException
     * @throws TimeoutException
     */
    public static Connection getConnection() {
        try {
            return getConnectionFactory().newConnection();
        } catch (IOException | TimeoutException e) {
            e.printStackTrace();
            throw new RuntimeException(e.getMessage(), e);
        }
    }

    /**
     * 連接工廠
     *
     * @return
     */
    private static ConnectionFactory getConnectionFactory() {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");
        factory.setPort(5672);
        factory.setUsername("futao");
        factory.setPassword("123456");
        factory.setVirtualHost("/springmvc");
        return factory;
    }

    /**
     * 創建並獲取通道
     *
     * @return
     */
    @SneakyThrows
    public static Channel getChannel() {
        Connection connection = RabbitMqConnectionTools.getConnection();
        return connection.createChannel();
    }
}
  • 枚舉類 - RabbitMqQueueEnum隊列名稱
package com.futao.springmvcdemo.mq.rabbit;

import lombok.AllArgsConstructor;
import lombok.Getter;

/**
 * queue名稱枚舉
 *
 * @author futao
 * Created on 2019-04-19.
 */
@Getter
@AllArgsConstructor
public enum RabbitMqQueueEnum {

    /**
     * 簡單queue
     */
    SIMPLE("simple-queue"),
    /**
     * WorkQueue 工作隊列
     */
    WORK_QUEUE("work-queue"),
    /**
     * 發佈訂閱-fanout
     */
    EXCHANGE_QUEUE_FANOUT_ONE("exchange-queue-fanout-1"),

    EXCHANGE_QUEUE_FANOUT_TWO("exchange-queue-fanout-2"),

    EXCHANGE_QUEUE_DIRECT_ONE("exchange-queue-direct-1"),
    EXCHANGE_QUEUE_DIRECT_TWO("exchange-queue-direct-2"),

    EXCHANGE_QUEUE_TOPIC_ONE("exchange-queue-topic-1"),
    EXCHANGE_QUEUE_TOPIC_TWO("exchange-queue-topic-2"),
    EXCHANGE_QUEUE_TOPIC_THREE("exchange-queue-topic-3"),
    EXCHANGE_QUEUE_TOPIC_FOUR("exchange-queue-topic-4"),

    /**
     * RPC隊列
     */
    RPC_QUEUE("rpc-queue");


    /**
     * queue名稱
     */
    private String queueName;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章