# 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/
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;
}