Spring中的观察者模式(发布订阅模式)(基于SpringBoot实现)

概述:

  spring中的事件机制涉及到者几个类文件 :ApplicationEvent(事件类型)、ApplicationListener(事件监听类)、ApplicationEventPublisher(事件发布类)。

  ApplicationEvent:继承jdk Utill包中的 EventObject。

  ApplicationListener :接口继承了utill 包中的EventListener接口,泛型参数E必须继承ApplicationEvent类。

  ApplicationEventPublisher: 事件发布接口 ,实现类很多,其中子类ApplicationContext,发布事件就用ApplicationContext类去发布。

举例:

  在实际开发中,有一个这样的例子,当下单成功后会发送手机短信、发送绑定邮箱、微信、等

 

示例代码:

 

pom文件

 1   <parent>
 2         <groupId>org.springframework.boot</groupId>
 3         <artifactId>spring-boot-starter-parent</artifactId>
 4         <version>1.5.9.RELEASE</version>
 5     </parent>
 6     <dependencies>
 7         <dependency>
 8             <groupId>org.springframework.boot</groupId>
 9             <artifactId>spring-boot-starter-web</artifactId>
10         </dependency>
11         <dependency>
12             <groupId>org.springframework.boot</groupId>
13             <artifactId>spring-boot-starter-test</artifactId>
14             <scope>test</scope>
15         </dependency>
16     </dependencies>

 

 

定义事件:

 1 /**
 2  * 定义订单事件
 3  */
 4 public class OrderEvent extends ApplicationEvent {
 5 
 6     private String message;
 7 
 8     /**
 9      * Create a new ApplicationEvent.
10      *
11      * @param source the object on which the event initially occurred (never {@code null})
12      */
13     public OrderEvent(Object source, String message) {
14         super(source);  //强制调用
15         this.message = message;
16     }
17 
18     @Override
19     public Object getSource() {
20         return super.getSource();
21     }
22 
23     public String getMessage() {
24         return message;
25     }
26 
27     public void setMessage(String message) {
28         this.message = message;
29     }
30 }

 

短信监听:

 1 /**
 2  * 短信监听(异步执行)
 3  */
 4 @Component
 5 public class SmsListener implements ApplicationListener<OrderEvent> {
 6 
 7 
 8     private static final Logger logger = Logger.getLogger(SmsListener.class);
 9 
10     @Override
11     @Async  //异步
12     public void onApplicationEvent(OrderEvent event) {
13         System.out.println(Thread.currentThread() + "...短信监听到..." + event.getMessage()+ "......" + event.getSource());
14     }
15 }

 

邮件监听:

 1 /**
 2  * @Author zechuang
 3  * @Date 2019/8/21
 4  */
 5 @Component
 6 public class EmailListener implements ApplicationListener<OrderEvent> {
 7 
 8     private static final Logger logger = Logger.getLogger(EmailListener.class);
 9     
10     @Override
11     @Async
12     public void onApplicationEvent(OrderEvent event) {
13         System.out.println(Thread.currentThread() + "...邮件监听到..." + event.getMessage()+ "......" + event.getSource());
14     }
15 }

 

springBoot启动类

1 @SpringBootApplication
2 @EnableAsync   //开启异步
3 public class MySpringBootApplication {
4 
5     public static void main(String[] args) {
6         SpringApplication.run(MySpringBootApplication.class, args);
7     }
8 }

 

测试:

 1 @RunWith(SpringRunner.class)
 2 @SpringBootTest(classes = MySpringBootApplication.class)
 3 public class ObserverTest {
 4 
 5     @Autowired
 6     private ApplicationContext applicationContext;
 7 
 8     @Test
 9     public void test01(){
10         OrderEvent order = new OrderEvent(this, "用户下单成功");
11         applicationContext.publishEvent(order);
12         System.out.println("....................over........................");
13     }
14 }

 

测试结果:

....................over........................
Thread[SimpleAsyncTaskExecutor-1,5,main]...邮件监听到...用户下单成功......com.test.ObserverTest@19dd04d
Thread[SimpleAsyncTaskExecutor-2,5,main]...短信监听到...用户下单成功......com.test.ObserverTest@19dd04d

 

转载于:https://www.cnblogs.com/zchok/p/11388932.html

好的,关于SpringBoot项目WebSocket的使用,首先需要了解WebSocket是一种基于TCP协议的双向通信协议,它可以在浏览器和服务器之间建立持久连接,使得服务器可以主动向浏览器推送消息。 在SpringBoot使用WebSocket,我们可以借助Spring框架提供的WebSocket模块,实现双向通信功能。下面是一个简单的实现WebSocket的示例代码: 1. 创建一个WebSocket处理类,实现WebSocketHandler接口,重写其的方法。这里我们以观察者设计模式为例,通过一个List来存储所有连接的WebSocket客户端,每当有新消息到达时,遍历所有客户端,将消息发送给每个客户端。 ``` @Component public class MyWebSocketHandler implements WebSocketHandler { private static final List<WebSocketSession> sessions = new ArrayList<>(); @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { sessions.add(session); } @Override public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception { for (WebSocketSession s : sessions) { s.sendMessage(message); } } @Override public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception { sessions.remove(session); } @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception { sessions.remove(session); } @Override public boolean supportsPartialMessages() { return false; } } ``` 2. 在SpringBoot的配置文件添加WebSocket相关配置,开启WebSocket支持。 ``` @Configuration @EnableWebSocket public class WebSocketConfig implements WebSocketConfigurer { @Autowired private MyWebSocketHandler myWebSocketHandler; @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(myWebSocketHandler, "/websocket").setAllowedOrigins("*"); } } ``` 3. 在前端页面使用JavaScript代码,连接WebSocket服务器,并发送消息。 ``` var websocket = new WebSocket("ws://localhost:8080/websocket"); websocket.onopen = function(event) { console.log("WebSocket连接已打开"); }; websocket.onmessage = function(event) { console.log("收到消息:" + event.data); }; websocket.onerror = function(event) { console.log("WebSocket连接出错"); }; websocket.onclose = function(event) { console.log("WebSocket连接已关闭"); }; function sendMessage() { var message = document.getElementById("message").value; websocket.send(message); } ``` 这样,当有新消息发送时,WebSocket服务器会将消息发送给所有连接的WebSocket客户端。整个过程就是一个典型的观察者设计模式:WebSocket客户端作为观察者,WebSocket服务器作为被观察者,所有客户端都订阅了服务器的消息事件,当服务器发出新消息时,所有客户端都会收到通知。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值