1. 程式人生 > >RabbitMQ之入門HelloWorld(Java)

RabbitMQ之入門HelloWorld(Java)

RabbitMQ簡介

RabbitMQ是消費-生產者模型的一個典型的代表,一端往訊息佇列中不斷寫入訊息,而另一端則可以讀取或者訂閱佇列中的訊息。它是一個實現了AMQP協議的可複用的企業訊息系統。RabbitMQ是用Erlang開發。那麼RabbitMQ也具備容錯,熱更新,分散式快取,持久化等特點。RabbitMQ可以輕鬆的搭建出大型可用的分散式佇列訊息叢集。

RabbitMQ的結構圖:

RabbitMQ的一些概念:

Broker:簡單來說就是訊息佇列伺服器實體。
Exchange:訊息交換機,它指定訊息按什麼規則,路由到哪個佇列。
Queue:訊息佇列載體,每個訊息都會被投入到一個或多個佇列。
Binding:繫結,它的作用就是把exchange和queue按照路由規則繫結起來。
Routing Key:路由關鍵字,exchange根據這個關鍵字進行訊息投遞。
vhost:虛擬主機,一個broker裡可以開設多個vhost,用作不同使用者的許可權分離。
producer:訊息生產者,就是投遞訊息的程式。
consumer:訊息消費者,就是接受訊息的程式。
channel:訊息通道,在客戶端的每個連線裡,可建立多個channel,每個channel代表一個會話任務。


RabbitMQ是用Erlang開發的,但對於主要的程式語言都有驅動或者客戶端。我們這裡要用的是Java來作為客戶端語言。假設都已經搭建好環境了(沒有的話看這裡),首先我們下載Java客戶端類庫,點選這裡,下圖是例子的模型:


首先建立佇列,生產者向佇列傳送訊息,消費者向佇列取出訊息,過程很簡單,下面正式開始吧~~

步驟如下:

(一)建立訪問使用者

[[email protected] sbin]# ./rabbitmqctl add_user test test
Creating user "test" ...
(二)給使用者繫結vhost並新增許可權
[[email protected]
sbin]# ./rabbitmqctl set_permissions -p "/" test ".*" ".*" ".*" Setting permissions for user "test" in vhost "/" ...
這裡就繫結預設的vhost“/”,也可以自己通過 ./rabbitmqctl add_vhost xx 來新增

(三)編寫生產者程式並啟動

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

public class HelloWorldProducer {
    
    private final static String QUEUE_NAME = "hello";

    public static void main(String[] args) throws Exception{
        ConnectionFactory cf = new ConnectionFactory();
        //rabbitmq監聽IP
        cf.setHost("192.168.1.96");
        //rabbitmq預設監聽埠,注意要記得開啟埠
        cf.setPort(5672);
        
        //設定訪問的使用者
        cf.setUsername("test");
        cf.setPassword("test");
        //建立連線
        Connection conn = cf.newConnection();
        //建立訊息通道
        Channel channel = conn.createChannel();

        String msg = "hello world!!!! 你好啊~";
        //建立hello佇列
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        
        //傳送訊息
        channel.basicPublish("", QUEUE_NAME, null, msg.getBytes());
        System.out.println("send msg "+ msg + " to ["+ QUEUE_NAME +"] queue !");
        
        channel.close();
        conn.close();

    }

}
可以看到hello佇列裡有一條訊息了
[[email protected] sbin]# ./rabbitmqctl list_queues -p "/"
Listing queues ...
hello   1
[[email protected] sbin]# 
(四)編寫消費者程式並啟動
import java.io.IOException;
import java.util.concurrent.TimeoutException;
import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Consumer;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;

public class HelloWorldConsumer {

    private final static String QUEUE_NAME = "hello";
    public static void main(String[] args) throws IOException, TimeoutException {

        ConnectionFactory cf = new ConnectionFactory();
        //rabbitmq監聽IP
        cf.setHost("192.168.1.96");
        //rabbitmq預設監聽埠,注意要記得開啟埠
        cf.setPort(5672);
        
        //設定訪問的使用者
        cf.setUsername("test");
        cf.setPassword("test");
        //建立連線
        Connection conn = cf.newConnection();
        //建立訊息通道
        Channel channel = conn.createChannel();

        //建立hello佇列
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        System.out.println(" Waiting for msg....");
        //建立消費者,並接受訊息
        Consumer consumer = new DefaultConsumer(channel) {
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body)
                    throws IOException {
                String msg = new String(body, "UTF-8");
                System.out.println("Received is = '" + msg + "'");
            }
        };
        channel.basicConsume(QUEUE_NAME, true, consumer);
    }

}
執行結果:
這時佇列裡的訊息被消費掉了
[[email protected] sbin]# ./rabbitmqctl list_queues -p "/"
Listing queues ...
hello   0
[[email protected] sbin]# 
如果不成功可能是一下幾點造成的:
  • 如果連線不成功可能是IP不對或者是5672埠沒開啟,可以在rabbitmq.config中修改(預設是{tcp_listeners, [{"127.0.0.1",5672}]})
  • 如果用guest(預設使用者)訪問,監聽Host則必須是localhost
  • 如果是新建立的使用者,記得給使用者繫結vhost並新增許可權
  • 可以從RabbitMQ的日誌檔案 [email protected] ,獲取更多詳細的錯誤資訊
祝生活愉快!!

相關推薦

RabbitMQ入門HelloWorld(Java)

RabbitMQ簡介 RabbitMQ是消費-生產者模型的一個典型的代表,一端往訊息佇列中不斷寫入訊息,而另一端則可以讀取或者訂閱佇列中的訊息。它是一個實現了AMQP協議的可複用的企業訊息系統。Rab

Java 基礎 入門HelloWorld

