RocketMQ java初级使用

import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendCallback;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.client.producer.SendStatus;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.remoting.exception.RemotingException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
* @author wp
* 创建时间:2021年3月8日 下午3:01:35
* 项目名称:smart_reception
* @version 1.0
* @since JDK 1.8
* 文件名称:RocketMQPubService.java
* 类说明:RocketMQ指令发送器
*/
public class RocketMQPubService {
	private static Logger log = LoggerFactory.getLogger(RocketMQPubService.class);
	
	//host port
	private String namesrvAddr = RocketMQPropertiesUtils.getString("rocketmq.namesrvAddr");
	//生成者组名
	private String producerGroupName = RocketMQPropertiesUtils.getString("rocketmq.producerGroupName");
	private DefaultMQProducer producer;
	
	
	private static RocketMQPubService service;
	
	
	private RocketMQPubService(){
		init();
	}
	
	
	public static RocketMQPubService getInstance(){
		if (service == null){
			service = new RocketMQPubService();
		}
		return service;
	}
	
	
	/**
	 * 初始化实例
	 * @author wp
	 * <p>Title: init</p>
	 * <p>Description: </p>
	 * 创建时间:2021年3月12日 上午9:11:16
	 */
	private void init(){
		try {
			producer = new DefaultMQProducer(producerGroupName);
			//设置重试次数(默认2次)
	        producer.setRetryTimesWhenSendFailed(10);
	        //绑定name server
			producer.setNamesrvAddr(namesrvAddr);
			//发送超时时间,默认3000 单位ms
			producer.setSendMsgTimeout(5000);
			producer.start();
		} catch (MQClientException e) {
			e.printStackTrace();
		}
	}
	
	
	/**
	 * 发送信息
	 * @author wp
	 * <p>Title: sendMessage</p>
	 * <p>Description: </p>
	 * @param msg
	 * @return
	 * 创建时间:2021年3月12日 上午9:11:09
	 */
	public Boolean sendMessage(Message msg){
		SendResult send;
		try {
			send = producer.send(msg);
			if (send.getSendStatus().equals(SendStatus.SEND_OK)) {
				log.info("信息发送成功!");
				return true;
			}else {
				//发送失败处理
//				init();
//				producer.send(msg);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
        return null;
	}
	public Boolean sendMessage1(Message message) {
		
		try {
			// 2.2 异步发送消息
			producer.send(message, new SendCallback() {
				// rabbitmq急速入门的实战: 可靠性消息投递
				@Override
				public void onSuccess(SendResult sendResult) {
					System.err.println("msgId: " + sendResult.getMsgId() + ", status: " + sendResult.getSendStatus());
				}

				@Override
				public void onException(Throwable e) {
					e.printStackTrace();
					System.err.println("------发送失败");
				}
			});
		} catch (Exception e) {
			// TODO: handle exception
		}
		
		return null;
	}
	
}

package com.cetcnav.GR.rocketMQ;

import java.util.List;

import org.apache.rocketmq.client.consumer.DefaultLitePullConsumer;
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.common.protocol.heartbeat.MessageModel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.cetcnav.GR.rocketMQ.worker.ListenerServiceWorkerInf;

import org.apache.rocketmq.client.exception.MQClientException;

import cn.hutool.core.collection.CollUtil;

/**
 * @author wp
 * @date 2021年6月3日下午8:00:42
 * @projectName GRDatacenter
 * @fileName RocketMQReceiveThread.java
 * @tags 类说明:接收rocketmq信息
 */
public class RocketMQReceiveThread extends Thread {
	private static Logger log = LoggerFactory.getLogger(RocketMQReceiveThread.class);

	// host port
	private String namesrvAddr = RocketMQPropertiesUtils.getString("rocketmq.namesrvAddr");
	// 指定消费者订阅的主题和标签
	private final String consumerProupName;
	private final String topic;
	private final String tag;
	private final ListenerServiceWorkerInf worker;
	private DefaultMQPushConsumer consumer;

	/**
	 * 
	 * @param consumerProupName
	 *            消费组名
	 * @param topic
	 * @param tag
	 * @param worker
	 */
	public RocketMQReceiveThread(String consumerProupName, String topic, String tag, ListenerServiceWorkerInf worker) {
		super();
		this.consumerProupName = consumerProupName;
		this.topic = topic;
		this.tag = tag;
		this.worker = worker;
	}

	/**
	 * push消费者
	 * 
	 * @author wp
	 *         <p>
	 * 		Title: push</p>
	 *         <p>
	 * 		Description: </p>
	 * @throws Exception
	 *             创建时间:2021年3月8日 下午4:40:41
	 */
	public void run() {
		try {
			// 1 创建消费者,指定所属的消费者组名
			consumer = new DefaultMQPushConsumer(consumerProupName);
			// 2 指定NameServer的地址
			consumer.setNamesrvAddr(namesrvAddr);
			// 3 指定消费者订阅的主题和标签 订阅topic和 tags( * 代表所有标签)下信息
			consumer.subscribe(topic, tag);
			// 一个GroupName第一次消费时的位置
			consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_LAST_OFFSET);
			consumer.setConsumeThreadMin(20);
			consumer.setConsumeThreadMax(20);
			// 一次最大消费的条数
			consumer.setConsumeMessageBatchMaxSize(10);
			// 消费模式,广播或者集群,默认集群。
			consumer.setMessageModel(MessageModel.CLUSTERING);
			// 在同一jvm中 需要启动两个同一GroupName的情况需要这个参数不一样。
			consumer.setInstanceName("deflate");

			consumer.registerMessageListener(new MessageListenerConcurrently() {
				@Override
				public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs,
						ConsumeConcurrentlyContext context) {
					worker.handle(msgs);
					log.info("%s Receive New Messages: %s %n", Thread.currentThread().getName(), msgs);
					return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
				}
			});
			consumer.start();
			log.info("Consumer Started.");
		} catch (MQClientException e) {
			e.printStackTrace();
		}
	}

private DefaultLitePullConsumer defaultLitePullConsumer;
	private static boolean runFlag = true;

