RocketMQ搭配SpringBoot

RocketMQ官网–点击查看
rocketmq-externals
rocketmq-dashboard

启动rocketmq
1.首先启动nameserver

mqnameserver

2.后启动broker

mqbroker -n 127.0.0.1:9876

docker 拉取 镜像

docker pull foxiswho/rocketmq:server-4.3.2 
docker pull foxiswho/rocketmq:broker-4.3.2

启动mqnamesrv

docker run -itdp 9876:9876 --name rmqserver -e "JAVA_OPT_EXT=-server -Xms256m -Xmx256m" -e "JAVA_OPTS=-Duser.home=/opt"  foxiswho/rocketmq:server-4.3.2

启动mqbroker

docker run -itd -p 10911:10911 -p 10909:10909\
 --name rmqbroker --link rmqserver:namesrv\
 -e "NAMESRV_ADDR=namesrv:9876" -e "JAVA_OPTS=-Duser.home=/opt"\
 -e "JAVA_OPT_EXT=-server -Xms128m -Xmx128m"\
 foxiswho/rocketmq:broker-4.3.2

或者使用docker-compose

version: '3.5'
services:
  rmqnamesrv:
    image: foxiswho/rocketmq:server-4.3.2
    container_name: rmqnamesrv
    ports:
      - 9876:9876
    volumes:
      - /home/dockerrocketmq/rmqserver01/logs:/opt/logs
      - /home/dockerrocketmq/rmqserver01/store:/opt/store
     environment:
        JAVA_OPT_EXT: "-server -Xms256m -Xmx256m -Xmn256m"
    networks:
        rmq:
          aliases:
            - rmqnamesrv

  rmqbroker:
    image: foxiswho/rocketmq:broker-4.3.2
    container_name: rmqbroker
    ports:
      - 10909:10909
      - 10911:10911
    volumes:
      - /home/dockerrocketmq/rmqbroker01/logs:/opt/logs
      - /home/dockerrocketmq/rmqbroker01/store:/opt/store
      - /home/dockerrocketmq/rmqbroker01/conf/broker.conf:/etc/rocketmq/broker.conf
    environment:
        NAMESRV_ADDR: "rmqnamesrv:9876"
        JAVA_OPTS: " -Duser.home=/opt"
        JAVA_OPT_EXT: "-server -Xms128m -Xmx128m -Xmn128m"
    command: mqbroker -c /etc/rocketmq/broker.conf
    depends_on:
      - rmqnamesrv
    networks:
      rmq:
        aliases:
          - rmqbroker


networks:
  rmq:
    name: rmq
    driver: bridge

安装时,需注意,安装路径文件名称不能有空格、不能有中文
rocketmq由java编写,需要用到java环境,版本最好是8版本,安装路径也不要有空格

maven依赖

<!-- rocketmq 消息队列 -->
<dependency>
    <groupId>org.apache.rocketmq</groupId>
    <artifactId>rocketmq-spring-boot-starter</artifactId>
    <version>2.2.0</version>
</dependency>

RocketMQ配置springboot的application.yml

rocketmq: 
  nameServer: 192.168.10.37:9876
  # 生产者配置
  producer: 
    group: java

RocketMQTemplate 添加到springboot管理中

@Autowired(required = true)
private RocketMQTemplate rocketMQTemplate;

同步发送生产者

@PostMapping("/convertAndSendMQ")
public Object convertAndSendMQ(@RequestParam(name = "topic") String topic,
								@RequestBody Map map) {
	try {
		//直接添加到生产者里、底层是同步发送
		rocketMQTemplate.convertAndSend(topic,map);
	} catch (Exception e) {
		return false;
	}
	return true;
}


@GetMapping("/syncSendMQ")
public Object syncSendMQ(@RequestParam(name = "topic") String topic,
					@RequestParam(name = "msg") String msg) {
	//同步发送
	try {
		Message<String> message = new Message<String>() {
			@Override
			public String getPayload() {
				return msg;
			}

			@Override
			public MessageHeaders getHeaders() {
				return null;
			}
		};
		rocketMQTemplate.syncSend(topic, message);
	} catch (Exception e) {
		return false;
	}
	return true;
	}

异步发送生产者

@PostMapping("/asyncSendMQ")
public Object asyncSendMQ(@RequestParam(name = "topic") String topic,
						@RequestBody Map map) {
	SendCallback sendCallback = new SendCallback() {
		@Override
		public void onSuccess(SendResult sendResult) {
			System.out.println("发送成功!--->"+sendResult.getSendStatus());
		}
		@Override
		public void onException(Throwable e) {
			System.out.println("发送失败!");
		}
	};
	rocketMQTemplate.asyncSend(topic, map, sendCallback );
	return null;
}

