目前项目上使用的消息中间件是RabbitMq,期间有一个次需要切换Mq,可是此时原来Mq服务中有一部分未消费的消息,所以需要将原来未消费的消息读取出来发送到新的Mq服务中,再加上日常系统运行后台也需要查看一些未消费的消息,所以就在后台做了一个Mq消息管理的一个页面,将为消费的消息展示出来,也可以在后台发送消息到Mq中,具体如下:
1、项目中添加一下代码
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.12</version>
</dependency>
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>http-client</artifactId>
<version>3.1.1.RELEASE</version>
</dependency>
2、打开com.rabbitmq.http.client包下的 Client类
3、重新创建一个具体实现读取消息的类,此处我创建的是QueryMsgFromMq
4、将第二步打开的Client的类的代码拷贝到你创建的QueryMsgFromMq类中,将构造方法名称改为你新创建的类名称,如下代码:
// 修改前
public Client(String url, String username, String password) throws MalformedURLException, URISyntaxException {
this(new URL(url), username, password);
}
// 修改后
public QueryMsgFromMq(String url, String username, String password) throws MalformedURLException, URISyntaxException {
this(new URL(url), username, password);
}
注意:我在此处只是放了一个构造方法的实例,在具体实现时需要将所有的构造方法名称替换成你新创建的类名称
5、在新创建的类中添加如下代码
public void queryMessageFromMq(String vhost, String queuename, String count) throws URISyntaxException, IOException, ClassNotFoundException {
Map<String, String> body = new HashMap<String, String>();
body.put("ackmode","ack_requeue_true");
body.put("count",count);
body.put("encoding","auto");
body.put("ackmode","ack_requeue_true");
final URI uri = uriWithPath("http://192.168.145.55:15672/api/queues/" + encodePathSegment(vhost) + "/" + encodePathSegment(queuename) + "/get");
ResponseEntity<List> result= rt.postForEntity(uri, body, List.class);
System.out.println("result============" + result.getBody().size());
List list = result.getBody();
for (Object entry : list) {
if (entry instanceof Map) {
// System.out.println("entry-------------"+ entry);
System.out.println(((Map) entry).get("payload"));
}
}
}
public static void main(String[] args) throws ClassNotFoundException, URISyntaxException, IOException {
// http://guest:guest@192.168.145.55:15672/api/
// guest:guest 标识RabbitMq后台登录的用户名和密码
QueryMsgFromMq test = new QueryMsgFromMq("http://guest:guest@192.168.145.55:15672/api/");
String vhost = "ch-dev";
String queuename = "queue_test";
test.queryMessageFromMq(vhost,queuename,"10");
}
以上便可读取Mq中的消息,结果如下
如果大家有好的方法也可以沟通交流...