ActiveMQ 傳送字符串與傳送對象

在項目開始導包時 導入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());
     }
}
相關文章
相關標籤/搜索