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