`
frinder
  • 浏览: 38553 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

springmvc + amqp + batch + rabbitmq

阅读更多

最近在学习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+springmvc+rabbitmq实例代码"展示了如何将Spring的Web开发能力与RabbitMQ的分布式消息传递能力相结合,以构建高可扩展性和解耦的系统。在实际项目中,这种集成可以帮助我们构建更健壮、响应更快的...

    Java基于Spring+SpringMVC+MyBatis实现的学生信息管理系统源码.zip

    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后台管理系统(RESTful API+redis).zip 完善的Spring+SpringMVC+Mybatis+easyUI后台管理系统...

    基于Spring+SpringMVC+Mybatis架构的博客系统.zip

    基于Spring+SpringMVC+Mybatis架构的博客系统:博客管理、图表数据、日志分析、访问记录、图库管理、资源管理、友链通知等。良好的页面预加载,无限滚动加载,文章置顶,博主推荐等。提供 用户端+管理端 的整套系统...

    基于SpringMVC+Spring+MyBatis+Maven项目案例.zip

    基于SpringMVC+Spring+MyBatis+Maven项目案例 基于SpringMVC+Spring+MyBatis+Maven项目案例 基于SpringMVC+Spring+MyBatis+Maven项目案例 基于SpringMVC+Spring+MyBatis+Maven项目案例 基于SpringMVC+Spring+MyBatis...

    Java项目框架-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企业级报表后台管理系统.rar

    项目描述 在上家公司自己集成的一套系统,用了两个多月的时间完成的: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企业级报表后台管理系统Springboot+Mybatis-plus+ SpringMvc+Shiro+Redis企业级报表后台管理...

    基于spring+springMvc+mybatis 开发的企业门户网站

    基于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(Spring+SpringMVC+Mybatis)的新闻管理系统源码+数据库.zip 基于SSM...

    在线投票系统-jsp+springMVC+mybatis

    在线投票系统-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+MyBatis+Maven项目案例源码+数据库.zip 基于SpringMVC+Spring+...

    springMVC+RabbitMQ+websocket

    标题 "springMVC+RabbitMQ+websocket" 涉及到的是三个核心的技术栈:Spring MVC、RabbitMQ 和 WebSocket。这些技术在现代 Java Web 开发中扮演着重要角色,构建高性能、可扩展的应用。 1. **Spring MVC**: - ...

    基于SpringMVC+Spring+MyBatis个人技术博客系统源码.zip

    基于SpringMVC+Spring+MyBatis个人技术博客系统源码.zip 完整代码,可运行 项目描述 基于SSM实现的一个个人博客系统,适合初学SSM和个人博客制作的同学学习。有了这个源码,直接买了阿里云或腾讯服务器,就可以部署...

    springMVC+maven+hibernate框架

    springMVC+maven+hibernate框架,搭建的过程 可以参考 java进阶(五)------springMVC---springMVC+Hibernate+maven完整搭建运行步骤 http://blog.csdn.net/zzq900503/article/details/49892783

    基于SpringMVC+Spring3+Mybatis框架的OA项目.zip

    基于SpringMVC+Spring3+Mybatis框架的OA项目 基于SpringMVC+Spring3+Mybatis框架的OA项目 基于SpringMVC+Spring3+Mybatis框架的OA项目 基于SpringMVC+Spring3+Mybatis框架的OA项目 基于SpringMVC+Spring3+Mybatis...

    spring+springMVC+mybatis+quartz动态定时任务创建

    在IT行业中,构建高效、可扩展的Web应用是至关重要的,而"spring+springMVC+mybatis+quartz动态定时任务创建"就是一个常见的技术栈,用于实现这样的目标。这个组合充分利用了各组件的优势,提供了强大的后端服务支持...

    基于SSM(springmvc+spring+mybatis)+Mysql图书管理系统.zip

    基于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 基于SpringMVC+Spring3+Mybatis框架的OA项目源码.zip ...

    基于Spring+SpringMVC+Mybaits的小区停车场车牌识别系统.zip

    基于Spring+SpringMVC+Mybaits的小区停车场车牌识别系统 基于Spring+SpringMVC+Mybaits的小区停车场车牌识别系统 基于Spring+SpringMVC+Mybaits的小区停车场车牌识别系统 基于Spring+SpringMVC+Mybaits的小区停车场...

Global site tag (gtag.js) - Google Analytics