@iamfox
2015-12-10T16:58:05.000000Z
字数 1508
阅读 3671
汇银
阿里云ONS提供了对消息的存储和分发服务,基于发布/订阅模式。
先在阿里云后台创建消息主题,上图建了两个主题,商品变化和订单变化。
也在阿里云后台操作,已经创建好了,只有一个Producer,整个乐虎网通用,名字为PID_HYLEHU。
这个消息生产者和两个消息主题都关联上了,意味着用这个Producer实现类可以向这两个主题发消息。
aliyun_access_key=0nAfYRauR8NVckb9
aliyun_secret_key=jJYJlFdzEGvTM02okhtRIMADHwDsJy
aliyun_region_id=cn-hangzhou
aliyun_ons_region_id=publictest
aliyun_ons_producer_id=PID_HYLEHU
里面是操作汇银阿里云的相关帐号和网络节点配置,以及用于发消息的ProducerId。
在你要发消息的Controller
或Service
中注入这个。
阿里云接收的是消息,在这里系统多做了一层包装,把消息包装成一个事件类。
下例中创建了两个事件,一个是商品被创建事件,一个是商品未通过审核事件。
用之前注入的onsService
操作,方法只有一个,publishEvent(BaseEvent event);
所以所有的事件都要继承BaseEvent
;
以上已经用Producer生产者产生了消息,并发送到了对应的主题。
消费者用于接收消息,消费者在系统中体现为一个监听器listener
类,在能接收消息前也要在阿里云维护订阅关系。
如上图,CID_PRODUCT_UNAPPROVE_SEND_SMS和CID_PRODUCT_LOGGER两个消费者被创建并且都订阅了PRODUCT_CHANGED主题的消息。
消费者的命名是根据其作用命名的,如上,第一个是用来在商品审核不通过时发短信通知,第二个用来是记商品操作日志。
代码中对应这两个消费者的监听器在
以上我们实现了两个监听器,用来在接收到感兴趣的消息时,做进一步的业务处理。
以上两个监听器能收到的消息是不一样的,一个订阅了*
,在subscribe方法的第三个参数,一个订阅了unapprove
。所以第一个监听器能收到PRODUCT_CHANGED主题的全部消息,而第二个只能收到打了tag为unapprove
的消息。
这个tag是在事件的构造函数里定义的
有了tag,监听器就可以选择性接收和它有关的消息。
最后,如果没有return Action.CommitMessage
,消息会在一定间隔后重发给监听器,直到次数上限。
代码解耦:非事务性的,可以异步处理的业务代码,不再写到一个方法中依次触发,避免了事务处理的复杂度,增加稳定性风险。比如发贴之后要给用户发积分,只要把事件(发贴、回贴等)发送到贴子主题,由一个发放积分的监听器接收并判断该发多少分,调用积分接口。将来还可以再增加监听器做别的事情而不会影响到发贴功能代码。