springboot整和activeMq

一、首先准备activeMq服务
1、从官网下载http://activemq.apache.org/
2、下载解压得到如下目录结构springboot整和activeMq_第1张图片
3、目录说明:
bin存放的是脚本文件
conf存放的是基本配置文件
data存放的是日志文件
docs存放的是说明文档
examples存放的是简单的实例
lib存放的是activemq所需jar包
webapps用于存放项目的目录
4、启动
进入bin目录,发现有win32和win64两个文件夹,这2个文件夹分别对应windows32位和windows64位操作系统的启动脚本,自己根据自己电脑操作系统进入对应目录去启动就好
springboot整和activeMq_第2张图片
springboot整和activeMq_第3张图片其中activemq.bat便是启动脚本,双击启动

5、web监控界面
ActiveMQ提供一个用于监控ActiveMQ的admin应用,默认8161端口,启动ActiveMQ服务后在浏览器地址栏输入:http://localhost:8161/admin要求输入用户名密码,默认用户名密码为admin、admin,这个用户名密码是在conf/users.properties中配置的。队列监控如下图
springboot整和activeMq_第4张图片

二、整合到springboot里
1、pom

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.2.6.RELEASE</version>
		<relativePath /> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.example</groupId>
	<artifactId>springb-activemq</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>springb-activemq</name>
	<description>activemq</description>

	<properties>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-activemq</artifactId>
		</dependency>

		<!-- 连接池 -->
		<dependency>
		  	<groupId>org.messaginghub</groupId>
		  	<artifactId>pooled-jms</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
			<exclusions>
				<exclusion>
					<groupId>org.junit.vintage</groupId>
					<artifactId>junit-vintage-engine</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

2、启动类。这里的bean注入是默认注册一个队列叫test,下面还有一种不用这样注册的方式

package com.example;

import org.apache.activemq.command.ActiveMQQueue;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.jms.annotation.EnableJms;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@ComponentScan("com.example")//扫描对应的包,纳入spring管理
@EnableJms//扫描标注了@EnableScheduling的类
@EnableScheduling//注册定时任务
public class SpringbActivemqApplication {

	public static void main(String[] args) {
		SpringApplication.run(SpringbActivemqApplication.class, args);
	}

	@Bean
	public ActiveMQQueue queue() {
		return new ActiveMQQueue("test");
	}

}

3、生产者

package com.example.test;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
 
import javax.jms.Queue;
 
@Component
@EnableScheduling
public class MqProducer {
 
    @Autowired
    private JmsMessagingTemplate jmsMessagingTemplate;
 
    @Autowired
    private Queue queue;
 
    @Scheduled(fixedRate = 2000)
    public void send() {
    	System.out.println("执行");
    	//默认使用启动类注册的队列
        this.jmsMessagingTemplate.convertAndSend(this.queue, "hello,activeMQ");
    }
    
    @Scheduled(fixedRate = 2000)
    public void send2() {
    	System.out.println("执行");
    	//自动创建使用这里输入的队列名
        this.jmsMessagingTemplate.convertAndSend("test22", "hello,activeMQ22");
    }
}

4、消费者

package com.example.test;

import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component;

@Component
public class MqConsumer {
	
	/**
     * 客户端消费
     * @param consumer
     */
    @JmsListener(destination = "test")
    public void receiveQueue(String consumer) {
        System.out.println(consumer+"消息已经消费了");
    }
    
    /**
     * 客户端消费
     * @param consumer
     */
    @JmsListener(destination = "test22")
    public void receiveQueue2(String consumer) {
        System.out.println(consumer+"消息已经消费了");
    }

}

5、配置文件

spring.activemq.broker-url=tcp://localhost:61616
spring.activemq.in-memory=false
#true表示使用连接池
spring.activemq.pool.enabled=false
#连接池最大连接数
spring.activemq.pool.max-connections=5
#空闲的连接过期时间,默认为30秒
spring.activemq.pool.idle-timeout=30000
#强制的连接过期时间,与idleTimeout的区别在于:idleTimeout是在连接空闲一段时间失效,而expiryTimeout不管当前连接的情况,只要达到指定时间就失效。默认为0,never
spring.activemq.pool.expiry-timeout=0

我这里测试的时候,遇到很坑的一个事,只要在配置文件里使用了连接池,就报错:

Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'queueMQProducer':
Unsatisfied dependency expressed through field 'jmsMessagingTemplate'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException:
No qualifying bean of type 'org.springframework.jms.core.JmsMessagingTemplate' available: expected at least 1 bean which qualifies as autowire candidate. 
Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

改成false或者直接不用连接池就不报错,百度基本都说是因为有空格,但我十分确定我没有空格,最后再找到问题,是需要springboot不同的版本导入不同的依赖包

2.1++版本的springboot,引入如下的连接池包

<dependency>
  	<groupId>org.messaginghub</groupId>
  	<artifactId>pooled-jms</artifactId>
</dependency>

2.0+版本的springboot引入如下的连接池包

<dependency>
   <groupId>org.apache.activemq</groupId>
   <artifactId>activemq-pool</artifactId>
</dependency>

你可能感兴趣的:(springboot)