RabbitMQ学习笔记(一)

很抱歉在这个周末没有延续大家喜闻乐见的远古程序员系列,而是弄了这么一篇枯燥的技术性文章。主要是因为工作需要,老狗这一周都在研究RabbitMQ,不趁热把学习心得写出来,有些知识点老狗自己都怕时间一长给忘却了。为了不让大家就此失去读下去的兴趣,老狗将使出浑身解数,尽量将无趣的技术说的声情并茂一些。
老狗之前写过一篇RabbitMQ的安装笔记,在那篇文里对RabbitMQ有个简单的定义,这里不再冗述。这里简单介绍一下RabbitMQ中的一些基本概念:
生产 (Producing):RabbitMQ的黑话,其实就是发送消息,一个发送消息的程序就叫做生产者(Producer)。
队列(Queue):本质上是一个长度无限制的缓存,由RabbitMQ维护和管理,消息经由这个缓存在程序间流动,理论上说你可以向队列中插入任意数量的消息。
消费(Consuming):又是黑话,意思是接收消息,等待接收队列中消息的程序叫消费者(Consumer)。
接下来我们准备用Java编写第一个RabbitMQ程序,按国际惯例第一个程序命名为“Hello World”,祭给Brian Kernighan大牛。
首先把RabbitMQ的jar包拷贝到你的项目目录下,jar包在这里下载:http://www.rabbitmq.com/java-client.html
本狗为了显得高端大气与众狗狗不同,没有用拷贝到lib目录的方法在项目中引入jar包。本狗是这样做的,首先把jar包都拷贝到一个公共目录下,比如CommonLibrary,然后在Eclipse中右键项目,选择Build Path--->Add External Archives,在打开的窗口中选择所有的jar包。这样做的好处是如果有多个项目都要引用RabbitMQ的jar包,不需要把jar包拷来拷去的,更重要的,显得大爷我就是比你们会玩Eclipse啊哈哈哈哈,你们这些弱逼还不献上膝盖!
淡定,淡定一下,现在来看我们第一个生产者程序:
// 首先要引入这些
import java.io.IOException;
import java.util.concurrent.TimeoutException;

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

// 主程序是这样写的
public class Send {
    private final static String QUEUE_NAME = "hello";

    public static void main(String[] argv) throws java.io.IOException {        
        ConnectionFactory factory = new ConnectionFactory();
        //假设你的RabbitMQ安装在本机,这里也可以写上IP地址
        factory.setHost("localhost");
        Connection connection = null;
        Channel channel = null;
        try {
            connection = factory.newConnection();

            channel = connection.createChannel();
            // 先不管这里的一连串false的含义,后面会慢慢讲到
            channel.queueDeclare(QUEUE_NAME, false, false, false, null);
            String message = "hello world!";
            channel.basicPublish("",QUEUE_NAME, null, message.getBytes());

            System.out.println("[Producer] Sent " + message + " to " + QUEUE_NAME);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (TimeoutException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            if (null != channel) {
                try {
                    channel.close();
                } catch (IOException | TimeoutException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

            if (null != connection) {
                try {
                    connection.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }

注意在官网上的示例代码都没有捕获和处理异常,实际上那是行不通的,可能抛出的几个检查型异常必须捕获并处理。
接下来我们再建一个项目作为消费者(Consumer),同样需要引用RabbitMQ的jar包。以下是代码:
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Connection;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Consumer;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;

public class ReceiverMain {

    private final static String QUEUE_NAME = "Hello";


    public static void main(String[] args) {
        // 同样要先建立到RabbitMQ的连接
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost(“localhost”);

        try {
            final Connection connection = factory.newConnection();

            final Channel channel = connection.createChannel();
            channel.queueDeclare(QUEUE_NAME, false, false, false, null);

            System.out.println("[Consumer] Waiting for messages. To exit press Ctrl + C ");

            // 这里用一个方法内部类来供RabbitMQ的方法回调处理消息,典型的命令模式
            final Consumer consumer = new DefaultConsumer(channel) {
                @Override
                public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                    String message = new String(body, "UTF-8");
                    System.out.println("[Consumer] Received '" + message + "'");
                }

            };

            // 回调内部类,处理消息,先不管true参数的含义,后面会有详细解释
            channel.basicConsume(QUEUE_NAME, true, consumer);

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (TimeoutException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

到此一个应用RabbitMQ的基本程序就完成了,接下来我们先后执行生产者和消费者程序,来看下消息的传递。
执行程序时要指定RabbitMQ的jar包所在的位置,否则应用程序自己是找不到相关jar包的,我是这样指定的:
首先进入到项目的bin目录下,用相对路径指定jar包位置和class文件所在位置。
java -cp .:../../CommonLibrary/commons-io-1.2.jar:../../CommonLibrary/commons-cli-1.1.jar:../../CommonLibrary/rabbitmq-client.jar com.halo.main.StudyMain
注意com.halo.main是我的包路径。现在生产者程序启动了,接下来启动消费者程序:
java -cp .:../../CommonLibrary/commons-io-1.2.jar:../../CommonLibrary/commons-cli-1.1.jar:../../CommonLibrary/rabbitmq-client.jar com.halo.main.ReceiverMain
如果你用Maven编译了两个程序并生成可执行文件,就不用这么麻烦,那是后话,我们以后再说。
老狗觉得这篇文章写的还是太枯燥了,大家有用到的时候再拿来做参考吧。如果大家有需要,下一章我们继续讲解RabbitMQ的一些高级用法,例如在多个消费者中均衡的调度。请拼命的打赏,让我知道这篇文章对你有用!



欢迎扫码关注我的微信公众号



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值