学习笔记(二) 消息队列

学习了新的知识,记录一下,以下均为个人理解。

消息队列

我们为什么要使用消息队列,消息队列有什么好处呢?

在现实生活中,一个操作往往会引起系统的一系列反应,但这些反应有的可能并不是我需要去关心的核心操作。以在PS商店购买游戏为例子,在确认支付账户扣款成功之后,电子邮箱还会收到一封邮件提示你的账号刚刚购买了某个游戏。发送邮件的时间有长有短,甚至可能发送失败,但是我购买这个游戏的操作并不会收到它的影响,我只要付款成功之后就能下载游戏开始玩。

这其实就是消息队列适用的一个例子,消息队列将生产者传输过来的消息保存在了队列中,消费者在需要的时候拿到这个消息并开始处理。消息队列将生产者和消费者解耦,并且什么时候处理消息可以由消费者自己决定,而不一定是强制的要求它必须在什么对消息进行处理。


消息队列的适用场景

  • 应用耦合

多个应用之间可以通过消息队列对同一消息进行处理,各自只关注自己的核心业务而不必去等待和关心其他人的操作和结果,避免了因某一个业务失败而导致全部业务失败的局面。

  • 限流

当多个消息同时到达的时候,消息队列能够将这些消息暂存下来作为缓冲,避免了大量的消息进入处理系统导致系统瘫痪。并且消息队列还能够设置队列的长度,当多余的消息到达时将其丢弃。

  • 广播

一个生产者可以拥有多个消费者,当一个消息被放到消息队列当中时,订阅者们都可以拿到这个消息,各自做各自的事情,彼此之间相互独立而不是由某个程序统一控制。


实例分析

这次使用的实时数据总线就是一个消息队列,在例子当中,启动时新建一个线程让发送方向总线发送消息,这里的write方法即是在向消息队列中添加事件。(这里加入了一个同步监听器来便于观察事件是否被写入总线)

rtdBus.regSyncListener(new RtdListener() {
    @Override
    public void onRtd(String s, Object o) {
        System.out.println("Event received! {tag=" +tag + ", event=" + o + "}");
    }
},new TagPathSelector(rtdbusConfig));
rtdBus.write(tag, "HelloWorld");复制代码

而在接收者里,在启动时同样新建了一个线程让它去读取总线中的事件。并在其中加入了一个异步监听器,当总线上规定的点位集中某一点位有数据写入时,则执行监听器中规定的操作,接收规定点位的数据。

public void run() {
    bus.regAsyncListener(new RtdListener() {
        @Override
        public void onRtd(String s, Object o) {
           System.out.println("Message:"+bus.read(tag));
        }
    },new TagPathSelector(reconfig));
}复制代码

这样就做到了对消息的写入和实时读取。

当多个数据写入时,则按照时间先后顺序依次读取。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值