DefaultMQProducer.send(message, timeout)的消息发送状态sendResult.getSendStatus()

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/guiliguiwang/article/details/52790108

使用DefaultMQProducer.send(message,timeout);可以通过sendResult.getSendStatus()查看发送到RocketMQ的信息是否发送成功,在使用如下代码进行发送信息,并对信息发送是否确认成功,如果不成功进行重新发送时:

public class MQProductor {

    private static final Logger logger = LoggerFactory.getLogger(MQProductor.class);
    private static DefaultMQProducer producer = null;
    private static MQProductor instance = null;

    private MQProductor(){}

    public static MQProductor getInstance(){
        if(instance == null || producer == null){
            synchronized (MQProductor.class){
                if(instance == null){
                    instance = new MQProductor();
                }
                if(producer == null){
                    initProducer();
                }
            }
        }
        return instance;
    }

    private static void initProducer(){
        /**
         * 一个应用创建一个Producer,由应用来维护此对象,可以设置为全局对象或者单例<br>
         * 注意:ProducerGroupName需要由应用来保证唯一<br>
         * ProducerGroup这个概念发送普通的消息时,作用不大,但是发送分布式事务消息时,比较关键,
         * 因为服务器会回查这个Group下的任意一个Producer
         */
        String groupName = ConnServerConfig.getPropValue("MQ_PRODUCER_GROUP_NAME", "liveConnMPhone");
        String addr = ConnServerConfig.getPropValue("MQ_NAMESERVER_ADDR");
        String producerName = ConnServerConfig.getPropValue("MQ_PRODUCTER_NAME");
        producer = new DefaultMQProducer(groupName);
        producer.setNamesrvAddr(addr);
        producer.setInstanceName(producerName);
        /**
         * Producer对象在使用之前必须要调用start初始化,初始化一次即可<br>
         * 注意:切记不可以在每次发送消息时,都调用start方法
         */
        try {
            producer.start();
        } catch (MQClientException e) {
            logger.error("初始化RocketMQ异常,将推出程序" + e.getMessage(), e);
            SystemResourcesClean.closeAllResources();
            System.exit(-1);
        }
    }

    public static void closeProducer(){
        if(producer != null){
            producer.shutdown();
            producer = null;
        }
    }


    public boolean sendMsg(@NotNull String topic, @NotNull String tags, @NotNull String keys, @NotNull String msg) throws UnsupportedEncodingException {
        int count = 0;
        boolean status = false;
        long timeout = Long.parseLong(ConnServerConfig.getPropValue("MQ_SENT_TIMEOUT", "4000"));
        Message message = new Message(topic, tags, keys, msg.getBytes("UTF-8"));
        logger.debug("count:" + count);
        while(count <= 3){
            logger.debug("进入循环");
            try {
                SendResult sendResult = producer.send(message, timeout);
                logger.debug("发送MQ状态:" + sendResult.getSendStatus());
                if(sendResult.getSendStatus() == SendStatus.SEND_OK){
                    status = true;
                    break;
                }
            } catch (InterruptedException e) {
                logger.error("MQ发送消息:" + count + "次失败,请查看一次原因" + e.getMessage(), e);
            } catch (RemotingException e) {
                logger.error("MQ发送消息:" + count + "次失败,请查看一次原因" + e.getMessage(), e);
            } catch (MQClientException e) {
                logger.error("MQ发送消息:" + count + "次失败,请查看一次原因" + e.getMessage(), e);
            } catch (MQBrokerException e) {
                logger.error("MQ发送消息:" + count + "次失败,请查看一次原因" + e.getMessage(), e);
            }finally {
                count++;
            }
        }
        return status;
    }
}


猜你喜欢

转载自blog.csdn.net/guiliguiwang/article/details/52790108