rabbitmq分布式延迟队列

按照官网的安装方式安装和简单测试。

安装

  • 使用centos7(ubuntu配置apt-get)配置yum
  • 然后yum install erlang
  • 然后yum install rabbitmq-server
  • /sbin/service rabbitmq-server start 启动 /sbin/service rabbitmq-server stop 停止
  • 安装完rabbitmq后,有一个默认的用户guest,但是该用户不能远程连接,只能使用guest来连接本地的server。如果必须使用guest来进行远程登陆,则需要修改配置,修改/etc/rabbitmq/rabbitmq.conf文件,[ {rabbit, [ {loopback_users, []}]}]. 。(注意有个点)
  • 使用rpm查看一个包安装改变的地方:rabbitmq 有/usr/lib /etc/sbin /usr/share是文档
  • 或者可以自己增加一个用户,步骤如下:
  1. 创建一个test用户:rabbitmqctl add_user test passwd
  2. 设置该用户为administrator角色:rabbitmqctl set_user_tags test administrator
  3. 设置权限: rabbitmqctl set_permissions -p '/' test '.' '.' '.'
  4. 重启rabbitmq服务:sudo service rabbitmq-server restart 之后就能用test用户远程连接rabbitmq server了。
  • 浏览器控制台启用 rabbitmq-plugins enable rabbitmq_management, sudo service rabbitmq-server restart 然后访问 https://ip:15672

测试

例子1:实现分布式延迟队列

消息发送方:

public class P {
    private final static String QUEUE_NAME = "delay_queue";

    public static void main(String[] args) throws IOException, TimeoutException {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("192.168.137.5");
        factory.setUsername("guest");
        factory.setPassword("guest");
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();
        Map<String,Object> map = new HashMap<>();
        map.put("x-expires",30000);
        map.put("x-message-ttl", 12000);
        map.put("x-dead-letter-exchange", "exchange-direct");//过期消息转向路由
        map.put("x-dead-letter-routing-key", "routing-delay");
        channel.queueDeclare(QUEUE_NAME, false, false, false, map);
        String message = "Hello World!"+System.currentTimeMillis();
        channel.basicPublish("", QUEUE_NAME, null, message.getBytes("UTF-8"));
        System.out.println(" [x] Sent '" + message + "'");

        channel.close();
        connection.close();
    }
}

消息接收方:

public class C {
    public static void main(String[] args) throws IOException, TimeoutException {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("192.168.137.5");
        factory.setUsername("guest");
        factory.setPassword("guest");
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();
        channel.exchangeDeclare("exchange-direct","direct");
        String queue = channel.queueDeclare().getQueue();
        channel.queueBind(queue,"exchange-direct","routing-delay");

        Consumer consumer = new DefaultConsumer(channel) {
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body)
                    throws IOException {
                long now = System.currentTimeMillis();
                String message = new String(body, "UTF-8") + now;
                System.out.println(" [x] Received '" + message + "'");
            }
        };
        channel.basicConsume(queue, true, consumer);

    }
}

解释:过期消息转给路由exchange-direct,这个路由绑定了匿名队列,过期消息有routing-key是routing-delay,会被路由器路由到匿名队列,因为匿名队列绑定了路由器channel.queueBind(queue,"exchange-direct","routing-delay");,这样消息过期就会被消费,实现了分布式的延迟队列。

转载于:https://my.oschina.net/wuxiaofei/blog/2059232

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值