消息消费者

@Component
@RocketMQMessageListener(consumerGroup = "java", topic = "topic-map")
private class RocketMQConsumenMap implements RocketMQListener<Map>{
	@Override
	public void onMessage(Map message) {
		if(message instanceof Map) {
			Map map = (Map)message;
			map.entrySet().forEach(i ->{
				System.out.println("Tom要消费了"+i);
			});
		}
	}
}

RocketMQ事务消息

    //生产者
    @PostMapping("/transactionMQ")
	@Transactional
	public TransactionSendResult transactionMQ(@RequestParam(name = "topic") String topic,
								@RequestBody Map map) {
		Message<?> mes = MessageBuilder.withPayload(map).build();
		TransactionSendResult sendMessageInTransaction = rocketMQTemplate.sendMessageInTransaction(topic, mes , map );
		LocalTransactionState localTransactionState = sendMessageInTransaction.getLocalTransactionState();
		if (!localTransactionState.equals("ROLLBACK_MESSAGE")) {
			Users users = JSONObject.parseObject(JSONObject.toJSONString(map), Users.class);
			users.setsId(UUID.randomUUID().toString());
			users.setsSex("3");
			usersService.save(users);
		};
		System.out.println(localTransactionState);
		return  sendMessageInTransaction;
	}

增加事务监听器

//监听器
@Component
@RocketMQTransactionListener(rocketMQTemplateBeanName = "rocketMQTemplate")
public class RocketMQTransaction implements RocketMQLocalTransactionListener {
	private ConcurrentHashMap map = new ConcurrentHashMap();

	/**
	 * 生产者发送消息,执行本地事务
	 */
	@Override
	public RocketMQLocalTransactionState executeLocalTransaction(Message msg, Object arg) {
       System.out.println("msg:  "+msg);
       System.out.println("arg:  "+arg);
		map.put(msg, arg);
		if(arg instanceof Map) {
			Map map = (Map)arg;
			String age = (String)map.get("sAge");
			if(StringUtils.isNotEmpty(age) && age.equals("3")) {
				return RocketMQLocalTransactionState.ROLLBACK;
			}
			if(StringUtils.isNotEmpty(age) && age.equals("2")) {
				return RocketMQLocalTransactionState.COMMIT;
			}
		}
		return RocketMQLocalTransactionState.UNKNOWN;
	}

	/**
	 * 检查本地事务
	 */
	@Override
	public RocketMQLocalTransactionState checkLocalTransaction(Message msg) {
		map.forEach((Object t, Object u) -> {System.out.println(t+" - "+u);});
		return RocketMQLocalTransactionState.COMMIT;
	}

}

消费者 如果消费者第一次消费不到或消费异常,broker会一直重试,默认15次

//消费者
@Component
@RocketMQMessageListener(consumerGroup = "java", topic = "topic-map")
public class RocketMQConsumen implements RocketMQListener<Map> {

	@Autowired
	private UsersService usersService;
	
	@Override
	@Transactional
	public void onMessage(Map message) {
		if(message instanceof Map) {
			Map map = (Map)message;
			map.entrySet().forEach(i ->{
				System.out.println("Tom要消费了"+i);
			});
			Users users = JSONObject.parseObject(JSONObject.toJSONString(map), Users.class);
			users.setsId(UUID.randomUUID().toString());
			usersService.save(users);
			String age = (String)map.get("sAge");
			//模拟事务异常
			if(StringUtils.isNotEmpty(age) && age.equals("4")) {
				int error = 10 / 0;
			}
		}
	}

}

顺序消息 – 生产者

@GetMapping("/getuuid")
    public String getuuid(){
        String uuid = UUID.randomUUID().toString().replace("-", "");
        Message<String> message1 = MessageBuilder.withPayload(uuid).build();
        //order:phone 其中order是topic ,phone是tag
        rocketMQTemplate.syncSendOrderly("order:phone",message1,uuid);
        return uuid;
    }

顺序消息 – 消费者

@Component
@RocketMQMessageListener(consumerGroup = "monitor",
						topic = "order",
						selectorType = SelectorType.TAG,
						selectorExpression = "phone",
						consumeMode = ConsumeMode.ORDERLY)
public class RocketMQConsumen implements RocketMQListener<String> {
    @Override
    public void onMessage(String message) {
        System.out.println(message);
    }
}

延迟消息–生产者

// messageDelayLevel=1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h
// 默认18个等级
@GetMapping("/getuuid")
public String getuuid(){
    String uuid = UUID.randomUUID().toString().replace("-", "");
    Message<String> message1 = MessageBuilder.withPayload(uuid).build();
    rocketMQTemplate.syncSend("order:phone",message1,30*1000,3);
    return uuid;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值