内容简介:很多编程语言框架里都提供了发布订阅的组件,或者叫事件处理机制,而spring框架对这个功能也有支持,主要使用事实上,发布订阅真的与开发语言没有什么关系,所以出现了另一种产品,消息中间件,或者叫消息队列,它是以发布订阅模式为理论基础的,同时很多消息队列产品又有自己的特色,这种独立的消息队列我们为基于以上的介绍,主要帮助大家理解和认识,在什么时候用什么类型的工具。
编程语言集成了发布订阅
很多编程语言框架里都提供了发布订阅的组件,或者叫事件处理机制,而spring框架对这个功能也有支持,主要使用 EventListener
实现订阅,使用 ApplicationEventPublisher
使用发布。这种系统集成的我们先叫它“集成组件”
与语言无关的消息队列
事实上,发布订阅真的与开发语言没有什么关系,所以出现了另一种产品,消息中间件,或者叫消息队列,它是以发布订阅模式为理论基础的,同时很多消息队列产品又有自己的特色,这种独立的消息队列我们为 rabbitmq
为例子。
共同点
@Async
不同点
- rabbitmq实现的是多服务之间的发布与订阅
- 集成组件实现的是一个服务内部的发布与订阅
- rabbitmq是异步的,集成组件可以是异步,也可以是同步
- rabbitmq可以有广播,点对点等模式,而集成组件只有广播模式
基于以上的介绍,主要帮助大家理解和认识,在什么时候用什么类型的工具。
实例
- 集成组件的发布订阅
订阅
@Getter @Builder(toBuilder = true) @NoArgsConstructor @AllArgsConstructor public class CreateBookEvent { private String address; private String title; } @Component public class EmailEventListener { @EventListener @Async public void handleEvent(CreateBookEvent event) throws Exception { System.out.println("email消息:建立图书:" + event.getTitle()); } }
发布
@Autowired private ApplicationEventPublisher applicationEventPublisher; public void publish(){ applicationEventPublisher.publishEvent(CreateBookEvent.builder().address("system").title("新建图书").build()); }
- rabbitmq的发布订阅
订阅
@Slf4j @Component public class DistributorSubscriber { public static final String WORK_QUEUE = "fx.activity.total"; public static final String EXCHANGE = "fx.exchange"; @Autowired DistributorActivityTotalRepository distributorActivityTotalRepository; @Autowired ObjectMapper objectMapper; @Bean public TopicExchange phoneTotalExchange() { return new TopicExchange(EXCHANGE); } @Bean public Queue phoneTotalQueue() { return new Queue(WORK_QUEUE); } @Bean public Binding bindSignQueue() { return BindingBuilder.bind(phoneTotalQueue()).to(phoneTotalExchange()).with(WORK_QUEUE); } @RabbitListener(queues = WORK_QUEUE) public void phoneTotalQueueListener(String data) { try { logger.debug("fx.activity.total:{}", data); DistributorActivityTotal entity = objectMapper.readValue(data, DistributorActivityTotal.class); distributorActivityTotalRepository.incUpdate(entity); } catch (Exception ex) { logger.error("fx.activity.total.error", ex); } }
发布
@Autowired private RabbitTemplate rabbitTemplate; public void modifySalesperson(SalesPersonDTO salesPersonDTO) { try { rabbitTemplate.convertAndSend( "EXCHANGE", "MQName", objectMapper.writeValueAsString(salesPersonDTO) ); logger.debug("Enter {},message:{}", "modifySalesperson", salesPersonDTO.toString()); } catch (Exception ex) { logger.error("MQ.modifySalesperson.error", ex); } }
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 使用Redis作为消息队列实现生产消费与发布订阅
- Lua Web快速开发指南(10) - 利用MQ实现异步任务、订阅/发布、消息队列
- 设计模式之发布订阅模式(2) Redis实现发布订阅模式
- 设计模式之发布订阅模式(1) 一文搞懂发布订阅模式
- 使用并解析 OPML 格式的订阅列表来转移自己的 RSS 订阅(解析篇)
- Redis订阅与发布
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。