在項目開始導包時 導入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());
}
}