	/**
	 * pull消费者
	 * 
	 * @author wp
	 *         <p>
	 * 		Title: pull</p>
	 *         <p>
	 * 		Description: </p> 创建时间:2021年3月8日 下午6:34:39
	 * @throws Exception
	 */
	public void pull() throws Exception {
		// 1 创建消费者,指定所属的消费者组名
		defaultLitePullConsumer = new DefaultLitePullConsumer(consumerProupName);
		// 2 指定NameServer的地址
		defaultLitePullConsumer.setNamesrvAddr(namesrvAddr);
		// 3 指定消费者订阅的主题和标签
		defaultLitePullConsumer.subscribe(topic, tag);
		// 一次最大消费的条数
		defaultLitePullConsumer.setPullBatchSize(100);

		defaultLitePullConsumer.start();
		while (runFlag) {
			try {
				// 拉取消息,无消息时会阻塞
				List<MessageExt> msgs = defaultLitePullConsumer.poll();
				if (CollUtil.isEmpty(msgs)) {
					continue;
				}
				// 业务处理
				worker.handle(msgs);
				/*
				 * msgs.forEach(msg-> log.info(new String(msg.getBody())) );
				 */
				// 同步消费位置。不执行该方法,应用重启会存在重复消费。
				defaultLitePullConsumer.commitSync();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		defaultLitePullConsumer.shutdown();
	}

}

import com.cetcnav.GR.rocketMQ.RocketMQReceiveThread;
import com.cetcnav.GR.rocketMQ.worker.ReceiveCommandWorker;

/**
 * 
 * @author wp
 * 2021年4月14日上午8:58:34
 * smartReceptionWS
 * DataListener.java
 * 类说明:
 */
public class DataListener {
	
	private static DataListener listener;
	
	public static DataListener getInstance(){
		if (listener == null){
			listener = new DataListener();
		}
		return listener;
	}

	
	/**
	 * 数据接收  预处处理
	 * @author wp 
	 * 2021年4月14日上午8:58:55
	 * @return void
	 */
	public void handle(){
		
		//接收处理前端传过来的指令信息
		ReceiveCommandWorker worker = new ReceiveCommandWorker();
		new RocketMQReceiveThread("command2datacenter", "command2datacenter", "*", worker).start();
	}
	
}

package com.cetcnav.GR.rocketMQ.worker;

import java.util.List;

import org.apache.rocketmq.common.message.MessageExt;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.cetcnav.GR.base.utils.ByteConvertUtil;
import com.cetcnav.GR.business.cache.TCPChannelManager;

/**
 * @author wp
 * 2021年5月7日下午4:54:52
 * GRDatacenter
 * ReceiveCommandWorker.java
 * 类说明:
 */
public class ReceiveCommandWorker extends ListenerServiceWorkerInf{
	private static Logger log = LoggerFactory.getLogger(ReceiveCommandWorker.class);

	@Override
	public void work(List<MessageExt> msgs) {
		if (msgs != null & msgs.size() != 0){
			log.info("接收到下发指令信息!");
			for (MessageExt msg : msgs){
				byte[] bytes = msg.getBody();
				log.info("接收到下发指令数据帧:"+ByteConvertUtil.bytes2HexString(bytes));
				TCPChannelManager.sendMessage(bytes);
				
			}
			
			
		}
		
	}

}

package com.cetcnav.GR.rocketMQ.worker;

import java.util.List;

import org.apache.rocketmq.common.message.MessageExt;

/**
 * 不同的服务之间的信息通信
 * @author Administrator
 *
 */
public abstract class ListenerServiceWorkerInf {
	
	public abstract void work(List<MessageExt> msgs);
	
	public void handle(List<MessageExt> msgs){
		this.work(msgs);
	}
}

发送:



import org.apache.rocketmq.common.message.Message;

import com.cetcnav.GR.business.cache.Datacenter2websocketCache;
import com.cetcnav.GR.rocketMQ.RocketMQPubService;

/**
 * @author wp
 * 2021年4月28日下午7:36:32
 * GRDatacenter
 * Datacenter2websocketWorker.java
 * 类说明:向websocket推送信息
 */
public class Datacenter2websocketWorker implements Runnable{

	@Override
	public void run() {
		while (true){
		//Message msg = new Message("datacenter2websocket",bytes);
			Message msg = Datacenter2websocketCache.take();
			RocketMQPubService.getInstance().sendMessage(msg);
		}
	}

	
	
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值