Java 基礎 之 入門鏈接 : http://www.verejava.com/?id=1699251664916 import java.lang.*; /** @author : 胡楊 @version : 1.0 1. //雙斜杠代表註釋, 是給人看的, 機器忽略不計 2. public

java爬蟲入門基礎 java讀取txt檔案,對字串進行操作後匯出txt檔案

相比於C#,java爬蟲,python爬蟲更為方便簡要,首先呢,python的urllib2包提供了較為完整的訪問網頁文件的API,再者呢對於摘下來的文章,python的beautifulsoap提供了簡潔的文件處理功能,這就成就了他爬蟲的優勢。 作為一名滿腦子要成為一名大牛的程式設計師小白來講,倒不是非要

RabbitMQ入門

RabbitMQ之入門HelloWorld(Java)   RabbitMQ四種Exchange型別之Headers(Java)   RabbitMQ四種Exchange型別之Topic (Java)   RabbitMQ四種Exchange型別

RabbitMQ入門和基本概念

目錄 簡介 基本概念 ConnectionFactory、Connection、Channel——基本物件 Queue訊息佇列——內部物件 exchange訊息分發策略(路由) 1. Direct策略 2. Fanout策略 3. Topic策略 4. Heade

新增核心模組入門helloworld.ko

首先 是從一個西郵學生看到的,比較好的入門方式: 首先是hello.c的檔案:主要要說明對核心的程式設計只能使用核心標頭檔案,所以通常我們都使用makefile來控制編譯過程 #include "linux/init.h" #include "linux/module.h"

排序算法入門選擇排序-Java實現

ati min .net 入門 oid 下標 static ava 對象數組 本文參考http://blog.csdn.net/m0_37568091/article/details/78023705 選擇排序是先從對象數組中選出最小的放在第一個位置,再從剩下的元素中選

Java入門-類HelloWorld是公共的,應在名為HelloWorld.java的文件中聲明

world! void java源代碼 clas pan 保存文件 -h 明顯 命令行 public class HelloWorld { public static void main(String[] args) { System.ou

Java使用RabbitMQ公平分發

env 接受 col java catch conn ech exceptio don 發送消息: 1 package org.study.workfair; 2 3 import com.rabbitmq.client.Channel; 4 import co

Java使用RabbitMQ整合Spring(生產者)

獲取 消息 org str 依賴 chang import name 5.1 依賴包 <!--RabbitMQ集成spring--> <!-- https://mvnrepository.com/artifact/org

Java基礎第一個Java程式HelloWorld及註釋

      程式碼如下: // 一個檔案中只能有一個共有的類,並且與檔名稱一致,大小寫注意 public class HelloWorld{   // 程式的入口   public static void main

大資料入門教程系列Hive的Java API 操作

Java 想要訪問Hive,需要通過beeline的方式連線Hive,hiveserver2提供了一個新的命令列工具beeline,hiveserver2 對 之前的hive做了升級,功能更加強大,它增加了許可權控制,要使用beeline需要先啟動hiverserver2,再使用beeline連線

RabbitMQ--入門 Helloworld

本系列教程主要來自於官網入門教程的翻譯,然後自己進行了部分的修改與實驗,內容僅供參考。 “Hello world” of RabbitMQ 1、Windows下RabbitMQ的安裝 下載Erlang,地址:http://www.erlang.org/downloa

RabbitMQ Publish/Subscribe for Java入門教程 3】

 首先通過上面兩個入門教程我們引入本文: Publish/Subscribe:在上一章中,我們學習建立了一個訊息佇列,她的每個任務訊息只發送給一個佇列,然後佇列的資訊由消費者各自消費。這一章,我們會將同一個任務訊息傳送給多個佇列。這種模式就是“釋出/訂閱”。為了將訊息傳送

RabbitMQ 入門 Helloworld

                本系列教程主要來自於官網入門教程的翻譯,然後自己進行了部分的修改與實驗,內容僅供參考。“Hello world” of RabbitMQ1、Windows下RabbitMQ的安裝下載Erlang,地址:http://www.erlang.org/download/otp_win

RabbitMQ服務入門

RabbitMQ是一種訊息中介軟體,能夠很好的處理來自客戶端的非同步訊息傳送及請求,將訊息傳送放入到服務端的佇列池中,而接收端可以根據RabbitMQ配置的轉發機制接收和過濾服務端轉發來的訊息。Rab

(九) RabbitMQ實戰教程(面向Java開發人員)SpringBoot整合RabbitMQ

SpringBoot整合RabbitMQ 使用SpringBoot整合RabbitMQ非常簡單,它極大程度的簡化了開發成本,使用SpringBoot整合RabbitMQ需匯入如下依賴 <parent> <groupId>o

(四) RabbitMQ實戰教程(面向Java開發人員)@RabbitListener訊息消費

使用RabbitListener註解進行訊息消費 在前一篇部落格中我們往MessageListenerContainer設定了MessageListener進行訊息的消費,本篇部落格將介紹一種更為簡單的訊息消費方式:使用@RabbitListener註解方式。

(七) RabbitMQ實戰教程(面向Java開發人員)RabbitMQ常用屬性詳解

RabbitMQ常用屬性詳解 Alternate Exchange Alternate Exchange簡稱AE,當訊息不能被正確路由時,如果交換機設定了AE則訊息會被投遞到AE中,如果存在AE鏈則會按此繼續投遞,直到訊息被正確路由或AE鏈結束訊息被

(三) RabbitMQ實戰教程(面向Java開發人員)Spring整合RabbitMQ

Spring整合RabbitMQ Spring AMQP是對AMQP協議的抽象和封裝,從官方網站上得知它是由兩個專案組成的(spring-amqp和spring-rabbit)。在使用Spring整合RabbitMQ時我們主要關注三個核心介面(MessageL