消息隊列與rpc的區別在於,消息隊列不返回數據,rpc能夠,可是因爲消息隊列不用返回數據,因此在不但願發送端的速度受制於接收端且不用返回數據時,使用消息隊列是很方便的。html
進入正文:java
因爲rabbitmq是基於erlang語言編寫的,所以須要安裝erlang。進入erlang官網:http://www.erlang.org/downloads下載。安裝的方法很簡單,一路默認就ok了。spring
而後是安裝rabbitmq,官網地址:http://www.rabbitmq.com/install-windows.html。windows
根據須要進行下載。服務器
安裝rabbitmq須要特別注意的一點是:必定要更改rabbitmq的安裝地址,由於其默認安裝地址是C:\Program Files,可是很坑的一點是rabbitmq本身並不解析帶有空格的路徑,其餘還好默認就行。app
安裝好了之後打開cmd,cd到安裝路徑下的sbin文件夾下輸入命令:rabbitmq-plugins enable rabbitmq_management安裝插件,這樣能夠在頁面端訪問localhost:15672來訪問rabbitmq。ide
若是能夠訪問表明你安裝成功,接着是如何在代碼中使用了。this
pom文件中須要加上下面幾個包:插件
<dependency> <groupId>com.rabbitmq</groupId> <artifactId>amqp-client</artifactId> <version>4.1.0</version> </dependency> <dependency> <groupId>org.springframework.amqp</groupId> <artifactId>spring-rabbit</artifactId> <version>1.7.5.RELEASE</version> </dependency>
applicationContext.xml中須要加入與rabbitmq相關的配置:日誌
<!--配置connection-factory,指定鏈接rabbit server參數這裏有個坑,rabbitmq的15672是管理界面的訪問端口,遠程訪問端口是5672 --> <rabbit:connection-factory id="connectionFactory" host="127.0.0.1" port="5672" username="pan" password="123456" /> <!--經過指定下面的admin信息,當前producer中的exchange和queue會在rabbitmq服務器上自動生成 --> <rabbit:admin connection-factory="connectionFactory" /> <!--定義queue --> <!-- durable 是否持久化 exclusive 僅建立者可使用的私有隊列,斷開後自動刪除 auto-delete 當全部消費端鏈接斷開後,是否自動刪除隊列 --> <rabbit:queue name="queueTest" durable="true" auto-delete="false" exclusive="false" /> <!-- 交換機定義 --> <!-- 交換機:一個交換機能夠綁定多個隊列,一個隊列也能夠綁定到多個交換機上。 若是沒有隊列綁定到交換機上,則發送到該交換機上的信息則會丟失。 direct模式:消息與一個特定的路由器徹底匹配,纔會轉發 topic模式:按模式匹配 --> <rabbit:direct-exchange name="exchangeTest" durable="true" auto-delete="false"> <rabbit:bindings> <rabbit:binding queue="queueTest" key="queueTestKey"></rabbit:binding> </rabbit:bindings> </rabbit:direct-exchange> <!--定義rabbit template用於數據的接收和發送 --> <rabbit:template id="amqpTemplate" connection-factory="connectionFactory" exchange="exchangeTest" /> <!-- 消息接收者 --> <bean id="messageReceiver" class="org.pan.rabbitmq.rabbitmq.MessageConsumer"></bean> <!-- queue litener 觀察 監聽模式 當有消息到達時會通知監聽在對應的隊列上的監聽對象 --> <rabbit:listener-container connection-factory="connectionFactory"> <!-- queues 監聽隊列,多個用逗號分隔 ref 監聽器 --> <rabbit:listener queues="queueTest" ref="messageReceiver" /> </rabbit:listener-container>
上面這個配置文件的頭上須要多添加下面的內容:
xmlns:rabbit="http://www.springframework.org/schema/rabbit"
http://www.springframework.org/schema/rabbit http://www.springframework.org/schema/rabbit/spring-rabbit-1.0.xsd
這裏須要注意兩個端口:15672是頁面訪問rabbitmq的端口,代碼若是要遠程鏈接rabbitmq是5672端口。
鏈接的用戶名和密碼rabbitmq有一個默認的是:guest,guest。能夠經過15672頁面來建立用戶,至於方法網上有不少教程,有興趣的朋友能夠本身去找找看。
而後是生產者代碼:
/** * @description * @auth panmingshuai * @time 2018年3月24日下午10:21:18 * */ @Service public class MessageProducer { private Logger logger = LoggerFactory.getLogger(MessageProducer.class); @Resource(name = "amqpTemplate") private AmqpTemplate amqpTemplate; public void sendMessage(Object message) throws IOException { logger.info("to send message:{}", message); amqpTemplate.convertAndSend("queueTestKey", message); } }
消費者代碼:
/** * @description * @auth panmingshuai * @time 2018年3月24日下午10:23:38 * */ public class MessageConsumer implements MessageListener { private Logger logger = LoggerFactory.getLogger(MessageConsumer.class); @Override public void onMessage(Message message) { logger.info("consumer receive message------->:{}", (User)SerializationUtils.deserialize(message.getBody())); } }
由於網上的資料都是傳字符串的,我就弄了個穿對象的。User代碼以下:
/** *@description *@auth panmingshuai *@time 2018年3月29日下午11:27:30 * */ public class User implements Serializable { /** * */ private static final long serialVersionUID = 1L; private Integer age; private String name; public User() { } public User(Integer age, String name) { this.age = age; this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "User [age=" + age + ", name=" + name + "]"; } }
最後是發送消息的Controller
/** *@description *@auth panmingshuai *@time 2018年3月24日下午10:26:21 * */ @Controller @RequestMapping("/rabbit") public class RabbitController { @Autowired private MessageProducer producer; @RequestMapping("/msg") @ResponseBody public String getMsg() throws IOException{ int a = 100; while (a > 0) { producer.sendMessage(new User(a, "pan"+a--)); try { //讓子彈飛一下子 Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } return "發送完畢"; } }
運行以後日誌效果以下:
2018-03-30 00:44:22,913 [qtp1651855867-17] INFO [org.pan.rabbitmq.rabbitmq.MessageProducer] - to send message:User [age=100, name=pan100] 2018-03-30 00:44:22,931 [org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer#0-1] INFO [org.pan.rabbitmq.rabbitmq.MessageConsumer] - consumer receive message------->:User [age=100, name=pan100] 2018-03-30 00:44:23,925 [qtp1651855867-17] INFO [org.pan.rabbitmq.rabbitmq.MessageProducer] - to send message:User [age=99, name=pan99] 2018-03-30 00:44:23,933 [org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer#0-1] INFO [org.pan.rabbitmq.rabbitmq.MessageConsumer] - consumer receive message------->:User [age=99, name=pan99] 2018-03-30 00:44:24,926 [qtp1651855867-17] INFO [org.pan.rabbitmq.rabbitmq.MessageProducer] - to send message:User [age=98, name=pan98] 2018-03-30 00:44:24,931 [org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer#0-1] INFO [org.pan.rabbitmq.rabbitmq.MessageConsumer] - consumer receive message------->:User [age=98, name=pan98] 2018-03-30 00:44:25,926 [qtp1651855867-17] INFO [org.pan.rabbitmq.rabbitmq.MessageProducer] - to send message:User [age=97, name=pan97] 2018-03-30 00:44:25,929 [org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer#0-1] INFO [org.pan.rabbitmq.rabbitmq.MessageConsumer] - consumer receive message------->:User [age=97, name=pan97] 2018-03-30 00:44:26,927 [qtp1651855867-17] INFO [org.pan.rabbitmq.rabbitmq.MessageProducer] - to send message:User [age=96, name=pan96] 2018-03-30 00:44:26,929 [org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer#0-1] INFO [org.pan.rabbitmq.rabbitmq.MessageConsumer] - consumer receive message------->:User [age=96, name=pan96] 2018-03-30 00:44:27,927 [qtp1651855867-17] INFO [org.pan.rabbitmq.rabbitmq.MessageProducer] - to send message:User [age=95, name=pan95] 2018-03-30 00:44:27,929 [org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer#0-1] INFO [org.pan.rabbitmq.rabbitmq.MessageConsumer] - consumer receive message------->:User [age=95, name=pan95] 2018-03-30 00:44:28,927 [qtp1651855867-17] INFO [org.pan.rabbitmq.rabbitmq.MessageProducer] - to send message:User [age=94, name=pan94] 2018-03-30 00:44:28,931 [org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer#0-1] INFO [org.pan.rabbitmq.rabbitmq.MessageConsumer] - consumer receive message------->:User [age=94, name=pan94] 2018-03-30 00:44:29,928 [qtp1651855867-17] INFO [org.pan.rabbitmq.rabbitmq.MessageProducer] - to send message:User [age=93, name=pan93] 2018-03-30 00:44:29,932 [org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer#0-1] INFO [org.pan.rabbitmq.rabbitmq.MessageConsumer] - consumer receive message------->:User [age=93, name=pan93]