1. 程式人生 > >ActiveMQ-基礎菜鳥篇

ActiveMQ-基礎菜鳥篇

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 !!!");
	}

}