当前位置: 首页 > news >正文

网站推广计划书范文西安做网站哪家最便宜

网站推广计划书范文,西安做网站哪家最便宜,量品定制官网,中国建设银行网站企业一、Spring 事件机制核心概念 1. 事件驱动架构模型 发布-订阅模式#xff1a;解耦事件生产者和消费者观察者模式#xff1a;监听器监听特定事件事件驱动优势#xff1a; 组件间松耦合系统扩展性好支持异步处理事件溯源支持 2. 核心组件 组件作用实现方式ApplicationEve…一、Spring 事件机制核心概念 1. 事件驱动架构模型 发布-订阅模式解耦事件生产者和消费者观察者模式监听器监听特定事件事件驱动优势 组件间松耦合系统扩展性好支持异步处理事件溯源支持 2. 核心组件 组件作用实现方式ApplicationEvent事件基类自定义事件需继承ApplicationEventPublisher事件发布接口通过Spring容器注入ApplicationListener事件监听接口实现接口或使用EventListener 二、代码示例解析 1. 事件定义 (KnowledgeService.java) Getter public static final class ImportedKnowledgeEvent extends ApplicationEvent {private final Knowledge knowledge;private final KWDocument document;// 构造器1只有knowledgepublic ImportedKnowledgeEvent(Object source, Knowledge knowledge) {super(source);this.knowledge knowledge;this.document null;}// 构造器2knowledge documentpublic ImportedKnowledgeEvent(Object source, Knowledge knowledge, KWDocument document) {super(source);this.knowledge knowledge;this.document document;} }关键点 继承ApplicationEvent基类使用final字段保证事件不可变性提供多种构造器支持不同场景使用GetterLombok提供访问方法 2. 事件发布 (KnowledgeService.java) Service public class KnowledgeService {Autowiredprotected ApplicationEventPublisher eventPublisher;public void imports() {// 发布简单知识导入事件eventPublisher.publishEvent(new ImportedKnowledgeEvent(this, new Knowledge()));// 发布知识文档导入事件eventPublisher.publishEvent(new ImportedKnowledgeEvent(this, new Knowledge(), new KWDocument()));} }发布模式 注入ApplicationEventPublisher创建事件对象包含业务数据调用publishEvent()发布支持多种事件类型重载 3. 事件监听 (KnowledgeRagflowService.java) Service public class KnowledgeRagflowService extends KnowledgeService {EventListenerpublic void importedKnowledge(KnowledgeService.ImportedKnowledgeEvent event) {if (event.getDocument() ! null) {dealDocument(event.getKnowledge(), event.getDocument());} else {dealKnowledge(event.getKnowledge());}}private void dealDocument(Knowledge knowledge, Document document) {// 处理文档逻辑}private void dealKnowledge(Knowledge knowledge) {// 处理知识逻辑} }监听器特点 使用EventListener注解简化实现方法参数决定监听的事件类型支持事件内容判断区分有无document私有方法封装具体处理逻辑 三、高级应用技巧 1. 条件监听 EventListener(condition #event.document ! null) public void handleDocumentEvent(ImportedKnowledgeEvent event) {// 仅处理包含document的事件 }2. 异步事件处理 Async EventListener public void asyncHandleEvent(ImportedKnowledgeEvent event) {// 异步处理耗时操作 }配置要求 主类添加EnableAsync配置线程池 Configuration EnableAsync public class AsyncConfig implements AsyncConfigurer {Overridepublic Executor getAsyncExecutor() {ThreadPoolTaskExecutor executor new ThreadPoolTaskExecutor();executor.setCorePoolSize(5);executor.setMaxPoolSize(10);executor.setQueueCapacity(25);executor.initialize();return executor;} }3. 监听器执行顺序 Order(1) EventListener public void firstListener(ImportedKnowledgeEvent event) {// 最先执行 }Order(2) EventListener public void secondListener(ImportedKnowledgeEvent event) {// 其次执行 }4. 事务绑定事件 TransactionalEventListener(phase TransactionPhase.AFTER_COMMIT) public void afterCommitEvent(ImportedKnowledgeEvent event) {// 事务提交后执行 }事务阶段选项 AFTER_COMMIT默认事务成功提交后AFTER_ROLLBACK事务回滚后AFTER_COMPLETION事务完成后提交或回滚BEFORE_COMMIT事务提交前 四、最佳实践 1. 事件设计原则 单一职责一个事件只携带一种业务变更不可变性事件发布后内容不可修改上下文完整包含所有必要业务数据命名规范使用过去时态如ImportedKnowledgeEvent 2. 性能优化 同步/异步选择 #mermaid-svg-Dj7gASor3gtjC8vw {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Dj7gASor3gtjC8vw .error-icon{fill:#552222;}#mermaid-svg-Dj7gASor3gtjC8vw .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Dj7gASor3gtjC8vw .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-Dj7gASor3gtjC8vw .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Dj7gASor3gtjC8vw .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Dj7gASor3gtjC8vw .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Dj7gASor3gtjC8vw .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Dj7gASor3gtjC8vw .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Dj7gASor3gtjC8vw .marker.cross{stroke:#333333;}#mermaid-svg-Dj7gASor3gtjC8vw svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Dj7gASor3gtjC8vw .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Dj7gASor3gtjC8vw .cluster-label text{fill:#333;}#mermaid-svg-Dj7gASor3gtjC8vw .cluster-label span{color:#333;}#mermaid-svg-Dj7gASor3gtjC8vw .label text,#mermaid-svg-Dj7gASor3gtjC8vw span{fill:#333;color:#333;}#mermaid-svg-Dj7gASor3gtjC8vw .node rect,#mermaid-svg-Dj7gASor3gtjC8vw .node circle,#mermaid-svg-Dj7gASor3gtjC8vw .node ellipse,#mermaid-svg-Dj7gASor3gtjC8vw .node polygon,#mermaid-svg-Dj7gASor3gtjC8vw .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Dj7gASor3gtjC8vw .node .label{text-align:center;}#mermaid-svg-Dj7gASor3gtjC8vw .node.clickable{cursor:pointer;}#mermaid-svg-Dj7gASor3gtjC8vw .arrowheadPath{fill:#333333;}#mermaid-svg-Dj7gASor3gtjC8vw .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Dj7gASor3gtjC8vw .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Dj7gASor3gtjC8vw .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-Dj7gASor3gtjC8vw .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-Dj7gASor3gtjC8vw .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Dj7gASor3gtjC8vw .cluster text{fill:#333;}#mermaid-svg-Dj7gASor3gtjC8vw .cluster span{color:#333;}#mermaid-svg-Dj7gASor3gtjC8vw div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Dj7gASor3gtjC8vw :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 是 否 事件发布 是否耗时? 异步处理 同步处理 批量处理对高频事件进行批量合并事件过滤在监听器内部添加条件判断 3. 错误处理 EventListener public void handleEvent(ImportedKnowledgeEvent event) {try {// 业务处理} catch (Exception e) {// 1. 记录错误日志// 2. 发布错误处理事件// 3. 重试机制如Spring Retry} }4. 测试策略 SpringBootTest class KnowledgeEventTest {Autowiredprivate ApplicationEventPublisher eventPublisher;MockBeanprivate KnowledgeRagflowService ragflowService;Testvoid shouldTriggerListenerWhenPublishEvent() {// 准备测试事件ImportedKnowledgeEvent event new ImportedKnowledgeEvent(this, new Knowledge());// 发布事件eventPublisher.publishEvent(event);// 验证监听器调用verify(ragflowService, timeout(1000)).importedKnowledge(event);} }五、典型应用场景 业务状态变更通知 知识导入完成通知文档处理状态更新 跨模块协作 知识导入后触发索引更新文档处理完成后通知搜索服务 系统生命周期事件 EventListener public void onApplicationReady(ContextRefreshedEvent event) {// 应用启动完成后初始化资源 }审计日志记录 EventListener public void auditLog(ImportedKnowledgeEvent event) {log.info(Knowledge imported: {}, event.getKnowledge().getId()); }业务流程编排 #mermaid-svg-y8tJql9wPSCD7d3g {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-y8tJql9wPSCD7d3g .error-icon{fill:#552222;}#mermaid-svg-y8tJql9wPSCD7d3g .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-y8tJql9wPSCD7d3g .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-y8tJql9wPSCD7d3g .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-y8tJql9wPSCD7d3g .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-y8tJql9wPSCD7d3g .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-y8tJql9wPSCD7d3g .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-y8tJql9wPSCD7d3g .marker{fill:#333333;stroke:#333333;}#mermaid-svg-y8tJql9wPSCD7d3g .marker.cross{stroke:#333333;}#mermaid-svg-y8tJql9wPSCD7d3g svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-y8tJql9wPSCD7d3g .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-y8tJql9wPSCD7d3g text.actortspan{fill:black;stroke:none;}#mermaid-svg-y8tJql9wPSCD7d3g .actor-line{stroke:grey;}#mermaid-svg-y8tJql9wPSCD7d3g .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-y8tJql9wPSCD7d3g .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-y8tJql9wPSCD7d3g #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-y8tJql9wPSCD7d3g .sequenceNumber{fill:white;}#mermaid-svg-y8tJql9wPSCD7d3g #sequencenumber{fill:#333;}#mermaid-svg-y8tJql9wPSCD7d3g #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-y8tJql9wPSCD7d3g .messageText{fill:#333;stroke:#333;}#mermaid-svg-y8tJql9wPSCD7d3g .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-y8tJql9wPSCD7d3g .labelText,#mermaid-svg-y8tJql9wPSCD7d3g .labelTexttspan{fill:black;stroke:none;}#mermaid-svg-y8tJql9wPSCD7d3g .loopText,#mermaid-svg-y8tJql9wPSCD7d3g .loopTexttspan{fill:black;stroke:none;}#mermaid-svg-y8tJql9wPSCD7d3g .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-y8tJql9wPSCD7d3g .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-y8tJql9wPSCD7d3g .noteText,#mermaid-svg-y8tJql9wPSCD7d3g .noteTexttspan{fill:black;stroke:none;}#mermaid-svg-y8tJql9wPSCD7d3g .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-y8tJql9wPSCD7d3g .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-y8tJql9wPSCD7d3g .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-y8tJql9wPSCD7d3g .actorPopupMenu{position:absolute;}#mermaid-svg-y8tJql9wPSCD7d3g .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-y8tJql9wPSCD7d3g .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-y8tJql9wPSCD7d3g .actor-man circle,#mermaid-svg-y8tJql9wPSCD7d3g line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-y8tJql9wPSCD7d3g :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} ImportService EventBus IndexService NotificationService 发布ImportedKnowledgeEvent 触发索引更新 触发通知发送 ImportService EventBus IndexService NotificationService 六、常见问题解决方案 监听器未触发 检查事件类型是否匹配确认监听器在Spring容器中验证事件是否成功发布 循环事件触发 // 使用标记防止循环 public void imports() {if (!EventContext.isEventProcessing()) {eventPublisher.publishEvent(...);} }事件数据过大 改为传递引用ID而非整个对象使用DTO精简数据添加Lazy注解延迟加载 监听器执行顺序问题 使用Order明确顺序拆分事件避免依赖 总结 Spring ApplicationEvent 提供了强大的事件驱动编程模型通过示例中的KnowledgeService和KnowledgeRagflowService展示了 如何定义包含业务数据的事件多种事件发布方式使用EventListener简化监听器实现根据事件内容执行不同处理逻辑 在实际应用中应结合 异步处理提升性能事务绑定确保数据一致性条件过滤优化事件处理完善错误处理机制 遵循高内聚、低耦合原则合理使用事件驱动架构可以显著提升系统的扩展性和可维护性。
http://www.dnsts.com.cn/news/187155.html

