java 使用rabbitmq_java远程连接调用Rabbitmq的实例代码

本文介绍了java远程连接调用Rabbitmq,分享给大家,希望此文章对各位有所帮助。

打开IDEA创建一个maven工程(Java就可以了)。

27102ef56791cde19b4c034207c41c0c.png

pom.xml文件如下

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

4.0.0

com.zhenqi

rabbitmq-study

1.0-SNAPSHOT

jar

rabbitmq-study

http://maven.apache.org

UTF-8

junit

junit

4.12

test

com.rabbitmq

amqp-client

4.1.0

org.slf4j

slf4j-api

org.slf4j

slf4j-log4j12

1.7.21

commons-lang

commons-lang

2.6

为了能远程访问rabbitmq,则需要编辑 /etc/rabbitmq/rabbitmq.conf,添加以下内容。

[

{rabbit, [{tcp_listeners, [5672]}, {loopback_users, ["asdf"]}]}

]

添加administrator角色

rabbitmqctl set_user_tags openstack administrator

创建抽象队列 EndPoint.java

package com.zhenqi;

import com.rabbitmq.client.Channel;

import com.rabbitmq.client.Connection;

import com.rabbitmq.client.ConnectionFactory;

/**

* Created by wuming on 2017/7/16.

*/

public abstract class EndPoint {

protected Channel channel;

protected Connection connection;

protected String endPointName;

public EndPoint(String endpointName) throws Exception {

this.endPointName = endpointName;

//创建一个连接工厂 connection factory

ConnectionFactory factory = new ConnectionFactory();

//设置rabbitmq-server服务IP地址

factory.setHost("192.168.146.128");

factory.setUsername("openstack");

factory.setPassword("rabbitmq");

factory.setPort(5672);

factory.setVirtualHost("/");

//得到 连接

connection = factory.newConnection();

//创建 channel实例

channel = connection.createChannel();

channel.queueDeclare(endpointName, false, false, false, null);

}

/**

* 关闭channel和connection。并非必须,因为隐含是自动调用的。

* @throws IOException

*/

public void close() throws Exception{

this.channel.close();

this.connection.close();

}

}

生产者Producer.java

生产者类的任务是向队列里写一条消息

package com.zhenqi;

import org.apache.commons.lang.SerializationUtils;

import java.io.Serializable;

/**

* Created by wuming on 2017/7/16.

*/

public class Producer extends EndPoint {

public Producer(String endpointName) throws Exception {

super(endpointName);

}

public void sendMessage(Serializable object) throws Exception {

channel.basicPublish("",endPointName, null, SerializationUtils.serialize(object));

}

}

消费者QueueConsumer.java

消费者可以以线程方式运行,对于不同的事件有不同的回调函数,其中最主要的是处理新消息到来的事件。

package com.zhenqi;

import com.rabbitmq.client.AMQP;

import com.rabbitmq.client.Consumer;

import com.rabbitmq.client.Envelope;

import com.rabbitmq.client.ShutdownSignalException;

import org.apache.commons.lang.SerializationUtils;

import org.apache.log4j.Logger;

import java.io.IOException;

import java.util.HashMap;

import java.util.Map;

/**

* Created by wuming on 2017/7/16.

*/

public class QueueConsumer extends EndPoint implements Runnable, Consumer {

private Logger LOG=Logger.getLogger(QueueConsumer.class);

public QueueConsumer(String endpointName) throws Exception {

super(endpointName);

}

public void handleConsumeOk(String s) {

}

public void handleCancelOk(String s) {

}

public void handleCancel(String s) throws IOException {

}

public void handleShutdownSignal(String s, ShutdownSignalException e) {

}

public void handleRecoverOk(String s) {

LOG.info("Consumer "+s +" registered");

}

public void handleDelivery(String s, Envelope envelope, AMQP.BasicProperties basicProperties, byte[] bytes) throws IOException {

Map map = (HashMap) SerializationUtils.deserialize(bytes);

LOG.info("Message Number "+ map.get("message number") + " received.");

}

public void run() {

try{

channel.basicConsume(endPointName, true,this);

}catch(IOException e){

e.printStackTrace();

}

}

}

测试

运行一个消费者线程,然后开始产生大量的消息,这些消息会被消费者取走

package com.zhenqi;

import java.util.HashMap;

/**

* Created by wuming on 2017/7/16.

*/

public class TestRabbitmq {

public static void main(String[] args){

try{

QueueConsumer consumer = new QueueConsumer("queue");

Thread consumerThread = new Thread(consumer);

consumerThread.start();

Producer producer = new Producer("queue");

for (int i = 0; i < 100000; i++){

HashMap message = new HashMap();

message.put("message number", i);

producer.sendMessage(message);

System.out.println("Message Number "+ i +" sent.");

}

}catch(Exception e){

e.printStackTrace();

}

}

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值