一. Spring整合ActiveMQ
1. Maven修改, 需要添加Spring支持JMS的包
Pom.xml
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.xianyiquan</groupId>
<artifactId>activemq</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>boot_mq_produce</module>
<module>boot_mq_consumer</module>
<module>boot_mq_topic_produce</module>
<module>boot_mq_topic_consumer</module>
</modules>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<!--activemq所需要的jar包配置-->
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
<version>5.15.9</version>
</dependency>
<dependency>
<groupId>org.apache.xbean</groupId>
<artifactId>xbean-spring</artifactId>
<version>3.16</version>
</dependency>
<!--下面是junit/log4j等基础通用配置-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.6</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
<version>4.3.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.3.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>4.3.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.5.3</version>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.2.5</version>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-pool</artifactId>
<version>5.15.9</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.4.RELEASE</version>
</dependency>
</dependencies>
<repositories>
<repository>
<id>alimaven</id>
<name>Maven Aliyun Mirror</name>
<url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</project>
applicationContext.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:context="http://www.springframework.org/schema/context"
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">
<!--开启包的自动扫描-->
<context:component-scan base-package="Spring"/>
<!--配置生产者-->
<bean id="jmsFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop">
<property name="connectionFactory">
<!--真正可以产生Connection的ConnectionFactory, 由对应的JMS服务厂商提供-->
<bean class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="tcp://192.168.249.88:61616"/>
</bean>
</property>
<property name="maxConnections" value="100"></property>
</bean>
<!--这个是队列目的地, 点对点的-->
<bean id="destinationQueue" class="org.apache.activemq.command.ActiveMQQueue">
<constructor-arg index="0" value="spring-active-queue"/>
</bean>
<!--这个是主题-->
<bean id="destinationTopic" class="org.apache.activemq.command.ActiveMQTopic">
<constructor-arg index="0" value="spring-active-topic"/>
</bean>
<!--Spring提供的额JMS工具类 它可以进行消息发送, 接收等-->
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="jmsFactory"/>
<!--<property name="defaultDestination" ref="destinationQueue"/>-->
<property name="defaultDestination" ref="destinationTopic"/>
<property name="messageConverter">
<bean class="org.springframework.jms.support.converter.SimpleMessageConverter"/>
</property>
</bean>
<!--配置监听程序,不需要启动消费者就可以-->
<bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="jmsFactory"/>
<!--<property name="destination" ref="destinationQueue"/>-->
<property name="destination" ref="destinationTopic"/>
<!--public class MyMessageListener implements MessageListener-->
<property name="messageListener" ref="myMessageListener"/>
</bean>
</beans>
队列
队列生产者
package Spring;
import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.stereotype.Service;
import javax.jms.TextMessage;
/**
* @author xianyiquan
* @className
* @create 2019-12-30 16:38
*/
@Service
public class SpringMQ_Produce {
@Autowired
private JmsTemplate jmsTemplate;
public static void main(String[] args){
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
SpringMQ_Produce produce = (SpringMQ_Produce) ctx.getBean("springMQ_Produce");
produce.jmsTemplate.send(session ->{
TextMessage textMessage = session.createTextMessage("*****spring 和 ActiveMQ的整合case111....");
return textMessage;
});
System.out.println("**********send task over******");
}
}
队列消费者
package Spring;
import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.stereotype.Service;
/**
* @author xianyiquan
* @className
* @create 2019-12-30 16:38
*/
@Service
public class SpringMQ_Consumer {
@Autowired
private JmsTemplate consumer_jmsTemplate;
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
SpringMQ_Consumer consumer = (SpringMQ_Consumer) ctx.getBean("springMQ_Consumer");
String retValue = (String) consumer.consumer_jmsTemplate.receiveAndConvert();
System.out.println("*******消费者收到的消息: " + retValue);
}
}
主题Topic
Spring配置文件, 新增主题topic
applicationContext.xml
<!--这个是主题-->
<bean id="destinationTopic" class="org.apache.activemq.command.ActiveMQTopic">
<constructor-arg index="0" value="spring-active-topic"/>
</bean>
<!--Spring提供的额JMS工具类 它可以进行消息发送, 接收等-->
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="jmsFactory"/>
<!--<property name="defaultDestination" ref="destinationQueue"/>-->
<property name="defaultDestination" ref="destinationTopic"/>
<property name="messageConverter">
<bean class="org.springframework.jms.support.converter.SimpleMessageConverter"/>
</property>
</bean>
生产者消费者代码跟队列的一样,不需要改变 改变的只是application.xml配置
二. SpringBoot整合ActiveMQ
1. 队列
1.1 生产者工程
application.yml配置
server:
port:7777
spring:
activemq:
broker-url: tcp://192.168.249.88:61616 #自己的MQ服务器地址,用自己的
user: admin
password: admin
jms:
pub-sub-domain: false # false = Queue true = Topic
#自己定义队列名称
myqueue: boot-activemq-queue
ConfigBean配置类
package Boot.config;
import org.apache.activemq.command.ActiveMQQueue;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.jms.annotation.EnableJms;
import org.springframework.stereotype.Component;
import javax.jms.Queue;
/**
* @author xianyiquan
* @className
* @create 2019-12-31 14:22
*/
@Component
@EnableJms//开启Jms适配的注解
public class ConfigBean {
@Value("${myqueue}")
private String myQueue;
@Bean
public Queue queue(){
return new ActiveMQQueue(myQueue);
}
}
Queue_Produce队列生产者
间隔定时投递消息 @Scheduled(fixedDelay = 3000)
package Boot;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.jms.Queue;
import java.util.UUID;
/**
* @author xianyiquan
* @className
* @create 2019-12-31 14:22
*/
@Component
public class Queue_Produce {
@Autowired
private JmsMessagingTemplate jmsMessagingTemplate;
@Autowired
private Queue queue;
public void produceMsg(){
jmsMessagingTemplate.convertAndSend(queue,"*****: "+ UUID.randomUUID().toString().substring(0, 6));
}
//间隔时间3秒钟定投
@Scheduled(fixedDelay = 3000)
public void produceMsgScheduled(){
jmsMessagingTemplate.convertAndSend(queue,"*****: "+ UUID.randomUUID().toString().substring(0, 6));
System.out.println("*****produceMsgScheduled send");
}
}
主启动类
开启自动发消息@EnableScheduling
package Boot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
/**
* @author xianyiquan
* @className
* @create 2019-12-31 14:21
*/
@SpringBootApplication
@EnableScheduling
public class MainApp_Produce {
public static void main(String[] args) {
SpringApplication.run(MainApp_Produce.class,args);
}
}
测试类
import Boot.MainApp_Produce;
import Boot.Queue_Produce;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import javax.annotation.Resource;
/**
* @author xianyiquan
* @className
* @create 2019-12-31 15:27
*/
@SpringBootTest(classes = MainApp_Produce.class)
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
public class TestActiveMQ {
@Resource
private Queue_Produce queue_produce;
@Test
public void textSend(){
queue_produce.produceMsg();
}
}
1.2 消费者工程
跟生产者工程的pom.xml 一致,application.yml端口不同
application.yml
server:
port:8888
spring:
activemq:
broker-url: tcp://192.168.249.88:61616 #自己的MQ服务器地址,用自己的
user: admin
password: admin
jms:
pub-sub-domain: false # false = Queue true = Topic
#自己定义队列名称
myqueue: boot-activemq-queue
Queue_Consumer队列消费者
@JmsListener(destination = "${myqueue}")
开启监听
package Boot;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.jms.JMSException;
import javax.jms.Queue;
import javax.jms.TextMessage;
import java.util.UUID;
/**
* @author xianyiquan
* @className
* @create 2019-12-31 14:22
*/
@Component
public class Queue_Consumer {
@JmsListener(destination = "${myqueue}")
public void receive(TextMessage textMessage) throws JMSException {
System.out.println("****** 消费者收到消息: " + textMessage.getText());
}
}
MainApp_Consumer
@SpringBootApplication
//@EnableScheduling
public class MainApp_Consumer {
public static void main(String[] args) {
SpringApplication.run(MainApp_Consumer.class,args);
}
}
2. 发布订阅
2.1 主题生产者工程
application.yml
server:
port: 6666
spring:
activemq:
broker-url: tcp://192.168.249.88:61616 #自己的MQ服务器地址,用自己的
user: admin
password: admin
jms:
pub-sub-domain: true # false = Queue true = Topic
#自己定义队列名称
myTopic: boot-activemq-topic
ConfigBean配置类
@Component
@EnableJms //开启JMS的适配注解
public class ConfigBean {
@Value("${mytopic}")
private String topicName;
@Bean
public Topic topic(){
return new ActiveMQTopic(topicName);
}
}
Topic_Produce
@Component
public class Topic_Produce {
@Autowired
private JmsMessagingTemplate jmsMessagingTemplate;
@Autowired
private Topic topic;
@Scheduled(fixedDelay = 3000)
public void produceToTopic(){
jmsMessagingTemplate.convertAndSend(topic,"主题消息: "+ UUID.randomUUID().toString().substring(0, 6));
}
}
MainApp_TopicProduce
@SpringBootApplication
@EnableScheduling
public class MainApp_TopicProduce {
public static void main(String[] args) {
SpringApplication.run(MainApp_TopicProduce.class,args);
}
}
2.2 主题消费者工程
application.yml
server:
port: 5566 # 启动第二个消费者时候记得修改为5566端口号
spring:
activemq:
broker-url: tcp://192.168.249.88:61616 #自己的MQ服务器地址,用自己的
user: admin
password: admin
jms:
pub-sub-domain: true # false = Queue true = Topic
#自己定义队列名称
myTopic: boot-activemq-topic
Topic_Consumer主题消费者
@Component
public class Topic_Consumer {
@JmsListener(destination = "${myTopic}")
public void receive(TextMessage textMessage) throws JMSException {
System.out.println("****** 消费者收到订阅的主题: " + textMessage.getText());
}
}
MainApp
@SpringBootApplication
public class MainApp_5555 {
public static void main(String[] args) {
SpringApplication.run(MainApp_5555.class,args);
}
}
@SpringBootApplication
public class MainApp_6666 {
public static void main(String[] args) {
SpringApplication.run(MainApp_6666.class,args);
}
}