JMQ

京东内部有专门负责发送消息和接收消息的中间件JMQ。

消息中间件,功能目标都是相同的,2个系统之间解耦,通过异步消息的方式,完成信息同步。比如,常见的本地事务+消息队列,间接实现分布式事务,保证最终的数据一致性。

 

以开发业务为目标的话,开发者更加侧重技术的使用。

技术越简单,上手越快,才更能普及推广。

 

一、消息的生产者

1、定义消息的传输通道

<jmq:transport id="cavJmqTransport" address="${jmq.cavTransportAddress}"

user="${jmq.cavTransportUser}" password="${jmq.cavTransportPassword}" app="${jmq.cavTransportApp}" />

 

2、定义消息的发送者

<jmq:producer id="messageProducer" retryTimes="${jmq.cavTransportRetryTimes}" transport="cavJmqTransport" />

 

3、业务代码

把中间件封装的消息生产者messageProducer注入到service中,

构造1个消息体Message对象(主题、内容、业务id),发送完事。

只要调用方法成功,消息就进入到了消息服务的后台,消息服务保证“消息必达”。

如果接收方出了故障,消息服务自己负责重发。

@Service

public class BlacklistServiceJmq {

private Logger logger = Logger.getLogger(getClass());

@Resource

private MessageProducer messageProducer;

private String topic="cav_blacklist";

public void sync(BlacklistBeanJmq blacklistBeanJmq) throws JMQException {

logger.info("Send blacklist by jmq,start");

String text = JSONObject.toJSONString(blacklistBeanJmq);

Message message = new Message(topic, text , blacklistBeanJmq.getId()+"");

messageProducer.send(message);

logger.info("Send blacklist by jmq,end");

}

}

4、属性文件

jmq.properties

#dev

jmq.cavTransportApp=Ca016

jmq.cavTransportAddress=192.168.8.8:8888

jmq.cavTransportUser=jmq

jmq.cavTransportPassword=jmq

jmq.cavTransportRetryTimes=3

 

 

二、消息的消费者

1、定义消息的传输通道

<jmq:transport id="cavJmqTransport" address="${jmq.cavTransportAddress}"

user="${jmq.cavTransportUser}" password="${jmq.cavTransportPassword}" app="${jmq.cavTransportApp}" />

 

2、定义消息的接收者和关注的主题Topic

<jmq:consumer id="messageConsumer" transport="cavJmqTransport">

<jmq:listener topic="cav_blacklist" listener="cavBlacklistMessageListener" />

</jmq:consumer>

 

<bean id="cavBlacklistMessageListener" class="com.jd.cav.jmq.BlacklistMessageListenerDemo" />

3、业务代码

消息服务的客户端,从消息服务远程服务端,不断拉去消息,然后把消息传给咱们的业务监听器,每个业务负责自己的业务逻辑代码。

public class BlacklistMessageListenerDemo implements MessageListener{

private Logger logger = Logger.getLogger(getClass());

@Override

public void onMessage(List<Message> messages) throws Exception {

if(CollectionUtils.isEmpty(messages)){

return;

}

for(Message message:messages){

handleBlacklistMessage(message);

}

}

 

private void handleBlacklistMessage(Message message) {

String text=message.getText();

BlacklistBeanJmq blacklistBeanJmq=JSONObject.parseObject(text, BlacklistBeanJmq.class);

System.out.println(blacklistBeanJmq);

}

}

4、属性配置

jmq.cavAppointmentApp=cavappointment

jmq.cavAppointmentTransportAddress=192.168.6.40:66666

jmq.cavAppointmentUser=cavappointment

jmq.cavAppointmentPassword=6DFB7254

 

特别需要说明的是,生产者的App名称、账号和密码,与消费者的都是不同的。

因为,生产者是固定的1个,而消费者可以有很多个。

不同的消费者,是否需要接入、接入之后什么时候关闭,都是它自己输了算。

另外,消息服务的IP地址通常是一样的。

 

三、用户的后台管理

申请消息服务主题、账号、密码。

查看消息历史记录、生产者监控、消费者监控等。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值