• rabbitmq 用java客户端生产和消费消息


    用maven项目演示,添加dependency

    <!-- https://mvnrepository.com/artifact/com.rabbitmq/amqp-client -->
            <dependency>
                <groupId>com.rabbitmq</groupId>
                <artifactId>amqp-client</artifactId>
                <version>4.2.1</version>
            </dependency>

    默认的rabbitmq用户名和密码是guest,但是这个账号有限制,默认只能通过本地网络访问,远程网络访问受限。所以添加一个用户。

    lmy@Y480:/opt/rabbitmq/sbin$ rabbitmqctl list_users
    Listing users
    guest    [administrator]
    lmy@Y480:/opt/rabbitmq/sbin$ rabbitmqctl add_user root root
    Creating user "root"
    lmy@Y480:/opt/rabbitmq/sbin$ rabbitmqctl set_permissions -p / root ".*" ".*" ".*"
    Setting permissions for user "root" in vhost "/"
    lmy@Y480:/opt/rabbitmq/sbin$ rabbitmqctl list_users
    Listing users
    guest    [administrator]
    root    []
    lmy@Y480:/opt/rabbitmq/sbin$ rabbitmqctl set_user_tags root administrator
    Setting tags for user "root" to [administrator]
    lmy@Y480:/opt/rabbitmq/sbin$ rabbitmqctl list_users
    Listing users
    guest    [administrator]
    root    [administrator]
    lmy@Y480:/opt/rabbitmq/sbin$ 

    add_user 是增加用户

    set_permissions 为root用户设置所有权限

    set_user_tags设置root用户为管理员角色

    下面编写一个例子,首先生产者发送一条消息“hello world”至 RabbitMQ中,之后由消费者消费。

    下面是生产这客户端代码。

    package com.lmy.demo.rabbitmq.demo;
    
    import com.rabbitmq.client.Channel;
    import com.rabbitmq.client.Connection;
    import com.rabbitmq.client.ConnectionFactory;
    import com.rabbitmq.client.MessageProperties;
    
    public class RabbitProducer {
        private static final String EXCHANGE_NAME="exchange_demo";
        private static final String ROUTING_KEY="routingkey_demo";
        private static final String QUEUE_NAME="queue_demo";
        private static final String IP_ADDRESS="127.0.0.1";
        private static final int PORT=5672; //rabbitMQ 服务端默认端口号为5672
        public static void main(String[] args) throws Exception {
            ConnectionFactory factory=new ConnectionFactory();
            factory.setHost(IP_ADDRESS);
            factory.setPort(PORT);
            factory.setUsername("root");
            factory.setPassword("root");
            Connection connection=factory.newConnection();//创建连接
            Channel channel=connection.createChannel();//创建信道
            //创建一个type="direct"、持久化的、非自动删除的交换器
            channel.exchangeDeclare(EXCHANGE_NAME,"direct",true,false,null);
            //创建一个持久化、非排他的、非自动删除的队列
            channel.queueDeclare(QUEUE_NAME, true, false,false,null);
            //将交换器与队列通过路由键绑定
            channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, ROUTING_KEY);
            //发送一条持久化的消息;hello world
            String message="Hello world";
            channel.basicPublish(EXCHANGE_NAME, ROUTING_KEY, MessageProperties.PERSISTENT_TEXT_PLAIN,
                    message.getBytes());
    //        //关闭资源
    //        channel.close();
    //        connection.close();
        }
    }

    下面是消费者客户端代码

    package com.lmy.demo.rabbitmq.demo;
    
    import java.io.IOException;
    import java.util.concurrent.TimeUnit;
    
    import com.rabbitmq.client.Address;
    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 RabbitConsumer {
        private static final String QUEUE_NAME="queue_demo";
        private static final String IP_ADDRESS="127.0.0.1";
        private static final int PORT=5672;
        public static void main(String[] args) throws Exception {
            Address[] addresses=new Address[]{
                    new Address(IP_ADDRESS,PORT)
            };
            ConnectionFactory factory=new ConnectionFactory();
            factory.setUsername("root");
            factory.setPassword("root");
            //这里的连接方式与生产者的demo略有不同,注意辨别区别
            Connection connection=factory.newConnection(addresses);//创建连接
            final Channel channel=connection.createChannel();//创建信道
            channel.basicQos(64);//设置客户端最多接收未被ack的消息的个数
            Consumer consumer=new DefaultConsumer(channel){
                @Override
                public void handleDelivery(String consumerTag, Envelope envelope,
                        BasicProperties properties, byte[] body) throws IOException {
                    System.out.println("recv message:"+new String(body));
                    try {
                        TimeUnit.SECONDS.sleep(1);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    channel.basicAck(envelope.getDeliveryTag(),false);
                }
            };
            channel.basicConsume(QUEUE_NAME,consumer);
            channel.basicConsume(QUEUE_NAME, false, "myConsumerTag",new DefaultConsumer(channel){
                @Override
                public void handleDelivery(String consumerTag, Envelope envelope,
                        BasicProperties properties, byte[] body) throws IOException {
                    String routingKey=envelope.getRoutingKey();
                    String contentType=properties.getContentType();
                    
                }
            });
            //等待回调函数执行完毕之后,关闭资源
            TimeUnit.SECONDS.sleep(5);
            channel.close();
            connection.close();
        }
    }

    先运行生产者客户端,再运行消费者客户端。可以看到下面的效果。

    在网页管理页面可以看到。

  • 相关阅读:
    摘抄博文
    html5中getContext()方法和CanvasRenderingContext2D对象详解
    三十四、Android Spinner控件之键值对用法
    二十七、Android之GPS定位详解
    J2EE用监听器实现同一用户只能有一个在线
    三十二、Android上传文件至服务器
    二十六、Android WebView缓存
    三十九、Android原理 不需要关闭后台运行程序
    三十七、android sqlite3详解
    struts2之注解权限控制
  • 原文地址:https://www.cnblogs.com/liumy/p/11355000.html
Copyright © 2020-2023  润新知