在项目开始导包时 导入ActiveMQ
spring
先来介绍一次下ActiveMQ(消息队列)数据库
*消息队列
JMS ,Java定义的一系列接口, ActiveMQ是JMS的实现并发
处理高并发/应用解耦tcp
队列有两个类型:
1.Queue
网Queue中放的消息,同时只能由一个客户端消费
若是没哟客户端,那么这个消息会一直存放在Queue
直到某个客户端进行消费
2,Topic
往Topic中放的消息,同时会被对多个客户端消费(1对多)
若是消息队列
JMS ,Java定义的一系列接口, ActiveMQ是JMS的实现高并发
处理高并发/应用解耦this
队列有两个类型:
1.Queue
网Queue中放的消息,同时只能由一个客户端消费
若是没哟客户端,那么这个消息会一直存放在Queue
直到某个客户端进行消费
2,Topic
往Topic中放的消息,同时会被对多个客户端消费(1对多)
若是消息队列
JMS ,Java定义的一系列接口, ActiveMQ是JMS的实现url
处理高并发/应用解耦code
队列有两个类型:
1.Queue
网Queue中放的消息,同时只能由一个客户端消费
若是没哟客户端,那么这个消息会一直存放在Queue
直到某个客户端进行消费.
2,Topic
往Topic中放的消息,同时会被对多个客户端消费(1对多)
若是没有客户端,那么这个消息就会丢失.对象
使用的是被人配置好的ActiveMQ镜像blog
在配置文件中配置好 端口映射 与用户名 密码
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()); } }