springmvc使用aop异步更新solr中的数据

最全的Spring MVC注解例子,异步请求,错误处理 最全的Spring MVC注解例子,异步请求,错误处理,是基于maven工程,很帮的一个Spring mvc注解例子。 立即下载

继续项目中如何使用solr

今天分享一下,用户在新增,修改文章是,采用aop来更新solr中的数据,对文章本来的逻辑和solr逻辑进行解耦

如果没有aop,solr的使用情况可能是这样的

这里写图片描述

这样就会把文章自身的逻辑和solr紧紧地耦合在一起。

这种情况下就非常适合用aop技术了

思路

在文章新增或修改完成之后,有一个返回值,就是修改的文章

采用aop在文章修改后去更新solr

文章新增,修改

package com.jcms.controller.admin;


/**
 * 文章控制器
 * 
 * @author 程高伟
 *
 */
@Controller
@RequestMapping("/admin/article")
public class ArticleController {
    /**
     * 添加,修改文章
     * 
     * @param article
     * @return
     * @throws Exception
     */
    @ResponseBody
    @RequestMapping(value = "/addArticle", method = RequestMethod.POST)
    public String addArticle(Article article, Boolean useImage,
            @RequestParam(required = false, value = "file") MultipartFile file, HttpServletRequest request)
            throws Exception {
        // 各种判断
        article = articleService.save(article);
        // aop中会用到这里的返回值
        return BaseReturn.response(ErrorCode.SUCCESS, article);
    }
}
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

文章aop

package com.jcms.aspect;


/**
 * 文章切面
 * 
 * @author 程高伟
 * @time 2017年5月17日下午4:57:36
 */
@Aspect
@Component
public class ArticleAspect {
    private final Logger logger = LoggerFactory.getLogger(this.getClass());
    @Autowired
    private ArticleService articleService;
    @Autowired
    private SolrService solrService;

    // 更新连接点
    @Pointcut("execution (* com.jcms.controller.admin.ArticleController.addArticle(..))")
    public void update() {
    }

    /**
     * 文章新增、修改都要更新solr服务器的数据
     * 
     * @param joinPoint 连接点
     * @param object 返回值
     * @throws UnsupportedEncodingException
     */

    @AfterReturning(returning = "object", pointcut = "update()")
    public void updateAfterReturning(JoinPoint joinPoint, Object object) throws UnsupportedEncodingException {
        // 请求参数
        logger.info("args={}", joinPoint.getArgs());
        // 方法返回值
        logger.info("response={}", object);
        JSONObject jsonObj = new JSONObject(object.toString());
        String code = (String) jsonObj.get("code");
        if (StringUtils.isNotBlank(code)) {
            if (code.equals("200")) {// 执行成功
                JSONObject articleJsonObj = jsonObj.getJSONObject("result");
                if (articleJsonObj != null) {
                    String id = (String) articleJsonObj.get("id");
                    if(StringUtils.isNotBlank(id)){// 有id
                        Article article = articleService.findById(id);
                        if(article.getNeedReview()==0||article.getReview()==1){// 不需要审核的文章和审核通过的文章
                            ArticleSolr articleSolr = new ArticleSolr();
                            BeanUtils.copyProperties(article, articleSolr);
                            logger.info("更新solr,更新的内容:articleSolr={}", articleSolr);
                            System.out.println("异步调用开始");
                            solrService.updateArticle(articleSolr);
                            System.out.println("异步调用结束");
                        }

                    }

                }
            }
        }
    }
}
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62

还要在springmvc的xml配置文件中开始

<!-- aop -->
<aop:aspectj-autoproxy proxy-target-class="true"/>

这样在方法返回的时候就能拿到数据,然后去更新solr

这里写图片描述

因为我们的solr在单独的服务器,所以为了减少延迟,这里

solrService.updateArticle(articleSolr);

采用异步的方式执行

异步

异步执行也是在spring管理之下

