0.備注
CSDN也好舍扰,博客園也好,SegmentFloat也好希坚,很多教程都有問題边苹,或者沒有自己測試過。經(jīng)過將近兩天的踩坑裁僧,結(jié)合部分已有文檔總結(jié)了本教程个束,寫完之后又按照步驟裝了一臺,親測可用聊疲。
本文主要講的是如何安裝以及入門使用茬底,深度進階請參考其他大神的文章。
1.系統(tǒng)環(huán)境
CentOS 6.9 /64bit
默認路徑為/usr/local获洲,如果沒有特殊需求阱表,在進行下列操作前請先 cd /usr/local
2.獲取Erlang和RabbitMQ源文件
2.1 Erlang
在http://erlang.org/download/下查找最新的源文件,我選擇的是版本17贡珊,具體為【otp_src_17.0.tar.gz】捶枢。執(zhí)行以下命令直接在Linux下獲取源碼:
wget http://erlang.org/download/otp_src_17.0.tar.gz
2.2 RabbitMQ
在http://www.rabbitmq.com/releases/rabbitmq-server查找到最新的源碼版本,我選擇的是v3.6.0版本飞崖,具體為【rabbitmq-server-3.6.0-1.noarch.rpm】烂叔。執(zhí)行以下命令直接在Linux下獲取源碼:
wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.6/rabbitmq-server-3.6.6-1.el6.noarch.rpm
3.編譯安裝Erlang
3.1 解壓otp_src_17.0.tar.gz
tar -zxvf otp_src_17.0.tar.gz
可能會出現(xiàn)【gzip: stdin: not in gzip format】等錯誤,去掉z即可固歪,即tar -xvf蒜鸡。
3.2 安裝erlang編譯環(huán)境
yum -y install make ncurses-devel gcc gcc-c++ unixODBC unixODBC-devel openssl openssl-devel
3.3 編譯安裝Erlang
①設置
#下面的是一整行代碼,復制執(zhí)行
cd otp_src_17.0
./configure \
--prefix=/usr/local/erlang \
--enable-smp-support \
--enable-threads \
--enable-sctp \
--enable-kernel-poll \
--enable-hipe \
--with-ssl
執(zhí)行完后可能會出現(xiàn)錯誤:
忽略即可牢裳。
參數(shù)說明:
–prefix 指定安裝目錄
–enable-smp-support啟用對稱多處理支持
–enable-threads啟用異步線程支持
–enable-sctp啟用流控制協(xié)議支持(Stream Control Transmission Protocol逢防,流控制傳輸協(xié)議)
–enable-kernel-poll啟用Linux內(nèi)核poll
–enable-hipe啟用高性能Erlang(High Performance Erlang)
–with-ssl使用SSL包
②編譯安裝
make && make install
3.4 設置環(huán)境變量
環(huán)境變量為追加,首先打開profile
vi /etc/profile
然后在末尾追加下列語句
ERL_HOME=/usr/local/erlang PATH=$ERL_HOME/bin:$PATH export ERL_HOME PATH
保存后蒲讯,重新激活環(huán)境變量
source /etc/profile
驗證是否追加成功
[root@localhost otp_src_21.0]# echo $ERL_HOME
/usr/local/erlang
[root@localhost otp_src_21.0]# echo $PATH
/usr/local/erlang/bin:/usr/local/node/bin:/usr/local/java/jdk1.8.0_111/bin:/usr/local/java/jdk1.8.0_111/jre/bin:/usr/local/node/bin:/in
3.5 安裝RabbitMQ
[root@localhost local]# rpm -i rabbitmq-server-3.6.0-1.noarch.rpm
warning: rabbitmq-server-3.6.11-1.el6.noarch.rpm: Header V4 RSA/SHA512 Signature, key ID 6026dfca: NOKEY
error: Failed dependencies:
erlang >= R16B-03 is needed by rabbitmq-server-3.6.11-1.el6.noarch
socat is needed by rabbitmq-server-3.6.11-1.el6.noarch
最后一行信息為缺少socat忘朝,一般不會出現(xiàn),如果出現(xiàn)解決方法為:
yum -y install epel-release
yum -y install socat
再次嘗試 rpm -i rabbitmq-server-3.6.0-1.noarch.rpm
倒數(shù)第二行的錯誤為依賴關系所導致判帮,解決方法:
使用命令rpm -i --nodeps rabbitmq-server-3.6.0-1.noarch.rpm
忽略依賴局嘁。
3.6 啟停RabbitMQ
[root@localhost local]#service rabbitmq-server start
啟動服務
[root@localhost local]#service rabbitmq-server etc
查看哪些命令可以使用
[root@localhost local]#service rabbitmq-server stop
停止服務
[root@localhost local]#service rabbitmq-server status
查看服務狀態(tài)
啟動時可能會出現(xiàn)下列錯誤
運行命令: [root@localhost local]# ln -s /usr/local/erlang/bin/erl /usr/bin/erl
后再次執(zhí)行即可溉箕。
如果出現(xiàn)其他錯誤也可以嘗試運行此命令
3.7 添加rabbitmq到啟動項
[root@localhost local]# chkconfig rabbitmq-server on
4 RabbitMQ管理
4和5模塊參考博客園一大神,但是找不到出處地址了十分抱歉
4.1 RabbitMQ配置文件
從官網(wǎng)來看悦昵,RabbitMQ有兩個配置文件肴茄,使用RPM方式安裝:
RabbitMQ的根目錄:/var/lib/rabbitmq
RabbitMQ的配置文件目錄:/etc/rabbitmq/
RabbitMQ的日志文件目錄:/var/log/rabbitmq
兩個配置文件分別是:
rabbitmq.config
rabbitmq-env.conf
RabbitMQ環(huán)境變量配置文件,變量名稱及內(nèi)容可參考:http://www.rabbitmq.com/configure.html#define-environment-variables
配置在文件中的變量使用參考中的標準變量,但是需要將變量前綴RABBITMQ_去掉
官網(wǎng)中提到的關于變量的默認內(nèi)容及含義可參考:http://www.rabbitmq.com/relocate.html
配置文件相關資料:http://www.rabbitmq.com/configure.html#configuration-file
4.2 web管理界面
RabbitMQ有一個web管理的界面但指,可通過ip:15672進行訪問寡痰,但是安裝好之后默認的用戶guess和密碼guest是不能用來做遠程登錄的,這對用戶名和密碼只能在本地訪問棋凳,說是為了安全拦坠,因此就必須創(chuàng)建一個用戶管理員權限的新用戶,記得在防火墻設置中添加15672端口剩岳。
管理插件啟動: rabbitmq-plugins enable rabbitmq_management
添加用戶: rabbitmqctl add_user admin admin
添加權限: rabbitmqctl set_permissions -p "/" admin "." "." "."
修改用戶標簽: rabbitmqctl set_user_tags admin administrator
通過上面三步即新建了一個擁有管理員權限的用戶admin贞滨,密碼admin,此時就可以在瀏覽器中輸入ip:15672卢肃,然后用admin進行登錄。
至此才顿,RabbitMQ全部安裝完成
5 卸載
未經(jīng)實踐莫湘,僅供參考
5.1 卸載rabbitmq
命令:rpm -qa|grep rabbitmq
結(jié)果:rabbitmq-server-3.6.1-1.noarch
命令:rpm -e --nodeps rabbitmq-server-3.6.1-1.noarch
5.2 卸載erlang
命令:rpm -qa|grep erlang
結(jié)果:esl-erlang-18.3-1.x86_64
命令:rpm -e --nodeps esl-erlang-18.3-1.x86_64
或:yum remove erlang
6 SpringBoot中的使用
6.1 添加所需依賴
在pom.xml中添加RabbitMQ所需依賴及SpringBoot對AMPQ(Advanced Message Queuing Protocol,高級消息隊列協(xié)議)的支持郑气。
<!-- RabbitMQ依賴 -->
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>4.9.0</version>
</dependency>
<!-- 添加springboot對amqp的支持 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
<version>${springboot.version}</version>
</dependency>
6.2 添加配置類
@Configuration
public class RabbitConfig {
@Value("${rabbitmq.host}")
private String host;
@Value("${rabbitmq.username}")
private String username;
@Value("${rabbitmq.password}")
private String password;
@Value("${rabbitmq.virtualhost}")
private String virtualhost;
@Value("${rabbitmq.port}")
private int port;
@Value("${rabbitmq.queue}")
private String queue;
@Bean
public Queue createQueue() {
return new Queue(queue,true, false, false);
}
@Bean
public ConnectionFactory connectionFactory(){
CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
connectionFactory.setAddresses(host);
connectionFactory.setUsername(username);
connectionFactory.setPassword(password);
connectionFactory.setVirtualHost(virtualhost);
connectionFactory.setPort(port);
connectionFactory.setPublisherConfirms(true);
return connectionFactory;
}
@Bean
public RabbitAdmin rabbitAdmin(ConnectionFactory connectionFactory){
return new RabbitAdmin(connectionFactory);
}
}
6.3 添加監(jiān)聽類
利用@RabbitListener注解幅垮,配置好queues即可自動配置exchange。
@Component
@RabbitListener(queues = "${rabbitmq.queue}")//自動識別exchange
public class Consumer {
private static Logger LOGGER = Logger.getLogger(Consumer.class);
@Autowired
private CtripRemoteService ctripremoteservice;
/**
* 監(jiān)聽器 消費者
* @param body
*/
@RabbitHandler
public void process(byte[] body) {//接收類型根據(jù)發(fā)送類型調(diào)整
LOGGER.info("ReceiverA : " + body);
}
@RabbitHandler
public void process(String body) {//接收類型根據(jù)發(fā)送類型調(diào)整
LOGGER.info("ReceiverB : " + body);
}
}
6.4 添加發(fā)送類
@RestController
@RequestMapping("/rabbit")
public class SendController {
public final static String QUEUE_NAME="queueName";
@Autowired
private AmqpTemplate rabbitTemplate;
@RequestMapping("/sendMessage")
public void SendMessage() {
String sendMsg = "hello -------------------------------- " + new Date();
rabbitTemplate.convertAndSend(QUEUE_NAME, sendMsg);
}
}
6.5 啟動項目即可根據(jù)配置開始監(jiān)聽或發(fā)送
7 附錄尾组,兩個測試類
7.1 接收測試類
public class RecvTest {
public final static String QUEUE_NAME="hello";
public static void main(String[] args) throws IOException, TimeoutException {
// 創(chuàng)建連接工廠
ConnectionFactory factory = new ConnectionFactory();
//設置RabbitMQ地址
factory.setHost("localhost");
factory.setVirtualHost("/");
factory.setUsername("guest");
factory.setPassword("guest");
factory.setPort(5672);
//創(chuàng)建一個新的連接
Connection connection = factory.newConnection();
//創(chuàng)建一個通道
Channel channel = connection.createChannel();
//聲明要關注的隊列
channel.queueDeclare(QUEUE_NAME, true, false, false, null);
System.out.println("Customer Waiting Received messages");
//DefaultConsumer類實現(xiàn)了Consumer接口忙芒,通過傳入一個頻道,告訴服務器我們需要那個頻道的消息讳侨,
//如果頻道中有消息呵萨,就會執(zhí)行回調(diào)函數(shù)handleDelivery
Consumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope,
AMQP.BasicProperties properties, byte[] body)throws IOException {
String message = new String(body, "UTF-8");
System.out.println("Customer Received '" + message + "'");
}
};
//自動回復隊列應答 -- RabbitMQ中的消息確認機制
channel.basicConsume(QUEUE_NAME, true, consumer);
}
}
7.2 發(fā)送測試類
public class SendTest {
public final static String QUEUE_NAME="queue";
public final static String ROUTING_KEY="hello";
public final static String EXCHANGE_NAME="exchange";
public static void main(String[] args) throws Exception {
//創(chuàng)建連接工廠
ConnectionFactory factory = new ConnectionFactory();
//設置RabbitMQ相關信息
factory.setHost("localhost");
factory.setUsername("guest");
factory.setPassword("guest");
factory.setPort(5672);
//創(chuàng)建一個新的連接
Connection connection = factory.newConnection();
//創(chuàng)建一個通道
Channel channel = connection.createChannel();
String message = "啦啦啦";
// 聲明一個隊列 允許注釋
//channel.queueDeclare("wei",false,false,false,null);
// 聲明一個交換機 允許注釋
//channel.exchangeDeclare(EXCHANGE_NAME, "direct");
//綁定隊列、交換機跨跨、RoutingKey 允許注釋
//channel.queueBind(QUEUE_NAME, "lalal", ROUTING_KEY);
//發(fā)送消息到隊列中 不允許注釋
channel.basicPublish("", ROUTING_KEY, null, message.getBytes("UTF-8"));
System.out.println("Producer Send +'" + message + "'");
//關閉通道和連接
channel.close();
connection.close();
}
}