rocketmq的发送方法

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() {
@Override
public 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中,便于顺序消费,消费方需要实现顺序消费的类
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值