PS:我這里使用的是自定義的RoketMQ進(jìn)行消息的發(fā)送和消費(fèi)的,原理都差不多,萬變不離其宗。
創(chuàng)建配置文件類
-
首先創(chuàng)建RocketMqConfig、RocketMqProducerConfig、RocketMqConsumerConfig類,里面包含RocketMQ所需的所有配置,等到創(chuàng)建Consumer和Producer的時候可以一鍵配置,文中所有代碼塊均省略getter\setter方法
public class RocketMqConfig { private String namesrvAddr = "127.0.0.1:9876"; private RocketMqProducerConfig producerConfig = new RocketMqProducerConfig(); private RocketMqConsumerConfig consumerConfig = new RocketMqConsumerConfig(); }
public class RocketMqProducerConfig { private String groupName = "producer"; private String instanceName = "producer_instance"; private String topic = "topic"; }
public class RocketMqConsumerConfig { //組名 private String groupName = "consumer"; //實(shí)例名 private String instanceName = "consumer_instance"; // 訂閱主題和標(biāo)簽Map private Map<String, String> subscriptions = new HashMap<>(); //設(shè)置批量消費(fèi),以提升消費(fèi)吞吐量,默認(rèn)是1 private int consumeMessageBatchMaxSize = 1; }
創(chuàng)建Consumer和Producer
-
創(chuàng)建RocketMqProducer、RocketMqConsumer類,里面包括構(gòu)造方法(有參、無參)、start、stop等方法
public class RocketMqProducer implements MqProducer { private DefaultMQProducer producer; private RocketMqConfig config; private boolean isStarted = false; public RocketMqProducer(RocketMqConfig config) { this.config = config; producer = new DefaultMQProducer(config.getProducerConfig().getGroupName()); producer.setInstanceName(config.getProducerConfig().getInstanceName()); producer.setVipChannelEnabled(false); producer.setNamesrvAddr(config.getNamesrvAddr()); } public boolean isStarted() { return isStarted; } public void start() { producer.start(); isStarted = true; } public void stop() { producer.shutdown(); isStarted = false; } public MqSendResult send(String tag, AbstractMessage t) { t.setTopic(config.getProducerConfig().getTopic()); t.setTag(tag); Message msg = new Message(t.getTopic(), t.getTag(), t.getKey(), t.getMessageType().getType(), t.getBody(), true); SendResult sendResult = producer.send(msg); t.setMessageId(sendResult.getMsgId()); // 返回結(jié)果 MqSendResult mqSendResult = new MqSendResult(); mqSendResult.setSuccess(true); mqSendResult.setCode(sendResult.getSendStatus().toString()); mqSendResult.setMsgId(sendResult.getMsgId()); return mqSendResult; } }
public class RocketMqConsumer implements MqConsumer { private MqMessageHandler handler = null; private DefaultMQPushConsumer consumer; private RocketMqConfig config; private boolean isStarted = false; public RocketMqConsumer(RocketMqConfig config) { this.config = config; consumer = new DefaultMQPushConsumer(config.getConsumerConfig().getGroupName()); consumer.setInstanceName(config.getConsumerConfig().getInstanceName()); consumer.setVipChannelEnabled(false); consumer.setConsumeMessageBatchMaxSize(config.getConsumerConfig().getConsumeMessageBatchMaxSize()); consumer.setNamesrvAddr(config.getNamesrvAddr()); // 從隊(duì)列頭開始消費(fèi) consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET); } @Override public boolean isStarted() { return isStarted; } @Override public void start() { consumer.registerMessageListener(new MessageListenerConcurrently() { @Override public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext Context) { for (MessageExt msg : msgs) { System.out.println(msg.getbody()); } if (handler != null) { handler.handle(t); } return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; } }); try { for(Entry<String, String> sub : config.getConsumerConfig().getSubscriptions().entrySet()) { consumer.subscribe(sub.getKey(), sub.getValue()); } consumer.start(); isStarted = true; } catch (Exception ex) { isStarted = false; throw new Exception(MqLibConstants.LIB_MQ_ROCKETMQ, MqLibExceptionEnum.MQ_CLIENT_EXCEPTION, ex); } } @Override public void stop() { for(Entry<String, String> sub : config.getConsumerConfig().getSubscriptions().entrySet()) { consumer.unsubscribe(sub.getKey()); } consumer.shutdown(); isStarted = false; } @Override public void setHandler(MqMessageHandler handler){ this.handler = handler; } }
消息發(fā)送與消費(fèi)
-
創(chuàng)建Producer類,在其中創(chuàng)建RocketMqConfig、RocketMqProducer對象;
public class Producer { public static void main(String[] args) { RocketMqConfig config = new RocketMqConfig(); MqProducerClient producer = new MqProducerClient(config); producer.start();//啟動生產(chǎn)者 JsonMessage jsonMessage = new JsonMessage();//自定義消息類 jsonMessage.setData("JsonMessage!"); producer.send("json", jsonMessage); } }
-
創(chuàng)建Consumer類,在其中創(chuàng)建RocketMqConfig、RocketMqConsumer對象;
public class Consumer { public static void main(String[] args) { RocketMqConfig config = new RocketMqConfig(); Map<String,String> map = new HashMap(); map.put(config.getProducerConfig().getTopic(),"json"); config.getConsumerConfig().setSubscriptions(map); MqConsumerClient consumer = new MqConsumerClient(config); consumer.start(); } }
啟動兩個類,同時別忘了啟動RocketMQ的服務(wù)。可以在RocketMQ可視化界面看到生產(chǎn)者、消費(fèi)者以及消息等信息