所以我们对SolrUtil进行了一次包装,让它作为spring的bean

@Service
public class SolrService {
    @Async
    public void updateArticle(ArticleSolr article) {
        SolrUtil.saveSolrResource(article);
    }
}
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

我们还要开启异步,在配置文件中添加如下代码

<!-- 异步 -->
<task:annotation-driven executor="asyncExecutor" />  
<task:executor id="asyncExecutor" pool-size="100-10000" queue-capacity="10" />
 
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

这里写图片描述

这样对solr的操作就和文章本身的操作解耦了。

使用aop进行多数据源切换 springMVC+spring+mybatis增删改查的使用 使用aop进行多数据源切换 springMVC+spring+mybatis增删改查的使用。dk8+tomcat8+mysql+Eclipse+maven。spring+spring mvc+mybatis+bootstrap+jquery 立即下载

相关推荐

solr配置和solrj使用(demo)

Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http G Solret操作提出查找请求,并得到XML格式的返回结果。 Solrj 是访问 Solr 的 Java 客户端,它提供添加、更新和查询Solr 索引的接口。http://wiki.chenlb.com/solr/doku.php?id=solrj

@RequestMapping 注解的使用及注解属性详解

1.基本使用 通过注解方式实现路径到处理器方法的映射。 可以用在类或方法上。 用在方法上表示将该方法变为一个处理器,且和指定路径做映射。 用在类上则配置的路径会作为这个类中所有处理器的路径的父路径使用。 @RequestMapping("/test01.action") public ModelAndView test01() { ModelAndView mav = new ModelAndView(); mav.addObject("attr1", "hello anno~"); ma

浅时光|初如梦 2636

solr-5.5.4与spring 集成项目示例2

solr-5.5.4与spring集成,增加了账号密码身份验证,增加了zk中文分词,增加了增量导入,mysql数据同步,增加了git链接地址

solr整合springmvc开发(一)

开发前提:将数据库导入索引库 1.自定义一个索引库 2.配置IKAnalyzer中文分析器    a.把IKAnalyzer2012FF_u1.jar添加到solr/WEB-INF/lib目录下    b.复制IKAnalyzer的配置文件和自定义词典和停用词词典到solr的solr/WEB-INF/classes目录下。复制IK分词器配置文件、自定义词典、停用词词典(词典需要自己配置)

coffeno1的博客 5185

Solr(Lucene)+SpringMVC实现电商站内搜索功能

系统在自己一步一步部署下完成站内搜索,可以了解Solr集合SpringMvc的使用,对Solr安装使用可以提升许多,我还有一篇文展描述了步骤, 配置完好的solr(中文分析器)+我配置的SolrHome+mysql的数据库+javaweb程序 希望共同进步

从STM32转战华大HC32F4A0:我的踩坑实录与10个USART的灵活配置心得

本文分享了从STM32迁移至华大HC32F4A0的实战经验,重点解析了10个USART的灵活配置技巧及常见问题解决方案。通过对比STM32F407,详细介绍了HC32F4A0在外设灵活性、IO功能组设计及多串口应用中的优势,帮助开发者快速掌握国产芯片的开发要点。

weixin_30514745的博客 525

springMVC中solr的简单实现步骤

1.在虚拟机里安装solr,可以通过官网下载solr的linux的安装包解压之后,添加/etc/sysconfig/iptables中的端口号8983(solr默认) 2.Solr的安装:     第一步:解压压缩文件:    [root@localhost Desktop]# tar -zvxf solr-7.3.1.tgz  -C /opt/     第二步:启动solr     [root@...

qq_41950069的博客 1501

在微信小程序中如何引入iconfont

略

sayyy的专栏 4326

springMVC整合solr-----没有问题的

首先,在可以根据ip:端口能够进入solr服务器的基础上,solr所有配置都配好的基础上。。。。。。。。。。。。。。。 1、导包,在这里我用的是7.0.1的包,在晚上看到的都是四点几包,绕了很大一圈,很多方法都不一样了,只有一个包 &lt;dependency&gt; &lt;groupId&gt;org.apache.solr&lt;/groupId&gt; &lt;artifac...

classabcd的博客 2400

2021.11.23 Covins 多机器人单目协同建图 跑Euroc数据集 更新

近日,一直在调试如何使用Covins跑通数据集,因为是初学者,所以很多bug出来的时候原理都不懂,只能复制——百度——尝试解决的过程。 现分享一下近日的结果以及与Covins作者帮助解答的一些问题。 使用代码行跑依次跑Euroc多数据集 这里的意思是使用作者提供的covins_examples文件夹中的euroc_examples_mh123_vigba.sh文件,这个文件是将三个Euroc数据集依次运行,跑完第一个数据集,第二个数据集运行的时候在第一个数据集生成地图的基础上继续绘制,由于我只下载了两个数据

qq_42614598的博客 2475

c# 开发串口调试助手 Visual Studio 2019

串口调试助手是用于在开发、测试和调试串口通信应用程序时进行串口数据的监视和交互的工具。

2301_76792852的博客 8060

SSM 博客系统开发实战

课程简介 SSM 框架即 SpringMVC+Spring+Mybatis,相比 SSH(Struts2+Spring+Hibernate)来说较新,SpringMVC 可与 Spring 更好的整合,Mybatis 相比 Hibernate 使用更简单、轻便,大部分公司都在使用 SSM 这套框架,主要是轻量级、易使用,故本达人课特选择 SSM 框架作为课程主题,希望通过实战项目让大家对 SSM ...

GitChat 3万+

实测对比:Gromacs GPU版vsCPU版性能差异到底有多大?2023最新基准测试

本文通过2023年最新基准测试,详细对比了Gromacs GPU版与CPU版的性能差异。测试显示,GPU版本在计算速度上可提升54倍,同时显著降低内存需求和能耗成本。文章还提供了GPU版安装优化实践和硬件选购指南,为计算生物学研究提供关键参考。

weixin_29243063的博客 337

复习资料(Redis+Solr+ActiveMQ+FastDFS...)

01 Redis Redis k-v 的内存数据库 Redis的数据类型 5 String(set get) List(lpush lpop rpush rpop) hash(Hset key field value,Hget key field) set(sadd spop) zset(zadd,Zrange) java 如何操作redis? Jedis 操作redis Re...

司天宏的博客 462

IBM 3560M3 R5 坏盘更换记录

公司一台老旧 3650M3在日常巡查过程中发现硬盘报错

ddriv的博客 3945

OpenClaw实战五|企业文档AI助理:对接内部知识库+自动答疑+文档生成,员工自助查资料零等待

企业最大的隐性成本,不是设备、不是房租,而是内部知识的混乱与流失。OpenClaw企业文档AI助理,本质是给企业做了一个7×24小时在线、永不疲倦、精准无误、自动更新的内部知识管家。它不替代HR、行政、IT,而是把他们从无穷无尽的重复问答、机械文档编写里解放出来,去做更有价值的管理、服务、优化工作。对中小企业来说,不用买昂贵的知识库系统、不用招开发、不用做复杂集成,一台私有化服务器,两天就能落地,性价比拉满。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 148

解决json传输数据的乱码问题

json传输数据乱码问题 总结一下最近做项目出现的乱码问题,主要是从solr服务器检索出现的问题: –tomcat编码出现的问题 问题出现: 做的maven项目,tomcat服务器都是直接在pom中加的tomcat插件,前台模糊检索,不输入数据时能从solr中获取全部的数据,而加了关键字就获取不到了,打印查看原来是前台的ajax异步传入json数据时,在后台controller中获取出...

随珠和璧 2万+

数字 IC 笔试面试必考点(1)FPGA 芯片架构

FPGA 芯片架构是非常重要的,如果你不了解 FPGA 芯片内部的详细架构,那么...

新芯设计的博客 2811

ssm(Spring、Springmvc、Mybatis)实战之淘淘商城-第十四天(非原创)

文章大纲 一、淘淘商城总体架构介绍二、淘淘商城重要技术点总结三、项目常见面试题四、项目学习(all)资源下载五、参考文章 一、淘淘商城总体架构介绍 1. 功能架构 2. 技术选型 (1)Spring、SpringMVC、Mybatis(2)JSP、JSTL、jQuery、jQuery plugin(为页面上的元素产生阴影效果的 jQuery 插件...

weixin_30768661的博客 203

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

‘入门级’程序员面试关键字眼解答

JSP:全名为 Java Server Pages ,中文名叫java服务器页面,其根本是一个简化的Servlet 设计,它是在传统的网页HTML文件           中插入Java程序段(Scriptlet)和JSP标记(tag),从而形成JSP文件,后缀名为(*.jsp)。 用JSP开发的Web应用是跨平台的,             既能在Linux下运行,也能在其他操作系统上运行。 ...

静候轮回 700

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

电商项目java经验_分布式电商系统项目总结

概述:淘淘商城是采用分布式架构部署的一个大型网上商城系统,类似于京东商城。本系统分前台系统和后台系统。前台系统主要负责商城的页面的显示功能,这里采用的面向服务的方式,pc端手机端只负责显示页面,业务逻辑都在服务层实现,客户端调用服务端接口来实现显示功能。在前台系统中主要分为:客户端:系统前台页面显示系统(portal,8082)。服务端系统:(1)rest系统(8081):负责调用CMS系统的内容...

weixin_42499379的博客 4231

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

面试小组总结(一)

在廊坊师范本科计算机专业15年毕业,16年考取河北大学的计算机本科学士学位证,还差两门课考试,现在住在回龙观 项目介绍 分布式云平台系统是为高效考试分配试卷,为老师排课使用的,主要是两个模块,考评和教务,在我进了这个项目之前这个就已经做了半年,开发团队15人,服务器用了20台, 技术点 数据库:做了优化(分库分表,比如sql优化,数据库字段属性优化,使用...

严文文 Chris 430

项目介绍加链接

主要技术 后端技术:spring、SpringMVC、Mybatis 前端技术:JSP、JSTL、jQuery、Ajax、EasyUI、KindEditor(富文本编辑器)、CSS+DIV 缓存技术:Redis(缓存服务器) 消息队列:RabbitMQ 搜索技术:Solr(搜索) 远程调用技术:httpclient(调用系统服务) ...

weixin_33785972的博客 829

面试总结

面试总结面试总结 :Dubbo并发通信原理解析Redis常用命令SpringMVC与Struts2区别与比较总结git常用命令 :虚拟机的类加载机制。spring boot与spring mvc的区别是什么?一、Duboo基本概念解释二、dubbo原理ActiveMQ的功能解耦合和减轻写的压力。项目优化 :第一级优化 :第二级优化 :redis缓存第三极优化 : solr进行搜索第四级优化 :S...

不一样的花朵的博客 430

使用SpringBoot+RabbitMQ框架集成例程

RabbitMQ是消息服务器,主要解决应用间解耦问题,消息异步处理和高并发场景下对关系数据库缓冲作用,比如电商系统中的秒杀设计。本例程中使用SpringBoot集成RabbitMQ解决高并发数据存储对关系数据库的缓冲问题。前端页面提交数据直接进入RabbitMQ队列,设计消息定时处理器或者消息监听器获取消息并保持到数据库。 本例要求: 1.安装RabbitMQ 2.使用SpringBoo...

qixiang_chen的博客 401
上一篇: 使用Spring AOP来统计方法的执行时间
下一篇: eclipse中文乱码
琅琊山二当家
博客等级 码龄18年 447粉丝 322原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值