多生产者产生的消息可以被同一个消费者消费,也可以被多个消费者消费
单生产者可以也可以被多个消费者消费,默认负载均衡,但是前提是要在一个组当中
下面的这个是同步消息
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();
}
}