ActiveMQ的安装与使用及Springboot集成ActiveMQ
ActiveMQ的安装与使用及Springboot集成ActiveMQ
- 1、JMS简介
- 2、ActiveMQ的安装
- 3、springboot整合ActiveMQ
- 1.引入依赖
- 2.添加配置
- 3.在数据库建立一个表ay_mood并实现save业务方法
- 1)创建数据表,如下图:
- 2)创建实体类
- 3)创建业务层接口
- 4)创建业务层接口实现
- 4.创建生产者、消费者并实现异步消息
1、JMS简介
Java消息服务(Java Message Service,JMS)应用程序接口是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。
Java消息服务的规范包括两种消息模式,点对点和发布者/订阅者。许多提供商支持这一通用框架因此,程序员可以在他们的分布式软件中实现面向消息的操作,这些操作将具有不同面向消息中间件产品的可移植性。
Java消息服务支持同步和异步的消息处理,在某些场景下,同步消息是必要的;在其他场景下,异步消息比同步消息操作更加便利。
Java消息服务支持面向事件的方法接收消息,事件驱动的程序设计现在被广泛认为是一种富有成效的程序设计范例,程序员们都相当熟悉。
在应用系统开发时,Java消息服务可以推迟选择面对消息中间件产品,也可以在不同的面对消息中间件切换。
(维基百科)
2、ActiveMQ的安装
下载地址:点我下载
根据自己电脑对应的系统下载对应的文件
下载成功,解压到任意一个文件夹,最好是自己放软件的文件夹
打开bin目录选择对应 32位 或者 64位,点击如图所示的activemq.bat安装
如上图表示安装成功。在浏览器输入http://localhost:8161/admin
然后输入 账号:admin ,密码:admin
出现上图表示安装成功并已经启动服务。
3、springboot整合ActiveMQ
1.引入依赖
在pom文件中引入下列依赖
<!-- activemq start -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
2.添加配置
在application.properties配置文件中添加ActiveMQ配置
# ActiveMQ配置
spring.activemq.broker-url=tcp://localhost:61616
spring.activemq.in-memory=true
spring.activemq.pool.enabled=false
spring.activemq.packages.trust-all=true
- spring.activemq.packages.trust-all: objectmessage的使用机制是不安全的,activemq自 5.12.2和5.13.0 之后,强制consumer端声明一份可信任包列表只有当objectmessage中的object在可信任包内,才能被提取出来。该配置表示信任所有的包。
3.在数据库建立一个表ay_mood并实现save业务方法
1)创建数据表,如下图:
2)创建实体类
代码:
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import java.io.Serializable;
import java.util.Date;
/* * 说说实体类 * ye * 2020.11.22 * */
@Entity
@Table(name = "ay_mood")
public class AyMood implements Serializable {
//主键
@Id
private String id;
//说说内容
private String content;
//用户id
private String userId;
//点赞数量
private Integer praiseNum;
//发表时间
private Date publishTime;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public Integer getPraiseNum() {
return praiseNum;
}
public void setPraiseNum(Integer praiseNum) {
this.praiseNum = praiseNum;
}
public Date getPublishTime() {
return publishTime;
}
public void setPublishTime(Date publishTime) {
this.publishTime = publishTime;
}
@Override
public String toString() {
return "AyMood{" +
"id='" + id + '\'' +
", content='" + content + '\'' +
", userId='" + userId + '\'' +
", praiseNum=" + praiseNum +
", publishTime=" + publishTime +
'}';
}
}
3)创建业务层接口
代码如下:
import com.example.demojpa.model.AyMood;
/* * 说说服务层接口 * ye * 2020.11.23 * */
public interface AyMoodService {
AyMood save(AyMood ayMood);
String asynSave(AyMood ayMood);
}
4)创建业务层接口实现
代码如下:
import com.example.demojpa.model.AyMood;
import com.example.demojpa.repository.AyMoodRepository;
import com.example.demojpa.service.AyMoodProducer;
import com.example.demojpa.service.AyMoodService;
import org.apache.activemq.command.ActiveMQQueue;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.jms.Destination;
/* * 说说服务实现 * ye * 2020.11.23 * */
@Service
public class AyMoodServiceImpl implements AyMoodService {
@Resource
private AyMoodRepository ayMoodRepository;
@Override
public AyMood save(AyMood ayMood) {
return ayMoodRepository.save(ayMood);
}
//队列
private static Destination destination = new ActiveMQQueue("ay.queue.asyn.save");
@Resource
private AyMoodProducer ayMoodProducer;
@Override
public String asynSave(AyMood ayMood) {
//往队列ay.queue.asyn.save推送消息,消息内容为说说实体
ayMoodProducer.sendMessage(destination,ayMood);
return "success";
}
}
4.创建生产者、消费者并实现异步消息
生产者
import com.example.demojpa.model.AyMood;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.stereotype.Service;
import javax.jms.Destination;
import javax.annotation.Resource;
/* * 生产者 * ye * 2020.11.23 * */
@Service
public class AyMoodProducer {
@Resource
private JmsMessagingTemplate jmsMessagingTemplate;
//同步消费者
public void sendMessage(Destination destination,final String message){
jmsMessagingTemplate.convertAndSend(destination,message);
}
//异步消费者
public void sendMessage(Destination destination,final AyMood ayMood){
jmsMessagingTemplate.convertAndSend(destination,ayMood);
}
}
消费者
import com.example.demojpa.model.AyMood;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/* * 消费者 * ye * 2020.11.23 * */
@Component
public class AyMoodConsumer {
//loh4j
Logger logger = LogManager.getLogger(this.getClass());
//同步消息
@JmsListener(destination = "ay.queue")
public void receiveQueue(String text){
logger.info("用户发表说说【" + text + "】成功!");
}
@Resource
private AyMoodService ayMoodService;
//异步消息
@JmsListener(destination = "ay.queue.asyn.save")
public void receiveQueue(AyMood ayMood){
ayMoodService.save(ayMood);
}
}
测试:
代码
@Test
public void testActiveMQAsynSave(){
AyMood ayMood = new AyMood();
ayMood.setId("4");
ayMood.setUserId("4");
ayMood.setPraiseNum(0);
ayMood.setContent("这是我的第四条说说!!!");
ayMood.setPublishTime(new Date());
String msg = ayMoodService.asynSave(ayMood);
logger.info("异步发表说说:"+msg);
}
运行截图:
成功!数据库和消息队列都有数据,其中消息队列有两个是因为之前测试过一次。
还没有评论,来说两句吧...