Java獲取php端放入rabbitmq內(nèi)的消息
背景:項(xiàng)目中一個(gè)場(chǎng)景需要用java端的處理代碼獲取php端放到rabbitmq內(nèi)的消息,然后做相應(yīng)業(yè)務(wù)的處理。
前提:rabbitmq服務(wù)器已經(jīng)搭建好,php端的消息發(fā)布正常運(yùn)行。
首先:下載rabbitmq-client對(duì)應(yīng)的java版jar包(spring好像有相應(yīng)的支持)
開(kāi)始代碼coding的工作,上代碼
package com.eelly.imagesearch.common;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.GetResponse;
public class RabbitMqControll {
/**
* 讀取RabbitMq中的存儲(chǔ)信息
*
* @param queue_name 隊(duì)列名
* @param exchange_name 交換機(jī)名
* @param route_key 綁定用到的route_key
* @param durable 是否持久化
*/
public void readRabbitMqInfo (String queue_name,
String exchange_name, String route_key, boolean durable)
{
ConnectionFactory factory = new ConnectionFactory();
// 設(shè)置服務(wù)器ip
factory.setHost("172.18.107.66");
// 設(shè)置rabbitmq服務(wù)器運(yùn)行的端口
factory.setPort(5672);
// 設(shè)置rabbitmq服務(wù)器連接用戶
factory.setUsername("guest");
// 設(shè)置rabbitmq服務(wù)器連接用戶密碼
factory.setPassword("guest");
// 設(shè)置rabbitmq服務(wù)器節(jié)點(diǎn)目錄(個(gè)人理解)
factory.setVirtualHost("/");
try {
// 創(chuàng)建工廠連接
Connection connection = factory.newConnection();
// 創(chuàng)建通道
Channel channel = connection.createChannel();
// 聲明交換機(jī)(設(shè)置相關(guān)屬性時(shí)需要和php端的一致)
channel.exchangeDeclare(exchange_name, "direct", durable);
// 聲明消息隊(duì)列(設(shè)置相關(guān)屬性時(shí)需要和php端的一致)
channel.queueDeclare(queue_name, durable, false, true, null);
// 綁定消息隊(duì)列(設(shè)置相關(guān)屬性時(shí)需要和php端的一致)
channel.queueBind(queue_name, exchange_name, route_key);
System.out.println(" [*] Waiting for messages. To exit press CTRL+C");
// basicConsume消費(fèi)模式
/*channel.basicQos(1);//消息分發(fā)處理
QueueingConsumer consumer = new QueueingConsumer(channel);
channel.basicConsume(queue_name, false, consumer);
while (true) {
QueueingConsumer.Delivery delivery = consumer.nextDelivery();
String message = new String(delivery.getBody());
System.out.println(" [x] Received '" + message + "'");
// 提交消息處理完成回復(fù)
channel.basicAck(delivery.getEnvelope()。getDeliveryTag(), false);
}*/
// basicGet消費(fèi)模式
while (true)
{
// get方式主動(dòng)消費(fèi)
GetResponse res=channel.basicGet(queue_name, false);
if (res != null && res.getMessageCount() >= 0)
{
System.out.println(res.getMessageCount());
String message = "";
message = new String(res.getBody());
channel.basicAck(res.getEnvelope()。getDeliveryTag(), false);
System.out.println(" [x] Received '" + message + "'");
}
else
{
System.out.println("消息隊(duì)列中沒(méi)有可消費(fèi)的信息!");
break;
}
}
channel.close();
connection.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
在開(kāi)發(fā)的過(guò)程中,主要報(bào)的異常是:
1.創(chuàng)建交換機(jī)和消息隊(duì)列時(shí),設(shè)置的屬性和消息產(chǎn)生端的php代碼設(shè)置的不一樣,導(dǎo)致不匹配和一直重寫(xiě)屬性
2.在調(diào)用時(shí)一直沒(méi)有確定到底是用basicConsume的消費(fèi)模式還是basicGet消費(fèi)模式(前者帶有監(jiān)控效果,后者沒(méi)有,不知道是不是因?yàn)橐徽哂刑鰓hile循環(huán),一者沒(méi)有的原因)托福改分
posted on 2014-01-02 15:33 好不容易 閱讀(266) 評(píng)論(0) 編輯 收藏