RabbitMQ学习第一记:用java连接RabbitMQ

1、什么是RabbitMQ

  MQ(Message Queue):消息队列,是服务端设计的一个可以存储大量消息的队列,并提供客户端操作队列的方法:生产队列(向队列中添加数据)、消费队列(从队列中取数据)。RabbitMQ就是基于消息队列的一个典型应用。RabbitMQ除了普通的生产消费功能,还有一些高级功能:公平分发 ,轮询分发,路由模式,通配符模式,发布订阅,队列持久化。

2、java实现RabbitMQ的连接

2.1、RabbitMQ客户端jar包

 

<dependency>
    <groupId>com.rabbitmq</groupId>
    <artifactId>amqp-client</artifactId>
    <version>4.0.2</version>
</dependency>

 

2.2、java连接RabbitMQ工具类

public class ConnectionUtil
{
    private static Logger logger = Logger.getLogger(ConnectionUtil.class);
    
    public static Connection getConnection()
    {
        try
        {
            Connection connection = null;
            //定义一个连接工厂
            ConnectionFactory factory = new ConnectionFactory();
            //设置服务端地址(域名地址/ip)
            factory.setHost("127.0.0.1");
            //设置服务器端口号
            factory.setPort(5672);
            //设置虚拟主机(相当于数据库中的库)
            factory.setVirtualHost("/");
            //设置用户名
            factory.setUsername("admin");
            //设置密码
            factory.setPassword("888888");
            connection = factory.newConnection();
            return connection;
        }
        catch (Exception e)
        {
            return null;
        }
    }
}

2.3、简单的生产者-消费者模式

  下图取自于官方网站(RabbitMQ)的生产消费模式的工作图

P:消息的生产者

C:消息的消费者

红色:队列 

生产者将消息发送到队列,消费者从队列中获取消息。

2.4、生产者(Send)

public class Send
{
    //队列名称
    private static final String QUEUE_NAME = "test_simple_queue";
    
    public static void main(String[] args)
    {
        try
        {
            //获取连接
            Connection connection = ConnectionUtil.getConnection();
            //从连接中获取一个通道
            Channel channel = connection.createChannel();
            //声明队列
            channel.queueDeclare(QUEUE_NAME, false, false, false, null);
            String message = "This is simple queue";
            //发送消息
            channel.basicPublish("", QUEUE_NAME, null, message.getBytes("utf-8"));
            System.out.println("[send]:" + message);
            channel.close();
            connection.close();
        }
        catch (IOException | TimeoutException e)
        {
            e.printStackTrace();
        }
    }
}

运行结果:
[send]:This is simple queue

2.5、消费者(Receive)

public class Receive
{
    //队列名称
    private static final String QUEUE_NAME = "test_simple_queue";
    
    public static void main(String[] args)
    {
        try
        {
            //获取连接
            Connection connection = ConnectionUtil.getConnection();
            //从连接中获取一个通道
            Channel channel = connection.createChannel();
            //声明队列
            channel.queueDeclare(QUEUE_NAME, false, false, false, null);
            //定义消费者
            DefaultConsumer consumer = new DefaultConsumer(channel)
            {
                //当消息到达时执行回调方法
                @Override
                public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties,
                        byte[] body) throws IOException
                {
                    String message = new String(body, "utf-8");
                    System.out.println("[Receive]:" + message);
                }
            };
            //监听队列
            channel.basicConsume(QUEUE_NAME, true, consumer);
        }
        catch (IOException | ShutdownSignalException | ConsumerCancelledException e)
        {
            e.printStackTrace();
        }
    }
}

运行结果:
[Receive]:This is simple queue

总结:简单的生产者-消费者模式实现了生产者向队列里生产数据,消费者启动后可以一直监听队列,不断的从队列里取出数据。

注意:本文仅代表个人理解和看法哟!和本人所在公司和团体无任何关系!

posted @ 2018-09-09 00:36  freeTimeWY  阅读(11690)  评论(1编辑  收藏  举报