前言
项目里需要用到RabbitMQ来做数据持久化的工作,需要将RabbitMQ集成到Spring中。生产端需要将同步消息发送到MQ,消费者接受后持久化到数据库;
生产端
/**
* 退课
* @param coursetype
* @param redisId
* @param courseId
* @param teachClassId
* @param studentId
* @return
* @throws Exception
*/
@Override
public boolean deleteCourse(String coursetype,String redisId, String courseId,String teachClassId, String studentId) {
String publicStudentKey = STUDENTREDISPUBLIC + studentId;
String majorStudentKey = STUDENTREDISMAJOR + studentId;
String msg =teachClassId+";"+studentId+";"+false; //要添加到mq中的数据
boolean flag =true;
//1.学生已选课程中少一条--调用deleteFromStudentSelectedCourse
if( PUBLICCHOOSECOURSE.equals(coursetype)){
deleteFromStudentSelectedCourse(publicStudentKey,courseId);
}else if( MAJORCHOOSECOURSE.equals(coursetype) ){
deleteFromStudentSelectedCourse(majorStudentKey,courseId);
}
//2.课程容量key value中数量增加1
//3.mq中传入数据
boolean flagCourse =JedisCacheUtil.exists(redisId);
if (flagCourse) {
synchronized(this) {//给容量加上锁
//进行容量加操作
JedisCacheUtil.incr(redisId);
//2.运用注入的RabbitMQ模板类进行消息的发送
//经过springAOP 跳转到mqConsumer类中的listen方法中
template.convertAndSend(msg);
}
}
return flag;
}
消费端
package com.dmsdbj.itoo.teachingManagement.service.impl;
import com.dmsdbj.itoo.teachingManagement.entity.StudentTeachclassEntity;
import com.dmsdbj.itoo.teachingManagement.facade.StudentTeachclassFacade;
import com.dmsdbj.itoo.tool.UUID.UuidUtils;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.Date;
/**
* RabbitMq的消费者
* 处理ChooseCourseServiceImpl中选课业务的选课/退课操作
* Created by F-mdh on 2017/7/16.
*/
public class mqConsumer {
//需要调用studentTeachClassFacade的方法,注入;
@Autowired
StudentTeachclassFacade studentTeachclassFacade;
//具体执行业务的方法
public void listen(String msg) {
//1.打印监听的消息内容(后期可删除)
System.out.println("消费者: " + msg);
//2.获取teachClassID +studentID +状态标识
String[] StrList =msg.split(";");
String teachClassID =StrList[0].toString();
String studentID =StrList[1].toString();
String struts = StrList[2].toString();
//3.实例化实体【T_student_teachclass】
StudentTeachclassEntity StuEntity =new StudentTeachclassEntity();
//4.判断状态码true=添加:选课 ; false =删除:退课
if(struts.equals("true")){
//选课
StuEntity.setId(UuidUtils.base58Uuid());//参考文档
StuEntity.setOperator("mdh");//参考文档=(String) TenancyContext.UserID.get()
StuEntity.setIsDelete(0);// 0/1 ?? 未删除/删除
StuEntity.setRemark("添加信息,绑定上课班ID和学生ID");
StuEntity.setStudentId(studentID);
StuEntity.setTeachclassId(teachClassID);
StuEntity.setCreateTime(new Date());
StuEntity.setUpdateTime(new Date());
studentTeachclassFacade.insertTeachclassEntity(StuEntity);
}else{
//退课
studentTeachclassFacade.deleteByStudentIdandByTeachcalssId(studentID,teachClassID);
}
}
}
配置文件
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rabbit="http://www.springframework.org/schema/rabbit"
xsi:schemaLocation="http://www.springframework.org/schema/rabbit
http://www.springframework.org/schema/rabbit/spring-rabbit-1.4.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.1.xsd">
<!-- 定义RabbitMQ的连接工厂 -->
<rabbit:connection-factory id="connectionFactory"
host="192.###.###.###" port="5672" username="admin" password="###"
virtual-host="ChooseCourse" />
<!-- 定义Rabbit模板,指定连接工厂以及定义exchange -->
<rabbit:template id="amqpTemplate" connection-factory="connectionFactory" exchange="fanoutExchange" />
<!-- <rabbit:template id="amqpTemplate" connection-factory="connectionFactory"
exchange="fanoutExchange" routing-key="foo.bar" /> -->
<!-- MQ的管理,包括队列、交换器等 -->
<rabbit:admin connection-factory="connectionFactory" />
<!-- 定义队列,自动声明 -->
<rabbit:queue name="myQueue" auto-declare="true"/>
<!-- 定义交换器,自动声明 -->
<rabbit:fanout-exchange name="fanoutExchange" auto-declare="true">
<rabbit:bindings>
<rabbit:binding queue="myQueue"/>
</rabbit:bindings>
</rabbit:fanout-exchange>
<!-- <rabbit:topic-exchange name="myExchange">
<rabbit:bindings>
<rabbit:binding queue="myQueue" pattern="foo.*" />
</rabbit:bindings>
</rabbit:topic-exchange> -->
<!-- 队列监听:acknowledge确认机制 默认是开启的呃;auto属性代表一发消息既代表收到,不可取自动接收acknowledge="auto"-->
<rabbit:listener-container connection-factory="connectionFactory" >
<rabbit:listener ref="msg" method="listen" queue-names="myQueue" />
</rabbit:listener-container>
<!--消费者 -->
<bean id="msg" class="com.dmsdbj.itoo.teachingManagement.service.impl.mqConsumer" />
</beans>