ActiveMQ-基礎菜鳥篇
阿新 • • 發佈:2018-12-10
ActiveMQ是Apache的一個開源專案,它是一個能力強勁的開源訊息匯流排,也是一箇中間件產品。它是JMS的一個實現。 在介紹ActiveMQ之前,先來複習一下J2EE中的JMS規範。 JMS是Java Message Service的簡稱,用來發送非同步訊息,在不同系統和不同的模組之間我們可以利用它實現整合。 JMS有兩個好處,第一個就是讓模組之間或者系統之間的耦合度降低,第二個是非同步通訊。 JMS的訊息機制有2種模型,一種是Point to Point,表現為佇列的形式。傳送的訊息,只能被一個接收者取走;另一種是Topic,可以被多個訂閱者訂閱,類似於群發。
在JMS中有這樣幾個重要的核心介面和類:
- ConnectionFactory,用於jms client獲取與jms provider的連線。不同的jms產品,對這個介面有不同的實現,比如說ActiveMQ,這個介面的實現類是ActiveMQConnectionFactory
- Connection,是由ConnectionFactory產生的,表示jms client與jms provider的連線
- Session,是由Connection產生的,表示一個會話。Session是關鍵元件,Message、Producer/Consumer、Destination都是在Session上建立的
- Message,這個元件很好理解,就是傳輸的訊息,裡面包括head、properties、body,其中head是必選的
- Destination,是訊息源,對傳送者來說,就是訊息發到哪裡;對接收者來說,就是從哪裡取訊息。Destination有2個子介面,Queue和Topic,分別對應上面提到的2種模型
- MessageProducer,是訊息傳送者。(以上copy-詮釋懶癌)。
-----------------以下是菜鳥旅程--------------------
安裝:
在windows下安裝,下載即可,不多說。
這個錯誤是由於JDK版本不是1.8導致的。
碼磚:
環境:IDEA+SpringBoot
這是是配置類:
1.配置不同訊息模型對應的ListenerContainerFactory,預設為false,適用於Queue型別的訊息模式。如果使用Topic型別則徐更改pubSubDomain為true。
[email protected]註解,在啟動時進行加進容器。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jms.config.JmsListenerContainerFactory;
import org.springframework.jms.config.SimpleJmsListenerContainerFactory;
import javax.jms.ConnectionFactory;
@Configuration
public class ActiveMQConfig {
@Bean(name="queueFactory")
JmsListenerContainerFactory queueFactory(ConnectionFactory connectionFactory){
SimpleJmsListenerContainerFactory factory = new SimpleJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setPubSubDomain(false);
return factory;
}
@Bean(name="topicFactory")
JmsListenerContainerFactory topicFactory(ConnectionFactory connectionFactory){
SimpleJmsListenerContainerFactory factory = new SimpleJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setPubSubDomain(true);//預設為false。topic型別的必須設定為true。
return factory;
}
}
訊息生產者
Destination 在用於指定訊息模型,des引數類似於令牌。消費者只有與des保持一致,才能收到訊息。
import org.apache.activemq.command.ActiveMQQueue;
import org.apache.activemq.command.ActiveMQTopic;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import javax.jms.Destination;
@Component
public class Producer {
@Resource
JmsMessagingTemplate jmsMessagingTemplate;
public void sendMessage(String des,String message){
Destination destination = new ActiveMQQueue(des);
jmsMessagingTemplate.convertAndSend(destination,message);
}
public void publishMessage(String des,String message){
Destination destination = new ActiveMQTopic(des);
jmsMessagingTemplate.convertAndSend(destination,message);
}
}
訊息消費者
import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component;
@Component
public class Consumer {
@JmsListener(destination = "test.queue" ,containerFactory = "queueFactory")
public void receiveMsg(String message){
System.out.println("receive message : " + message);
}
@JmsListener(destination = "test.topic",containerFactory = "topicFactory")
public void subMsg(String message){
System.out.println("receive message : " + message);
}
}
配置檔案 application.properties
spring.activemq.broker-url=tcp://localhoust:61616
spring.activemq.user=admin
spring.activemq.password=admin
核心依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
測試類
import com.panda.activemq.demo.producer.Producer;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.Resource;
@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoApplicationTests {
@Resource
Producer producer ;
@Test
public void contextLoads() {
producer.sendMessage("test.queue","here has more queue message !");
producer.publishMessage("test.topic","here has more topic message !!!");
}
}