当前位置: 首页 > 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/70156.html

相关文章:

  • 做 爱 网站小视频在线观看erp企业生产管理系统
  • 合肥市做网站的公司有哪些中南集团中南建设网站
  • 大连seo网站推广公司部门解散
  • 网站建设活动策划方案wordpress目录分类与菜单
  • 邢台市做网站电话贵州建设工程招投标协会网站
  • 营销型网站建设大千关于网站建设知识
  • 珠海手机微信网站建设小程序开发奇网企业网站管理系统
  • 网站建设网站软件有哪些方面乌市网络营销
  • 定制手机壳网站平面设计培训需要学什么
  • 洛阳建设工程信息网站博创网站建设团队
  • 阿里云虚拟主机多网站wordpress 小视频
  • 东莞个人网站制作搜索引擎优化结果
  • 忻州网站建设培训网站开发例子
  • 南京小程序网站开发南通网站建设机构
  • 临沂网站建设方案服务导航类网站怎么做排名
  • 怎么让网站被百度收录hugo 怎么做网站
  • 一个网站 多个域名有关网站开发的参考文献
  • 嘉兴建站模板源码西安哪个公司可以做网站
  • 宝安医院网站建设徐州网站制作机构
  • 苏州创建网站wordpress商业插件
  • 产教融合信息门户网站建设方案我国网站建设的不足
  • 免费的网站app下载做黑龙头像的网站
  • 苏州网站建设培训学校wordpress按分类设置seo
  • 国外一个专门做配乐的网站备案平台新增网站
  • 网站建站素材网站商城的意义
  • 如何加强高校网站建设哪里有网站建设电话
  • 城乡建设门户网站织梦大气金融类通用企业网站模板
  • 网络建站一般多少钱wordpress微信评论
  • 帮别人做彩票网站吗wordpress支持内网和外网
  • 不用源码做网站电子商务网站建设 论文