1、MQ 主要由四个部分组成
producer consumer broker nameserver
boker为搬运工 nameserver为统一治理服务 producer consumer不必多说了 一个生产者 一个消费者
package com.jason.mq;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.remoting.common.RemotingHelper;
public class SyncProducer {
public static void main(String[] args) throws Exception {
DefaultMQProducer producer =
new DefaultMQProducer("please_rename_unique_group_name");
producer.setNamesrvAddr("127.0.0.1:9876");
producer.start();
for(int i = 0; i < 100; i++) {
/* Message msg = new Message("TopicTest","TagA",
("Hello RockerMQ " + i).getBytes(RemotingHelper.DEFAULT_CHARSET));
SendResult sendResult = producer.send(msg);
System.out.printf("%s%n", sendResult);*/
Message message = new Message();
message.setTopic("TopicTest");
message.putUserProperty(i + "", "hello" + i);
message.setBody((i +"**").getBytes(RemotingHelper.DEFAULT_CHARSET));
SendResult sendResult = producer.send(message);
System.out.println(sendResult);
}
producer.shutdown();
}
}
以上是生产者 产生消息 发送到broker
package com.jason.mq;
import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
import org.apache.rocketmq.common.consumer.ConsumeFromWhere;
import org.apache.rocketmq.common.message.MessageExt;
import org.apache.rocketmq.remoting.common.RemotingHelper;
import java.io.UnsupportedEncodingException;
import java.util.List;
public class SyncConsumer {
public static void main(String[] args) throws Exception {
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("please_rename_to_unique_group_name");
consumer.setNamesrvAddr("127.0.0.1:9876");
consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
consumer.subscribe("TopicTest", "*");
consumer.registerMessageListener(new MessageListenerConcurrently() {
public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> list, ConsumeConcurrentlyContext consumeConcurrentlyContext) {
for (MessageExt msg : list) {
try {
System.out.println("Receive properties: " + msg.getProperties());
System.out.println("Receive body: " + new String(msg.getBody(), RemotingHelper.DEFAULT_CHARSET));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}finally {
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
}
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
});
consumer.start();
}
}
以上为消费者通过push 来进行获取信息
消费者分为 push pull
区别是什么?你们知道么?
push一般用于没有慢消费到情况下(是broker主动push消息过去) pull 一般主动权在消费者哪里(是消费者主动pull信息)
主动push的话,如果消费者消费过慢,那么在broker中会堆积消息过多,所以处理消费快的情况下使用
主动pull的情况下,可以根据具体情况,主动pull自己想要的信息,,这也是它的短板,因为消费方无法准确地决定何时去拉取最新的消息,一直消费,就要一直pull
根据实际情况选择吧。
我个人用push比较多