オブザーバーの説明
1.オブザーバーモードの基本概念
オブジェクトの状態が変化すると、他のすべてのオブジェクトに通知されます
2.オブザーバーモードのアプリケーションシナリオ
Zkイベントの監視、分散構成センターによる構成ファイルの更新、およびビジネス内のさまざまなチャネルからのメッセージの大量送信
1.オブザーバーモードを使用してモニタリングを設定します
オブザーバーモードの使用は、マルチチャネルメッセージ通知(SMS +メールボックス+公式アカウントメッセージプッシュなど)の非同期実行です。
1.SpringUtilsツールクラス
/**
* SpringUtils 工具类
*/
@Component
public class SpringUtils implements ApplicationContextAware {
private static ApplicationContext applicationContext = null;
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
public static <T> T getBean(String beanId) {
return (T) applicationContext.getBean(beanId);
}
public static <T> T getBean(Class<T> requiredType) {
return (T) applicationContext.getBean(requiredType);
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
SpringUtils.applicationContext = applicationContext;
}
}
2.オブザーバーインターフェースを作成します
/**
* 观察者接口
*/
public interface ObServer {
void sendMsg(JSONObject jsonObject);
}
3.オブザーバー1を作成します
@Component
@Slf4j
public class EmailObServer implements ObServer {
@Override
public void sendMsg(JSONObject jsonObject) {
log.info("使用观察者发送邮件");
}
}
4.オブザーバー2を作成します
@ Slf4j
@Component
public classSMSObServerはObServerを実装します{ @Overridepublic void sendMsg(JSONObject jsonObject){log.info ( " Useobserver to send SMS"); } }
5.すべて、オブザーバーコンテナ
import com.alibaba.fastjson.JSONObject;
import com.xijia.xj.observer.ObServer;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* 观察者容器, listObServer = 所有的观察类
* @author wangsong
* @mail [email protected]
* @date 2020/9/2 0002 21:22
* @version 1.0.0
*/
@Component
public class XjSubject {
/**
* 类型 ObServer
*/
private List<ObServer> listObServer = new ArrayList<>();
/**
* 线程池
*/
private ExecutorService executorService;
public XjSubject() {
executorService = Executors.newFixedThreadPool(10);
}
/**
* 新增ObServer
*
* @param obServer
*/
public void addObServer(ObServer obServer) {
listObServer.add(obServer);
}
/**
* 通知给所有的观察者,遍历执行所有观察者的方法
*
* @param jsonObject
*/
public void notifyObServer(JSONObject jsonObject) {
for (ObServer obServer : listObServer) {
// 单独开启线程异步通知
executorService.execute(new Runnable() {
@Override
public void run() {
obServer.sendMsg(jsonObject);
}
});
}
}
}
6.すべてのオブザーバーをオブザーバーコンテナに自動的に登録します
import com.xijia.xj.config.SpringUtils;
import com.xijia.xj.observer.ObServer;
import com.xijia.xj.observer.subject.XjSubject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
import java.util.Map;
/**
* 项目启动后需要 执行的一些方法 --> 注册观察者, 当我们的SpringBoot启动成功的时候,注册我们的SMSObServer
* @author wangsong
* @mail [email protected]
* @date 2020/9/2 0002 21:27
* @version 1.0.0
*/
@Component
public class InitService implements ApplicationRunner {
@Autowired
private XjSubject xjSubject;
@Override
public void run(ApplicationArguments args) throws Exception {
/**
* 自动注册我们观察者
* 1.使用Spring获取该ObServer下有那些bean对象
* 2.直接注添加到集合中
*/
//根据接口类型返回相应的所有bean
Map<String, ObServer> map = SpringUtils.getApplicationContext().getBeansOfType(ObServer.class);
for (String key : map.keySet()) {
ObServer obServer = map.get(key);
xjSubject.addObServer(obServer);
}
}
}
7.オブザーバーモードを使用する
@RestController
@Slf4j
public class OrderService {
@Autowired
private XjSubject xjSubject;
@RequestMapping("/addOrder")
public String addOrder() {
log.info("1.调用数据库下单订单代码:");
JSONObject jsonObject = new JSONObject();
jsonObject.put("sms", "1865891111");
jsonObject.put("email", "[email protected]");
xjSubject.notifyObServer(jsonObject);
return "success";
}
}
8.実行効果
次に、Springのリスナーを使用して監視します
Springのリスナーは同期的に実行され、@ Async非同期アノテーションをサポートしていないことに注意してください
1.配信を監視するためのパラメータクラスを作成します
package com.xijia.spring.entity;
import org.springframework.context.ApplicationEvent;
public class UserMessageEntity extends ApplicationEvent {
private String email;
private String phone;
private String userId;
/**
* Create a new ApplicationEvent.
*
* @param source the object on which the event initially occurred (never {@code null})
*/
public UserMessageEntity(Object source) {
super(source);
}
public UserMessageEntity(Object source, String email, String phone) {
super(source);
this.email = email;
this.phone = phone;
}
@Override
public String toString() {
return "email:" + email + ",phone:" + phone;
}
}
2.モニター1(オブザーバー1)を作成します
/**
* 监听发送邮件
*/
@Component
public class EmailListener implements ApplicationListener<UserMessageEntity> {
/**
* 监听的方法
*
* @param event
*/
@Override
@Async
public void onApplicationEvent(UserMessageEntity event) {
System.out.println(Thread.currentThread().getName() +" 邮件:" + event.toString());
}
}
3.モニター2(オブザーバー2)を作成します
/**
* 监听发送邮件
*/
@Component
public class SmSListener implements ApplicationListener<UserMessageEntity> {
/**
* 监听的方法
*
* @param event
*/
@Override
@Async
public void onApplicationEvent(UserMessageEntity event) {
System.out.println(Thread.currentThread().getName() + " 短信:" + event.toString());
}
}
4.リスナーを使用して監視します
@RestController
@Slf4j
public class OrderService {
@RequestMapping("/addOrder2")
public String addOrder2() {
log.info("1.调用数据库下单订单代码:");
UserMessageEntity userMessageEntity = new UserMessageEntity(this, "[email protected]", "1865891111");
applicationEventPublisher.publishEvent(userMessageEntity);
return "success";
}
}
5.実行効果
-
上記のコンテンツの一部は、Ant Classroomhttp ://www.mayikt.com/からのものです。
-
パーソナルオープンソースプロジェクト(ユニバーサルバックグラウンド管理システム)–> https://gitee.com/wslxm/spring-boot-plus2、必要に応じてチェックアウトできます
-
これでこの記事は終わりです。お役に立てば幸いです。気に入ったり、注目したりしてください。今後もコンテンツを更新していきます...ご覧いただきありがとうございます。