1.消息发布者声明

我们以spring的方式来声明一个消息发布者:

<bean id="operateLogsMessageManager" class="com.taobao.hsf.notify.client.NotifyManagerBean" init-method="init">
<property name="name" value="ECRM-OPERATE_LOGS-NOTIFY" />
<property name="description" value="ECRM-OPERATE_LOGS-NOTIFY" />
<property name="publishTopics">
<list>
<value>OPERATE-LOGS</value>
</list>
</property>
<property name="groupId" value="P-ECRM-OPERATE_LOGS-NOTIFY" />
<property name="messageListener" ref="messageListener" />
<property name="checkMessageListener" ref="checkMessageListener" />
</bean>
  • 消息发送者与订阅者都是NotifyManagerBean实例,发布者只关注topic和group
  • group信息在发送者和订阅者之间是唯一的。
  • messageListener 和 checkMessageListener 对于发送者来说不是必须的。
  • 消息类型对于发送者来说是可以支持多种的。

2.消息订阅者实例化

消息发布者实例化的流程与订阅者类似,由于 publisher 中的 bindingCollector 为空,所以接下来不会有任何操作。同样的,resetPublisherTopics() 方法是为 publisher 量身定做的,publisher 会与 notify server 建立连接,记录下配置好的topic。

3.消息的发送与事务管理

消息发送基本流程

  1. 同步发送非事务消息:消息在发送未返回之前同步等待。
  2. 同步发送事务消息:发送消息未返回之前同步等待, NotifyManagerBean需要注册事务回调监听,CheckMessageListener, 支持事件回顾或提交,消息在未提交之前不会发给订阅者。
  3. 异步发送非事务消息:消息发送后无需同步等待。
  4. 异步发送事务消息:消息发送后无须同步等待,消息发送后支持消息的回滚戒提交,消息为提交之前不会发给订阅者。
  5. 使用可靠异步发送非事务消息:消息发送后暂时存在本地,由后台 线程从本地发给Notify服务器,Notify挂掉戒者网络不通都不会影响发 送端,Notify戒者网络恢复后消息会重试发给Notify服务器。
  6. 可靠异步发送事务消息:消息发送后暂时存在本地,Notify服务器 挂掉戒者网络暂时不通都不会影响消息的发送,消息发送支持事务提 交戒者回滚,消息为提交之前不会发给订阅者。

事务消息的基本流程

当业务处理超时,对于这种half消息的处理方式如下:server 是定时扫描 half 消息,如果长时间没有接收到 commit/rollback,那么 server 会主动向 publisher 发送一条 check 消息,让 publisher 告诉它该怎么处理。publisher 应该注册一个 CheckMessageListener 来接收 server 发送过来的 check 消息,

SendResult包含了消息的发送状态,同时也包含了业务执行的结果 在model属性中。

题外话:

基于回调函数实现业务A和业务B的同步调用

参考示例:https://github.com/zhulongchao/ali.git

push类型消息中间件-消息发布者(二)的更多相关文章

  1. push类型消息中间件-消息订阅者(一)

    1.订阅者的声明方式 我们以spring组件化的方式,声明一个消息订阅者,对于消息订阅者关心的主要有: topic: 一级消息类型(又名消息主题).如TRADE 消息类型:二级消息类型,区别同一Top ...

  2. pull类型消息中间件-消息发布者(一)

    消息集群架构 对于发送方来说的关键几要素 topic 消息的主题,由用户定义.类似于知乎的话题,Producer发送消息的时候需要指定发送到某一个topic下面,Consumer从某一个topic下面 ...

  3. pull类型消息中间件-消息消费者(二)

    消费者的实例化 关于consumer的默认实现,metaq有两种: DefaultMQPullConsumer:由业务方主动拉取消息 DefaultMQPushConsumer:通过业务方注册回调方法 ...

  4. push类型消息中间件-消息服务端(三)

    1.连接管理 网络架构原来是使用是自己开发的网络框架Gecko,Gecko默认为每个网络连接分配64KB的内存,支持1000个网络连接,就需要大概64MB的内存.后来采用Netty重构了网络服务层. ...

  5. pull类型消息中间件-消息服务端(三)

    部署架构 消息存储 存储结构 MetaQ的存储结构是一种物理队列+逻辑队列的结构.如下图所示: Producer生产消息,根据消息的topic选择topic对应某一个分区,然后发送到这个分区对应的Br ...

  6. spring参数类型异常输出(二), SpringMvc参数类型转换错误输出(二)

    spring参数类型异常输出(二), SpringMvc参数类型转换错误输出(二) >>>>>>>>>>>>>>&g ...

  7. AspNetWebApi管线中如果定义两种类型的消息处理程序(全局/路由)

    AspNetWebApi管线中如果定义两种类型的消息处理程序(全局/路由) 在AspNetWebApi管线中存在两种类型的消息处理程序(Message Handler) 1.全局消息处理程序,所有的请 ...

  8. SIP消息类型和消息格式

    转自:http://blog.chinaunix.net/uid-1797566-id-2840904.html sip消息类型和消息格式 SIP是一个基于文本的协议,使用的是UTF-8字符集. SI ...

  9. Android push推送消息到达成功率优化

    Android push推送消息到达成功率优化 问题:server向client发送消息.未考虑client是否在线,这种消息到达率是非常低的. 第一次优化:使用server离线缓存数据,推断假设cl ...

随机推荐

  1. Spring MVC中的HandlerMapping与HandlerAdapter

    *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...

  2. 结构-行为-样式-Angularjs-ngSanitize

    简单点,上代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> < ...

  3. 错误: 找不到或无法加载主类 tomcat-juli.jar

    错误: 找不到或无法加载主类 tomcat-juli.jar 然后就可以用了.

  4. 高可用的池化 Thrift Client 实现(源码分享)

    本文将分享一个高可用的池化 Thrift Client 及其源码实现,欢迎阅读源码(Github)并使用,同时欢迎提出宝贵的意见和建议,本人将持续完善. 本文的主要目标读者是对 Thrift 有一定了 ...

  5. (一)Harbor安装 -- 企业级Registry仓库

    根据Harbor官方描述: Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,通过添加一些企业必需的功能特性,例如安全.标识和管理等,扩展了开源Docker Distri ...

  6. svn问题(队列)

    svn执行clean up命令时报错"Previous operation has not finished; run 'cleanup' if it was interrupted&quo ...

  7. 提示找不到xml配置文件

    ClassPathXmlApplicationContext("applicationContext.xml")默认文件夹是resouerces,所以要把xml文件放在这个下面.

  8. 【IE6的疯狂之六】li在IE中底部3像素的BUG(增加浮动解决问题)

    今天开发项目中碰到一个li在IE中的BUG,先来看设计原型(如图:) 两个红色中间是<li>1px的底边框: 我写的代码如下: ============================== ...

  9. 第 2 章 Node.js 中的交互式运行环境 —— REPL

    本章内容包括: 如何使用REPL运行环境以及如何在该运行环境中测试各种JavaScript表达式. 如何定义并启动REPL运行环境. Node.js 框架中为REPL运行环境提供了哪些命令以及这些命令 ...

  10. Ubuntu下安装python相关数据处理

    01. Ubuntu下安装ipython sudo apt-get install ipython 02. Ubuntu下安装pip $ sudo apt-get install python-pip ...