rabbitMQ的jar封装使用

一丶介绍

​ rabbitMQJar是对rabbitmq的一种jar包封装,使其能简单的被java程序调用。在spring的rabbitTemplate基础上进一步简化使用。此项目参考了https://github.com/littlersmall/rabbitmq-access项目的多线程消费者与消息重发机制。也非常感谢作者的开源支持。

二丶封装功能支持

  1. 支持发送字符串类型消息与java对象消息。
  2. 支持多线程消费者。(固定线程池)
  3. 支持消息重发,保证消息可靠到达。

三丶缺点

  1. 消息重发机制缺陷:

    因发送消息至MQ后,需要MQ返回ACK确认发送成功,但在发送ACK返回前突然断网,则不知道是否发送成功。一定时间未收到ACK,则认定发送失败重发,而或许已经发送成功,只是还未有ACK确认。因此可能会造成消息多发。经过rabbitmq-access作者测试发送300w条数据,发送结束后,实际发送数据301.2w条。详细性能见:https://www.jianshu.com/p/4112d78a8753

四丶rabbitMQJar API

  1. Rabbit:

    Rabbit对象里封装了设置连接,创建Exchange丶queue,接收消息功能。

  2. SenderInter:

    发送消息接口。

  3. SenderBuilder:

    发送消息对象创建者。可以创建一个发送消息对象。

  4. MessageProcessInter:

    消息处理接口,用于接收到消息后给用户自己处理。

  5. 设置连接属性接口:

    public static void setConnection(String host,int port,String username,String password);                         --属于Rabbit类方法
  6. 启动连接接口:

    Rabbit rabbit = Rabbit.start();
  7. 创建Exchange:

    void createExchange(String exchange,String routingKey,String type,boolean durable,boolean autoDelete,Connection connection)
    type: direct丶fanout丶 topic
    durable: 是否持久化exchange,即重启是否保留这个exchange。
    autoDelete: 没有消费者的时候,服务器是否删除exchange.
    Connection: rabbitTemplate的连接对象。
                                                --属于Rabbit对象方法
  8. 创建队列并绑定exchange:

    void createQueueAndBindExchange(String queue,boolean durable,boolean exclusive,boolean autoDelete,Connection connection);
    durable: 在服务器重启时,队列是否不删除.
    exclusive: 是否为当前连接的专用队列。(专用则在连接断开后,会自动删除该队列)
    autoDelete: 当没有任何消费者使用时,自动删除该队列。
    Connection: rabbitTemplate的连接对象。
                                                --属于Rabbit对象方法
  9. 创建发送者:

    SenderInter buildMessageSender(String exchange,String routingKey,String queue,Rabbit rabbit);
    其中queue参数可为空串,表示只往exchange发消息,不直接发送到队列,而是y与exchange绑定的队列可以接收到消息。
                                        --属于SenderBuilder类方法
  10. 发送消息:

    void send(String message);// 发送字符串
    void send(Object message);// 发送java对象
                                              --属于SenderInter接口方法
  11. 接收消息:

    void threadPoolConsume(int threadCount,int interval,String queue,MessageProcessInter messageProcess);
    threadCount: 消费者线程数量。
    interval: 每个线程消费消息的间隔时间。
    messageProcess: 消息处理对象。(用户自定义对象继承MessageProcessInter接口)。

五丶例子

  1. 导入jar包:rabbitMQ.jar。

  2. 设置并启动连接:

      Rabbit.setConnection("127.0.0.1", 5672, "username", "password");// 设置连接的ip丶端口丶用户名丶密码
      Rabbit rabbit = Rabbit.start();// 启动连接

  3. 创建Exchange:

    rabbit.createExchange("exchange", "routingKey","type",true,false,rabbit.getConnection());
  4. 创建Queue:

    rabbit.createQueueAndBindExchange("queue",true,false,false,rabbit.getConnection());

  5. 创建消息发送者:

    SenderInter sender=SenderBuilder.buildMessageSender("exchange","",rabbit);
    //发送string消息
    sender.send("我是rabbit");
    //发送对象消息
    sender.send(new ConsumeFlag(true,"i am rabbit")); //对象用户自定义,此处只是例子。

  6. 创建消息处理类:

    package com.pk.rabbit;
    import java.io.UnsupportedEncodingException;
    import org.springframework.amqp.core.Message;
    import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
    import org.springframework.amqp.support.converter.MessageConverter;
    import com.pk.rabbit.common.SuccessFlag;
    import com.pk.rabbit.handle.MessageProcessInter;
    
    
    public class MyProcess implements MessageProcessInter {
    
    
     @Override
     public SuccessFlag process(Message message) {
       MessageConverter messageConverter = new Jackson2JsonMessageConverter();
       // 对象接收
       // ConsumeFlag cf = (ConsumeFlag) messageConverter.fromMessage(message);
       // System.out.println(cf.getError());
       // 字符串接收
       try {
         System.out.println(new String(message.getBody(), "UTF-8"));
       } catch (UnsupportedEncodingException e) {
         e.printStackTrace();
       }
       return new SuccessFlag(true, "");
     }
    }
  7. 创建消息处理对象:

    MyProcess mp=new MyProcess();
  8. 开启线程池消费者:

    rabbit.threadPoolConsume(2,1,"queue",mp);

github: https://github.com/spcBackToLife/rabbitJar

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RabbitMQ 是一个开源的消息队列系统,它使用 AMQP(Advanced Message Queuing Protocol)来进行消息的传递。RabbitMQ 提供了丰富的功能和灵活性,但在使用时可能需要一些封装来简化操作和提高开发效率。 在封装 RabbitMQ 时,可以考虑以下几个方面: 1. 连接管理:封装连接管理可以处理连接的建立和关闭,以及连接的断开重连等情况。这样可以避免在每次使用 RabbitMQ 时都手动创建和关闭连接,提高代码的可维护性。 2. 队列声明和绑定:封装队列的声明和绑定操作可以简化创建队列和绑定交换机的过程。可以提供一个统一的接口,传入队列名称、交换机名称等参数,封装具体的操作细节。 3. 消息发送和接收:封装消息的发送和接收过程可以提供简单易用的接口,隐藏底层的细节。可以提供异步发送和接收的方式,支持回调函数或事件监听机制,方便处理消息的处理逻辑。 4. 错误处理和重试:封装错误处理和重试机制可以增加消息传递的可靠性。当消息发送或接收失败时,可以进行重试或记录错误日志,确保消息不会丢失。 5. 消费者管理:封装消费者的管理可以简化消费者的创建和启动过程。可以提供一个统一的接口,传入消费者处理函数,封装具体的消费者启动和处理逻辑。 6. 消息确认和拒绝:封装消息的确认和拒绝机制可以确保消息的可靠传递。可以提供自动确认或手动确认的方式,确保消息被正确处理。 以上是一些常见的封装思路,具体的封装方式可以根据实际需求和项目情况进行调整和扩展。在封装时,可以参考一些已有的 RabbitMQ 封装库,如 Spring AMQP 等,也可以根据自己的需求进行定制化封装
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值