RocketMQ

多生产者产生的消息可以被同一个消费者消费,也可以被多个消费者消费

单生产者可以也可以被多个消费者消费,默认负载均衡,但是前提是要在一个组当中

下面的这个是同步消息

public class TestRocketMQServer {

    public static void main(String[] args) throws Exception {

        //1.创建一个发送消息的对象Producer
        DefaultMQProducer producer = new DefaultMQProducer("group1");

        //设置这个提供者的命名空间
        producer.setNamesrvAddr("192.168.23.129:9876");

        //启动发送的服务
        producer.start();


        for (int i = 0; i < 10; i++) {

            Message message = new Message("panpan", ("消息"+i).getBytes(StandardCharsets.UTF_8));

            SendResult result = producer.send(message);

            System.out.println("同步发送结果"+result);

        }

    }




}
public class TestingRocketMQClient {
    public static void main(String[] args) throws Exception{

        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("group");

        consumer.setNamesrvAddr("192.168.23.129:9876");

        consumer.subscribe("panpan","*");

        


        consumer.registerMessageListener(new MessageListenerConcurrently() {
            @Override
            public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> list, ConsumeConcurrentlyContext consumeConcurrentlyContext) {

                list.forEach((messageExt)->{
                    System.out.println(new String(messageExt.getBody()));
                });

                return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;

            }
        });

        //开启消费者
        consumer.start();
    }
}

提供端发送异步消息

public class RocketMQ2Server4Asynchronous {

    public static void main(String[] args) throws Exception {

        DefaultMQProducer defaultMQProducer = new DefaultMQProducer("Group");

        defaultMQProducer.setNamesrvAddr("192.168.23.129:9876");

        defaultMQProducer.start();

        Message message = new Message("panpan", "这是一个异步的消息".getBytes());


        defaultMQProducer.send(message, new SendCallback() {
            //表示成功返回结果
            public void onSuccess(SendResult sendResult) {
                System.out.println(sendResult);
            }
            //表示发送消息失败
            public void onException(Throwable t) {
                System.out.println(t);
            }
        });

        
        Thread.sleep(1000);

        /**
         * 为了保证异步消息不报异常,让线程睡1000毫秒
         */
        defaultMQProducer.shutdown();
    }
}

单向消息和延时消息

public class RocketMQServer4OneWayAndDelay {


    public static void main(String[] args) throws Exception{


        DefaultMQProducer producer = new DefaultMQProducer("OneWayAndDelay");

        producer.setNamesrvAddr("192.168.23.129:9876");

        producer.start();

        /**
         * 单向发送,没有返回值的
         */
        producer.sendOneway(new Message("panpan","单向发送".getBytes()));


        /**
         * 延时发送,延时等级为3
         * 目前支持的消息时间
         *
         * 1. 秒级:1,5,10,30
         * 2. 分级:1~10,20,30
         * 3. 时级:1,2
         * 4. 1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h
         * 5. 下标从1开始 msg.setDelayTimeLevel(3);  3代表10s
         *
         *
         */
        Message delayMessage = new Message("panpan", "延时消息".getBytes());

        delayMessage.setDelayTimeLevel(3);

        producer.send(delayMessage);
        
    }
}

批量消息

 /**
         * 发送批量消息
         * 1. 消息内容总长度不超过4M
         * 2. 消息内容总长度包含如下:
         *    1. topic(字符串字节数)
         *    2. body (字节数组长度)
         *    3. 消息追加的属性(key与value对应字符串字节数)
         *    4. 日志(固定20字节)
         */

        ArrayList<Message> messages = new ArrayList<>();

        messages.add(new Message("panpan","hello".getBytes()));

        producer.send(messages);

顺序消息提供者

public class RocketOrderService {


    /**
     * 顺序消息服务提供方
     * 目的:每个线程放入不同的队列
     *
     */
    public static void main(String[] args) throws Exception{

        DefaultMQProducer producer = new DefaultMQProducer("group1");

        producer.setNamesrvAddr("192.168.23.129:9876");

        producer.start();

        ArrayList<Message> messages = new ArrayList<>();

        for (int i = 0; i < 20; i++) {

            messages.add(new org.apache.rocketmq.common.message.Message("topic",("消息"+i).getBytes()));

        }




        for (int i = 0; i < messages.size(); i++) {

             int j=i;

            /**
             * 来指定放入哪个队列里,根据信息队列选择器来放置
             */
            producer.send(messages.get(i), new MessageQueueSelector() {
                @Override
                public MessageQueue select(List<MessageQueue> list, Message message, Object o) {
                    /**
                     * 选择哪一个消息队列?返回一个队列即可
                     */
                    int result=j%4;
                   return list.get(result);
                }
            },null);
        }
    }

}

顺序消息消费者

public class RedisOrderClient {


    public static void main(String[] args) throws Exception{

        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("QWE");

        consumer.setNamesrvAddr("192.168.23.129:9876");

        consumer.subscribe("topic","*");

        consumer.registerMessageListener(new MessageListenerOrderly() {
            @Override
            public ConsumeOrderlyStatus consumeMessage(List<MessageExt> list, ConsumeOrderlyContext consumeOrderlyContext) {
                for (MessageExt messageExt : list) {

                    System.out.println(Thread.currentThread().getName()+"---"+new String(messageExt.getBody()));
                }
                return ConsumeOrderlyStatus.SUCCESS;

            }
        });

        consumer.start();


    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值