最近在学习spring amqp + spring batch + rabbitmq 的一些东西,简单的就是实现向mq中写入日志,使用spring batch批量处理,当然了,在实际生产中这个例子不一定合理,基于学习需要,暂且不秋考虑!!!
因为日志是一直不断记录的,当然不一次就写完,这里使用的是quartz,定时去mq中取数据的方式,spring amqp可以使用listener的方式(SimpleMessageListenerContainer)来监听,尝试了下,没实现,大家可以一起探讨下!
闲话少说,进入正题!
环境:springmvc集成amqp+batch+rabbitmq
主要配置文件有:
- applicationContext.xml
- applicationContext-rabbitmq.xml
- applicationContext-batch-beans.xml
- applicationContext-batch.xml
- applicationContext-quartz.xml
applicationContext.xml就不在介绍,主要是加载properties文件,datasource,当然还有一些公共的配置;
applicationContext-rabbitmq.xml内容如下:
<?xml version="1.0" encoding="UTF-8"?> <beans:beans xmlns="http://www.springframework.org/schema/rabbit" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/rabbit http://www.springframework.org/schema/rabbit/spring-rabbit-1.4.xsd"> <connection-factory id="rabbitConnectionFactory" host="${rabbit.mq.host}" username="${rabbit.mq.user}" password="${rabbit.mq.pwd}" port="${rabbit.mq.port}" connection-timeout="${rabbit.mq.connectionTimeout}" virtual-host="${rabbit.mq.virtualHost}" publisher-confirms="true" publisher-returns="true" /> <admin connection-factory="rabbitConnectionFactory" /> <queue id="logDirectQueue" name="log-direct-queue" durable="true" auto-delete="false" exclusive="false" /> <queue id="logReplyDirectQueue" name="log-reply-direct-queue" durable="true" auto-delete="false" exclusive="false" /> <direct-exchange id="logDirectExchange" name="log-direct-exchange" durable="true" auto-delete="false"> <bindings> <binding queue="log-direct-queue" key="log-direct-routing-key" /> </bindings> </direct-exchange> <template id="logDirectTemplate" queue="log-direct-queue" exchange="log-direct-exchange" routing-key="log-direct-routing-key" connection-factory="rabbitConnectionFactory" confirm-callback="sendConfirmCallBack" return-callback="sendReturnCallBack" recovery-callback="sendRecoveryCallback" reply-queue="log-reply-direct-queue"> <reply-listener acknowledge="auto" auto-startup="true" min-start-interval="3000" /> </template> </beans:beans>
配置队列+exchange+binding+template时,需要注意的点,上面已经用红色注明,要保持一致,即将队列(log-direct-queue)与exchange(log-direct-exchange)通过路由规则(log-direct-routing-key)绑定;
applicationContext-batch-beans.xml内容如下:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <bean id="jobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher"> <property name="jobRepository" ref="jobRepository" /> </bean> <bean id="jobRepository" class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean"> </bean> <bean id="amqpItemReader" class="org.springframework.batch.item.amqp.AmqpItemReader"> <constructor-arg name="amqpTemplate" ref="logDirectTemplate" /> <property name="itemType" value="com.beauty.entity.BeautyHandlerLogs" /> </bean> </beans>
上面的不解释,主要说下标记的代码:使用batch自带的AmqpItemReader读取mq中的消息;
applicationContext-batch.xml内容如下:
<beans:beans xmlns="http://www.springframework.org/schema/batch" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/batch http://www.springframework.org/schema/batch/spring-batch.xsd"> <beans:import resource="applicationContext-batch-beans.xml" /> <job id="logProcessJob"> <step id="logStep" allow-start-if-complete="true"> <tasklet> <chunk reader="amqpItemReader" writer="amqpItemWriterImpl" commit-interval="10" /> </tasklet> </step> </job> </beans:beans>
具体配置不介绍了,主要说明下标记代码:只有添加上 allow-start-if-complete="true",quartz中的定时任务才能不断从mq中获取消息,即 logProcessJob 能不断重复执行,否则只取一次就不再执行了!这个需要特别注意,我也是找了好久,又尝试了好久才搞定的!
注:tasklet 也有该属性,也有同样的功能,可以尝试下!
applicationContext-quartz.xml内容如下:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <bean id="SpringJobSchedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="cronTriggerBean" /> </list> </property> </bean> <bean id="cronTriggerBean" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <property name="jobDetail" ref="amqpItemReaderJobMethod" /> <property name="cronExpression" value="0/10 * * * * ?" /> </bean> <bean id="amqpItemReaderJobMethod" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject"> <ref bean="amqpItemReaderQtz" /> </property> <property name="targetMethod"> <value>execute</value> </property> </bean> </beans>
使用MethodInvokingJobDetailFactoryBean绑定pojo的方式实现,类的方式报错,版本不一致,于是弃用;
amqpItemReaderQtz 内容如下:
import org.springframework.batch.core.Job; import org.springframework.batch.core.JobExecution; import org.springframework.batch.core.JobParameters; import org.springframework.batch.core.launch.JobLauncher; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component("amqpItemReaderQtz") public class AmqpItemReaderQtz { @Autowired private JobLauncher jobLauncher; @Autowired private Job logProcessJob; public void execute() { try { JobExecution result = jobLauncher.run(logProcessJob, new JobParameters()); // 调用batch任务 System.out.println(result); } catch (Exception e) { e.printStackTrace(); } } }
写到这,基本上已经完成了,至于mq环境搭建,发送消息等就不再介绍!
如有问题,可留言讨论,特别是不使用死循环和quartz的场景下,如何能使batch的reader一直能读取mq中的消息的方法,很想学习下!
共勉!!
相关推荐
总的来说,"spring+springmvc+rabbitmq实例代码"展示了如何将Spring的Web开发能力与RabbitMQ的分布式消息传递能力相结合,以构建高可扩展性和解耦的系统。在实际项目中,这种集成可以帮助我们构建更健壮、响应更快的...
Java基于Spring+SpringMVC+MyBatis实现的学生信息管理系统源码,SSM+Vue的学生管理系统。 Java基于Spring+SpringMVC+MyBatis实现的学生信息管理系统源码,SSM+Vue的学生管理系统。 Java基于Spring+SpringMVC+...
完善的Spring+SpringMVC+Mybatis+easyUI后台管理系统(RESTful API+redis).zip 完善的Spring+SpringMVC+Mybatis+easyUI后台管理系统(RESTful API+redis).zip 完善的Spring+SpringMVC+Mybatis+easyUI后台管理系统...
基于Spring+SpringMVC+Mybatis架构的博客系统:博客管理、图表数据、日志分析、访问记录、图库管理、资源管理、友链通知等。良好的页面预加载,无限滚动加载,文章置顶,博主推荐等。提供 用户端+管理端 的整套系统...
基于SpringMVC+Spring+MyBatis+Maven项目案例 基于SpringMVC+Spring+MyBatis+Maven项目案例 基于SpringMVC+Spring+MyBatis+Maven项目案例 基于SpringMVC+Spring+MyBatis+Maven项目案例 基于SpringMVC+Spring+MyBatis...
SpringMVC+Spring+Mybatis集成开发环境SpringMVC+Spring+Mybatis集成开发环境SpringMVC+Spring+Mybatis集成开发环境SpringMVC+Spring+Mybatis集成开发环境SpringMVC+Spring+Mybatis集成开发环境SpringMVC+Spring+...
项目描述 在上家公司自己集成的一套系统,用了两个多月的时间完成的:Springboot+Mybatis-plus+ SpringMvc+Shiro+Redis企业级开发系统 Springboot作为容器,使用mybatis作为持久层框架 使用官方推荐的thymeleaf做为...
Springboot+Mybatis-plus+ SpringMvc+Shiro+Redis企业级报表后台管理系统Springboot+Mybatis-plus+ SpringMvc+Shiro+Redis企业级报表后台管理系统Springboot+Mybatis-plus+ SpringMvc+Shiro+Redis企业级报表后台管理...
基于spring+springMvc+mybatis 开发的企业门户网站基于spring+springMvc+mybatis 开发的企业门户网站,适合具有一定编程基础,比如计算机专业的大学生或者1-3年工作经验的开发人员。手写简化版 Spring 框架,了解 ...
基于SSM(Spring+SpringMVC+Mybatis)的新闻管理系统源码+数据库.zip 基于SSM(Spring+SpringMVC+Mybatis)的新闻管理系统源码+数据库.zip 基于SSM(Spring+SpringMVC+Mybatis)的新闻管理系统源码+数据库.zip 基于SSM...
在线投票系统-jsp+springMVC+mybatis在线投票系统-jsp+springMVC+mybatis在线投票系统-jsp+springMVC+mybatis在线投票...jsp+springMVC+mybatis在线投票系统-jsp+springMVC+mybatis在线投票系统-jsp+springMVC+mybatis
基于SpringMVC+Spring+MyBatis+Maven项目案例源码+数据库.zip 基于SpringMVC+Spring+MyBatis+Maven项目案例源码+数据库.zip 基于SpringMVC+Spring+MyBatis+Maven项目案例源码+数据库.zip 基于SpringMVC+Spring+...
标题 "springMVC+RabbitMQ+websocket" 涉及到的是三个核心的技术栈:Spring MVC、RabbitMQ 和 WebSocket。这些技术在现代 Java Web 开发中扮演着重要角色,构建高性能、可扩展的应用。 1. **Spring MVC**: - ...
基于SpringMVC+Spring+MyBatis个人技术博客系统源码.zip 完整代码,可运行 项目描述 基于SSM实现的一个个人博客系统,适合初学SSM和个人博客制作的同学学习。有了这个源码,直接买了阿里云或腾讯服务器,就可以部署...
springMVC+maven+hibernate框架,搭建的过程 可以参考 java进阶(五)------springMVC---springMVC+Hibernate+maven完整搭建运行步骤 http://blog.csdn.net/zzq900503/article/details/49892783
基于SpringMVC+Spring3+Mybatis框架的OA项目 基于SpringMVC+Spring3+Mybatis框架的OA项目 基于SpringMVC+Spring3+Mybatis框架的OA项目 基于SpringMVC+Spring3+Mybatis框架的OA项目 基于SpringMVC+Spring3+Mybatis...
在IT行业中,构建高效、可扩展的Web应用是至关重要的,而"spring+springMVC+mybatis+quartz动态定时任务创建"就是一个常见的技术栈,用于实现这样的目标。这个组合充分利用了各组件的优势,提供了强大的后端服务支持...
基于SSM(springmvc+spring+mybatis)+Mysql图书管理系统 基于SSM(springmvc+spring+mybatis)+Mysql图书管理系统 基于SSM(springmvc+spring+mybatis)+Mysql图书管理系统 基于SSM(springmvc+spring+mybatis)+...
基于SpringMVC+Spring3+Mybatis框架的OA项目源码.zip 基于SpringMVC+Spring3+Mybatis框架的OA项目源码.zip 基于SpringMVC+Spring3+Mybatis框架的OA项目源码.zip 基于SpringMVC+Spring3+Mybatis框架的OA项目源码.zip ...
基于Spring+SpringMVC+Mybaits的小区停车场车牌识别系统 基于Spring+SpringMVC+Mybaits的小区停车场车牌识别系统 基于Spring+SpringMVC+Mybaits的小区停车场车牌识别系统 基于Spring+SpringMVC+Mybaits的小区停车场...