相关文章:

  • 手机网站优化排名怎么做登陆网站显示域名解析错误怎么办
  • tag做的最好的网站网页设计难学吗
  • 无锡装饰网站建设wordpress 课程激活
  • 肥城网站制作企业信息查询系统官网上海
  • 网站设计经典案例建设工程机械鉴定中心官网
  • 太原零元网站建设wordpress投票
  • 连云港网站建设2345推广联盟
  • 网站建设公司代理idc科技公司网站模板
  • 国外网站页面做多大博客导航wordpress
  • 具体阐述对网站如何加强建设全网营销课程
  • 多用户网站管理系统廊坊seo关键词排名
  • 免费建立自己的网站代码游乐场网站开发
  • 自学制作网站难不难雄安做网站优化的公司
  • 房地产广告设计网站做app网站公司
  • 做网站维护的是什么公司opencart网站
  • 广州天河建网站wordpress 登录空白页
  • 怎么建网站青州问枫家在深圳网页版
  • 如何做旅游网站的旅行家织梦猫html5高端网络服务机构网站模板
  • 公章在线制作网站做不了威海哪里可以建设企业网站
  • 装修10万元利润是多少网站seo方案案例
  • 破解wordpress网站密码wordpress 批量缩略图
  • 网站建设文化策划陕西网络公司网站建设
  • 深圳网站设计九曲网站建设科技创新小发明
  • 汕头网站设计价格网站建设私活
  • 南京专门做网站会员播放系统插件wordpress
  • 接单子做网站德州网站建设公司
  • 淄博网站制作优化科技网站制作公司
  • 怎样清理网站后门西宁网站建设王道下拉惠
  • 软件网站开发团队名称网站开发培训实训
  • 乐清建网站公司哪家好电商网站建设行情