在项目开始导包时 导入ActiveMQ
先来介绍一次下ActiveMQ(消息队列)
*消息队列
JMS ,Java定义的一系列接口, ActiveMQ是JMS的实现
处理高并发/应用解耦
队列有两个类型:
1.Queue
网Queue中放的消息,同时只能由一个客户端消费
如果没哟客户端,那么这个消息会一直存放在Queue
直到某个客户端进行消费
2,Topic
往Topic中放的消息,同时会被对多个客户端消费(1对多)
如果消息队列
JMS ,Java定义的一系列接口, ActiveMQ是JMS的实现
处理高并发/应用解耦
队列有两个类型:
1.Queue
网Queue中放的消息,同时只能由一个客户端消费
如果没哟客户端,那么这个消息会一直存放在Queue
直到某个客户端进行消费
2,Topic
往Topic中放的消息,同时会被对多个客户端消费(1对多)
如果消息队列
JMS ,Java定义的一系列接口, ActiveMQ是JMS的实现
处理高并发/应用解耦
队列有两个类型:
1.Queue
网Queue中放的消息,同时只能由一个客户端消费
如果没哟客户端,那么这个消息会一直存放在Queue
直到某个客户端进行消费.
2,Topic
往Topic中放的消息,同时会被对多个客户端消费(1对多)
如果没有客户端,那么这个消息就会丢失.
使用的是被人配置好的ActiveMQ镜像
在配置文件中配置好 端口映射 与用户名 密码
spring.activemq.broker-url=tcp://localhost:61616
spring.activemq.user=admin
spring.activemq.password=admin
#spring.activemq.packages.trust-all=false
# 他的默认值是false 只支持Queue
#改为true 支持 topic
#所以不能再配置文件中设置
#需要配置bean
创建 JmsConfig 实体类 在这个实体类下写所有关于消息队列的配置
@Configuration
public class JmsConfig {
// 编辑字符串Queue 消息对列的名字
public static final String Quene_SEND_EMAIL = "com.lanou.QUEUE_SEND_EMAIL";
// 编辑字符串Topic 消息对列的名字
public static final String TOPIC_USER = "com.lanou.TOPIC_USER";
// 编辑对象Queue 消息对列的名字
public static final String QUEUE_EMAIL = "com.lanou.QUEUE_EMAIL";
// 设置字符串Queue 形式的方法
@Bean
public Queue emailQueue() {
return new ActiveMQQueue(Quene_SEND_EMAIL);
}
// 发送字符串Topic 形式的方法
@Bean
public Topic userTopic() {
return new ActiveMQTopic(TOPIC_USER);
}
// 发送对象Queue 形式的方法
@Bean
public Queue messageQueue() {
return new ActiveMQQueue(QUEUE_EMAIL);
}
@Bean
// 创建工厂(Queue 对列形式)
public DefaultJmsListenerContainerFactory queueFactory(ConnectionFactory connectionFactory) {
DefaultJmsListenerContainerFactory factory
= new DefaultJmsListenerContainerFactory();
factory.setPubSubDomain(false);
factory.setConnectionFactory(connectionFactory);
return factory;
}
@Bean
// 创建工厂(Topic 队列形式)
public DefaultJmsListenerContainerFactory topicFactory(ConnectionFactory connectionFactory) {
DefaultJmsListenerContainerFactory factory
= new DefaultJmsListenerContainerFactory();
factory.setPubSubDomain(true);
factory.setConnectionFactory(connectionFactory);
return factory;
}
在service 层 引入 配置好的 Bean 发送信息到消息队列
@Service
public class UserService {
// 引入Queue 形式发送字符串的方法
@Resource
private Queue emailQueue;
// 引入Topic 形式发送字符串的方法
@Resource
private Topic userTopic;
// 引入Queue 形式发送对象的方法
@Resource
private Queue messageQueue;
// 引入实体类JmsMessagingTemplate
@Resource
private JmsMessagingTemplate jmsMessagingTemplate;
// 发送字符串到Queue 形式的消息队列
public void register(String username) {
//1.把用户信息插入到数据库
System.out.println("插入数据库" + username);
//2.把用户信息放到消息队列中
// 第一个参数 消息对例的名字 , GenericMessage<> 形式的字符串
Message<String> message = new GenericMessage<>(username);
this.jmsMessagingTemplate.send(emailQueue, message);
}
// 发送字符串到Topic 形式的消息队列
public void login(String username) {
// 第一个参数 消息对例的名字 , GenericMessage<> 形式的字符串
Message<String> message = new GenericMessage<>(username);
this.jmsMessagingTemplate.send(userTopic, message);
}
// 发送对象到Queue 形式的消息对列
public void send(User user) {
this.jmsMessagingTemplate.convertAndSend(messageQueue, user);
}
}
创建实体类EmailConsumer 来消费里面的信息
@Component
public class EmailConsumer {
// @JmsListener( 参数一 对列的格式 , 参数二 与配置文件方法名相对应)
// 用来消费Queue 消息
@JmsListener(destination = JmsConfig.Quene_SEND_EMAIL, containerFactory = "queueFactory")
public void receive(String message) {
//执行真正发送邮件的功能
System.out.println(message);
}
// 用来消费Topic1 消息
@JmsListener(destination = JmsConfig.TOPIC_USER, containerFactory = "topicFactory")
public void receiveTopic1(String message) {
//执行真正发送邮件的功能
System.out.println("客户端1" + message);
}
@JmsListener(destination = JmsConfig.TOPIC_USER, containerFactory = "topicFactory")
public void receiveTopic2(String message) {
//执行真正发送邮件的功能
System.out.println("客户端2" + message);
}
@JmsListener(destination = JmsConfig.TOPIC_USER, containerFactory = "topicFactory")
public void receiveTopic3(String message) {
//执行真正发送邮件的功能
System.out.println("客户端3" + message);
}
// 接收消费对象
@JmsListener(destination = JmsConfig.QUEUE_EMAIL, containerFactory = "queueFactory")
public void sends(User message) {
System.out.println("回掉成功了");
System.out.println("收件人" + message.getTo());
System.out.println("标题" + message.getTitle());
System.out.println("内容" + message.getText());
}
}