rocketmq的发送方法

来源:互联网 发布:福昕pdf软件套装 编辑:程序博客网 时间:2024/06/05 03:10
package com.eigpay.common.msg.client.ordermessage;import com.alibaba.rocketmq.client.exception.MQBrokerException;import com.alibaba.rocketmq.client.exception.MQClientException;import com.alibaba.rocketmq.client.producer.DefaultMQProducer;import com.alibaba.rocketmq.client.producer.MessageQueueSelector;import com.alibaba.rocketmq.client.producer.SendResult;import com.alibaba.rocketmq.common.message.Message;import com.alibaba.rocketmq.common.message.MessageQueue;import com.alibaba.rocketmq.remoting.exception.RemotingException;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.util.List;/*** Producer,发送顺序消息*/public class OrderProducer extends DefaultMQProducer{private final Logger logger = LoggerFactory.getLogger(OrderProducer.class);/*** 初始化启动方法*/public void init(){try{this.start();logger.info(new StringBuilder().append(getNamesrvAddr()).append(":").append(getProducerGroup()).append(" start success!").toString());}catch(Exception e){logger.error(e.getMessage(),e);}}/*** 关闭方法*/public void stop(){this.shutdown();logger.info(new StringBuilder().append(getNamesrvAddr()).append(":").append(":").append(getProducerGroup()).append(" shutdown success!").toString());}/*** 发送顺序消息* @param topic* 标识* @param tags* 消息子类型标识* @param key* 业务层面的唯一标识码,尽量保持唯一,可null* @param body* 二进制形式,序列化由应用决定,Producer与Consumer要协商好序列化形式* @param orderId* 队列,相同的值的消息会放到同一个队列* @return *SEND_OK:消息发送成功*FLUSH_DISK_TIMEOUT:消息发送成功,但是服务器刷盘超时,消息已经进入服务器队列,只有此时服务器宕机,消息才会丢失*FLUSH_SLAVE_TIMEOUT:消息发送成功,但是服务器同步到 Slave 时超时,消息已经进入服务器队列,只有此时服务器宕机,消息才会丢失*SLAVE_NOT_AVAILABLE:消息发送成功,但是此时 slave 不可用,消息已经进入服务器队列,只有此时服务器宕机,消息才会丢失。对于精确发送顺序消息的应用,由于顺序消息的局限性,可能会涉及到主备自动切换问题,所以如果sendresult 中的 status 字段不等于 SEND_OK,就应该尝试重试。对于其他应用,则没有必要这样* */public SendResult send(String topic,String tags,String keys,byte[] body,Object orderId){SendResult sendResult = null;try {logger.info(new StringBuilder().append("发送顺序消息==detail:").append("topic=").append(topic).append(" tags=").append(tags).append(" keys=").append(keys==null?"":keys).append(" body=").append(body).toString());Message msg = new Message(topic, tags, keys,body);sendResult = this.send(msg, new MessageQueueSelector() {@Overridepublic MessageQueue select(List<MessageQueue> mqs, Message msg, Object arg) {Integer id = (Integer) arg;int index = id % mqs.size();return mqs.get(index);}}, orderId);} catch (MQClientException e) {logger.error(e.getMessage(),e);} catch (RemotingException e) {logger.error(e.getMessage(),e);} catch (MQBrokerException e) {logger.error(e.getMessage(),e);} catch (InterruptedException e) {logger.error(e.getMessage(),e);}return sendResult;}}
指定发送方发送到哪个queue中的参数为orderId,相同的值会放到一个queue中,一组消息指定的orderId相同可以放到同一个queue中,便于顺序消费,消费方需要实现顺序消费的类
阅读全文
0 0