关注微信公众号 太平洋学习网 扫描二维码
最新消息:关注【太平洋学习网】微信公众号,可以获取全套资料,【全套Java基础27天】【JavaEE就业视频4个月】【Android就业视频4个月】

RabbitMQ消息队列入门:发送一条"hello world rabbitmq"消息

Javaweb 太平洋学习网 浏览 评论

RabbitMQ消息队列入门:发送一条"hello world rabbitmq"消息

RabbitMQ消息队列相当于消息代理人,它必须会把生产消息的那个人的消息带给消息接收者,否则的话这条消息就会一直存在消息队列queue中,等某天消息接受者看到了rabbitmq发送的消息,并确认接收到此条消息之后,queue中的消息才会销毁。

rabbitmq linux版安装教程请看:http://www.tpyyes.com/a/linux/2017/0824/188.html

下面将来学习rabbitmq入门知识,使用rabbitmq发送一条“hello world rabbitmq”消息给接收者,并打印出来,先来简单体验一下rabbitmq。

1:maven引入rabbitmq jar包,如果不是maven项目,则引入amqp-client-4.2.0.jar和slf4j-api-1.7.21.jar这两个jar包。

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

2:rabbitmq消息发送端Send.java类代码:

package com.baidu;

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 {
    //队列名称
    public final static String QUEUE_NAME = "queue_test1";
    
    public static void main(String[] args) throws Exception {
        //连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("118.78.101.154");
        factory.setUsername("guest");
        factory.setPassword("guest");
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        String message = "hello world rabbitmq";
        /**
         * 参数1:exchange交换器,以后会讲到
         * 参数2:需要发送到的队列名称
         * 参数3:消息配置信息
         * 参数4:消息字节数组
         */
        channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
        System.out.println("消息发送成功!");
        //如果不关闭发送端就一直处于运行状态(等待发送消息状态,开发中视情况而定)
        channel.close();
        connection.close();
    }
}

3:rabbitmq消息接收端Receive.java代码:

package com.baidu;

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

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Consumer;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
import com.rabbitmq.client.AMQP.BasicProperties;

public class Receive {
    //队列名称
    public final static String QUEUE_NAME = "queue_test1";
    
    public static void main(String[] args) throws Exception {
        //连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("118.78.101.154");
        factory.setUsername("guest");
        factory.setPassword("guest");
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        System.out.println("等待消息发送...");
        
        //使用DefaultConsumer回调来接收发送端的消息
        Consumer 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("收到queue_test1d队列消息:" + message);
            }
        };
        /**
         * 告诉发送者接收到了这条消息
         * 参数1:队列名称
         * 参数2:为true则表示消息已确认,false则没有确认,以后还会继续发送同样的消息到接收端
         * 参数3:消息回调
         */
        channel.basicConsume(QUEUE_NAME, true, consumer);
        
        //关闭之后就不会再接收到发送端的消息了,一般情况下是不关闭的,除非退出程序
        //channel.close();
        //connection.close();
    }
}

先运行发送端发送一条消息,再运行接收端,接收端会马上接收到一条“hello world rabbitmq”消息,如果有输入框的话,就类似于qq或微信的功能了。

rabbitmq应用场景:

1:当有大量人秒杀一个商品的时候,返回秒杀是否成功,一般都是过些时间才看得到是否商品秒杀成功,如果都是及时返回秒杀结果的话,由于人数很多,可能webserver服务器压力会剧增从而导致服务器崩溃,因此我们可以先将抢购信息写入rabbitmq消息队列中,当抢购者点击查看结果的时候,再返回秒杀结果,这样由于每个人查看秒杀结果的时间不同,服务器处理的并发就不会那么大了。

2:rabbitmq也具有消息的及时性,当后台修改商品价格的时候,它可以马上通知前台修改商品的价格,当前后台分离开发的时候,rabbitmq是具有消息的解耦性的。

3:rabbitmq可以做及时通讯功能,类似于websocket的功能。


来源网站:太平洋学习网,转载请注明出处:http://www.tpyyes.com/a/javaweb/2017/0903/202.html

    与本文相关的文章