点对点模式:当生产者生产消息时,无论有多少个消费者,只有一个消费者能够接受到消息
发布/订阅模式:当生产者生产(发布)消息时,所有的订阅者(消费者)都能接受到消息
下载ActiveMq,然后双击运行
浏览器输入http://127.0.0.1:8161,登录admin/admin,验证是否启动成功
先引入jar包依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
<!--如果参数配置pool为true的话,需要引入下列依赖包-->
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-pool</artifactId>
</dependency>
书写配置类:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jms.config.DefaultJmsListenerContainerFactory;
import org.springframework.jms.config.JmsListenerContainerFactory;
import javax.jms.ConnectionFactory;
@Configuration
public class MyActiveMqConfig {
//需要给topic定义独立的JmsListenerContainer
@Bean
public JmsListenerContainerFactory<?> jmsListenerContainerTopic(ConnectionFactory connectionFactory) {
DefaultJmsListenerContainerFactory bean = new DefaultJmsListenerContainerFactory();
bean.setPubSubDomain(true);
bean.setConnectionFactory(connectionFactory);
return bean;
}
//需要给queue定义独立的jmsListenerContainerQueue
@Bean
public JmsListenerContainerFactory<?> jmsListenerContainerQueue(ConnectionFactory connectionFactory) {
DefaultJmsListenerContainerFactory bean = new DefaultJmsListenerContainerFactory();
bean.setConnectionFactory(connectionFactory);
return bean;
}
}
书写控制类
import org.apache.activemq.command.ActiveMQQueue;
import org.apache.activemq.command.ActiveMQTopic;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.jms.Destination;
@RestController
@RequestMapping("/activeMq")
public class ActiveMqTest {
@Autowired
private JmsMessagingTemplate jmsMessagingTemplate;
@GetMapping("SendQueue")
public void SendQueue(){
Destination destination = new ActiveMQQueue("testQueue");
//发送queue模式消息
jmsMessagingTemplate.convertAndSend(destination,"queuequeue");
}
@GetMapping("SendTopic")
public void SendTopic(){
Destination destination = new ActiveMQTopic("testTopic");
//发送topic模式消息
jmsMessagingTemplate.convertAndSend(destination,"topictopic");
}
@JmsListener(destination = "testQueue",containerFactory = "jmsListenerContainerQueue")
public void QueueReciver1(String str){
System.out.println("QueueReciver1 "+str);
}
@JmsListener(destination = "testQueue",containerFactory = "jmsListenerContainerQueue")
public void QueueReciver2(String str){
System.out.println("QueueReciver2 "+str);
}
@JmsListener(destination = "testTopic",containerFactory = "jmsListenerContainerTopic")
public void TopicReciver1(String str){
System.out.println("TopicReciver1 "+str);
}
@JmsListener(destination = "testTopic",containerFactory = "jmsListenerContainerTopic")
public void TopicReciver2(String str){
System.out.println("TopicReciver2 "+str);
}
}
配置yml文件
spring:
activemq:
broker-url: tcp://127.0.0.1:61616
user: admin
password: admin
pool:
enabled: true
max-connections: 50
packages:
trust-all: true #注意 对象传输需开启包白名单 否则会报错- -
in-memory: true
在启动类中添加@EnableJms开启扫描,然后启动项目进行测试
浏览器中输入http://localhost:端口号/项目名/activeMq/SendQueue 测试点对点模式
运行结果:
浏览器中输入http://localhost:端口号/项目名/activeMq/SendTopic 测试发布/订阅模式
运行结果:
说明:以上消费者都是以String类型接受的参数,如果项目中需要接受实体类,可以使用ObjectMessage接受参数,通过getObject方式获取实体类并进行强转