RocketMQ 使用案例

本文介绍了一个基于RocketMQ的同步生产者实现案例,通过Java代码展示了如何进行消息队列的初始化、消息发送及资源释放等操作。适用于希望了解RocketMQ同步消息发送机制的开发者。
package com.anve.coupon.basic.rocketmq;

import com.anve.coupon.basic.logic.ConfigLogic;
import com.anve.coupon.domain.constant.Constans;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * linggan on 2017/12/20
 */
@Service
public class SyncProducer {

    private static final Logger logger = LogManager.getLogger(SyncProducer.class);
    private DefaultMQProducer producer;

    @Autowired
    ConfigLogic configLogic;

    /**
     * 初始化mq
     */
    private void init() {
        try {
            //组名称
            String groupName = Constans.COUPON_UPDATE_ORDER_GROUPNAME;
            //mq地址
            String ipAddress = configLogic.getKey(ConfigLogic.ROCKETMQ_IP);
            //实例化一个生产者组名称。
            producer = new DefaultMQProducer(groupName);
            producer.setNamesrvAddr(ipAddress);
            producer.start();
            logger.debug("Method[initMq]初始化mq成功:生产者组名称:{},mq地址:{}", groupName, ipAddress);
        } catch (MQClientException e) {
            logger.error("Method[initMq]初始化mq异常:{}", e.getMessage(), e);
        }
    }


    /**
     * 批量放消息
     *
     * @param data
     * @return
     */
    public boolean push(List<String> data) {
        if (CollectionUtils.isEmpty(data)) {
            return false;
        }
        for (String message : data) {
            push(Constans.COUPON_UPDATE_ORDER_TOPIC, Constans.COUPON_UPDATE_ORDER_TAG, message);
        }
        return true;
    }


    /**
     * 放消息
     *
     * @param topic
     * @param tag
     * @param body
     * @return
     */
    public boolean push(String topic, String tag, String body) {
        if (StringUtils.isEmpty(topic) || StringUtils.isEmpty(tag) || StringUtils.isEmpty(body)) {
            logger.debug("Method[push]topic,tag,body参数有空,topic:{},tag:{},body:{}", topic, tag, body);
            return false;
        }
        try {
            Message msg = new Message(topic, tag, (body).getBytes());
            SendResult sendResult = producer.send(msg);
            logger.debug("Method[push]Mq放消息结果;{}", sendResult);
        } catch (Exception e) {
            logger.debug("Method[push]放消息异常,topic:{},tag:{},body:{},错误信息:{}", topic, tag, body, e.getMessage(), e);
        }
        return true;
    }


    /**
     * 一旦生产者实例不再使用,就关闭它。
     */
    public void shutdown() {
        producer.shutdown();
        logger.debug("Method[shutdown]Mq生产者实例销毁");
    }


<!--recketmq初始化-->
<bean id="syncProducer" class="com.anve.coupon.basic.rocketmq.SyncProducer"
      scope="singleton" init-method="init" destroy-method="shutdown">
</bean>
}

本列子参照官网写法,官网有批量放消息的方法,使用好像没用,欢迎交流
RocketMQ 是阿里巴巴开源的一个分布式消息中间件,MessageExt 是 RocketMQ 中的消息实体类,它是实际传递的数据结构。在 Java 中,你可以使用 `MessageExt` 来构建、发送和接收消息。 以下是一个简单的使用案例: ```java import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer; import org.apache.rocketmq.client.exception.MQClientException; import org.apache.rocketmq.common.message.Message; import org.apache.rocketmq.remoting.exception.RemotingException; public class RocketMQConsumerExample { private static final String GROUP_ID = "your_group_id"; private static final String QUEUE_NAME = "your_queue_name"; public static void main(String[] args) { DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(GROUP_ID); try { // 设置消费者属性 consumer.setNamesrvAddr("localhost:9876"); // RocketMQ broker地址 consumer.subscribe(QUEUE_NAME, "*"); // 订阅主题 // 开始消费 consumer.start(); while (true) { Message msg = consumer.pull(); // 拉取消息 if (msg != null) { System.out.printf("Received message from topic %s: %s%n", msg.getTopic(), new String(msg.getBody())); // 处理接收到的消息 consumer.commitOffset(msg); // 提交偏移量,确认已处理 } else { break; // 如果没有新消息,退出循环 } } } catch (MQClientException | RemotingException e) { e.printStackTrace(); } finally { consumer.shutdown(); // 关闭消费者 } } } ``` 在这个例子中,我们创建了一个 `DefaultMQPushConsumer` 实例,设置了服务器地址,订阅了指定的主题,然后开始拉取消息并进行处理。当消息被消费后,我们会提交偏移量以表示已经处理过。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值