activeMQ安裝與使用,以及與Spring整合

該文章基於《Spring源碼深度解析》撰寫,感謝郝佳老師的奉獻

ActiveMQ Demo

JMS作爲JavaEE的規範之一,它的實現產品ActiveMQ一直佔有極高的市場份額,下面通過一個小Demo來展示ActiveMQ的用法:
首先需要下載ActiveMQ,然後進入bin目錄,選擇32位系統或者64位系統下的activemq.bat進行運行,然後將activeMQ目錄下的lib中的jar文件導入到我們的項目中,接下來我們開始編寫發送端和接收端,該工程的架構如下
這裏寫圖片描述

/*Reciver.java*/
import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

public class Reciver {
    public static void main(String[] args) throws JMSException {
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
        Connection connection = connectionFactory.createConnection();
        connection.start();
        final Session session = connection.createSession(Boolean.TRUE,Session.AUTO_ACKNOWLEDGE);
        Destination destination = session.createQueue("my-queue");
        MessageConsumer consumer = session.createConsumer(destination);
        int i = 0;
        while(i < 3){
            i++;
            TextMessage message = (TextMessage) consumer.receive();
            session.commit();
            System.out.println("收到消息"+message.getText());
        }
        session.close();
        connection.close();
    }
}
/*Sender.java*/
import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

public class Sender {
    public static void main(String[] args) throws JMSException, InterruptedException {
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
        Connection connection = connectionFactory.createConnection();
        Session session = connection.createSession(Boolean.TRUE,Session.AUTO_ACKNOWLEDGE);
        Destination destination = session.createQueue("my-queue");
        MessageProducer producer = session.createProducer(destination);
        for(int i = 0; i < 3; i++){
            TextMessage message = session.createTextMessage("大家好這是個測試");
            Thread.sleep(1000);
            producer.send(message);
        }
        session.commit();
        session.close();
        connection.close();
//        System.out.println("good");
    }
}

先運行Sender的函數,在運行Receiver,就可以得到如下結果:
結果

Spring整合ActiveMQ

項目架構如下:
工程架構
其中各個文件的代碼如下

<!--applicationContext-ActiveMQ.xml-->
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-4.1.xsd">
    <bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
        <property name="brokerURL">
            <value>tcp://localhost:61616</value>
        </property>
    </bean>

    <bean id="jmstemplate" class="org.springframework.jms.core.JmsTemplate">
        <property name="connectionFactory">
            <ref bean="connectionFactory"/>
        </property>
    </bean>

    <bean id="destination" class="org.apache.activemq.command.ActiveMQQueue">
        <constructor-arg index="0">
            <value>HelloWorldQueue</value>
        </constructor-arg>
    </bean>
</beans>
<!--web.xml-->
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
          http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         version="3.0">

    <display-name>Archetype Created Web Application</display-name>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

</web-app>
/*HelloWorldSender.java*/
package Sender;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jms.core.JmsTemplate;

import javax.jms.Destination;
import java.io.File;

public class HelloWorldSender {
    public static void main(String[] args){
        ApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"applicationContext-ActiveMQ.xml"});
        File file = new File("/");
        System.out.println(file.getAbsolutePath());

        for(String str :context.getBeanDefinitionNames()){
            System.out.println(str);
        }
        JmsTemplate jmsTemplate = (JmsTemplate) context.getBean("jmstemplate");
        Destination destination = (Destination) context.getBean("destination");

        jmsTemplate.send(destination, session -> session.createTextMessage("大家好這是個測試"));
    }
}
/*HelloWorldReciver.java*/
package Reciver;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jms.core.JmsTemplate;

import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.TextMessage;

public class HelloWorldReciver {
    public static void main(String[] args) throws JMSException {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext-ActiveMQ.xml");
        JmsTemplate jmsTemplate = (JmsTemplate) context.getBean("jmstemplate");
        Destination destination = (Destination) context.getBean("destination");
        TextMessage msg = (TextMessage)jmsTemplate.receive(destination);
        System.out.println("recived msg is:"+msg.getText());
    }
}

運行規則同單獨使用activeMQ相同,所以此處不再贅述。
上面方法的問題在於jmsTemplate.receive(destination);只能接受一次消息,如果未接收到消息,則會一直等到。通過消息監聽器可以更好的處理這個問題,下面爲工程的架構
activeMQ監聽器
下面給出關於源代碼

/*MyMessageListener.java*/
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;

public class MyMessageListener implements MessageListener{

    @Override
    public void onMessage(Message message) {
        TextMessage msg = (TextMessage)message;
        try {
            System.out.println(msg.getText());
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }
}
/*HelloWorldSender.java*/
package Sender;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jms.core.JmsTemplate;

import javax.jms.Destination;
import java.io.File;

public class HelloWorldSender {
    public static void main(String[] args){
        ApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"applicationContext-ActiveMQ.xml"});
        JmsTemplate jmsTemplate = (JmsTemplate) context.getBean("jmstemplate");
        Destination destination = (Destination) context.getBean("destination");

        jmsTemplate.send(destination, session -> session.createTextMessage("大家好這是個測試"));
    }
}
<!--applicationContext-ActiveMQ.xml-->
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-4.1.xsd">
    <bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
        <property name="brokerURL">
            <value>tcp://localhost:61616</value>
        </property>
    </bean>

    <bean id="jmstemplate" class="org.springframework.jms.core.JmsTemplate">
        <property name="connectionFactory">
            <ref bean="connectionFactory"/>
        </property>
    </bean>

    <bean id="destination" class="org.apache.activemq.command.ActiveMQQueue">
        <constructor-arg index="0">
            <value>HelloWorldQueue</value>
        </constructor-arg>
    </bean>
    <bean id="myTextListener" class="Listener.MyMessageListener"/>
    <bean id="javaConsumer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
        <property name="connectionFactory" ref="connectionFactory"/>
        <property name="destination" ref="destination"/>
        <property name="messageListener" ref="myTextListener"/>
    </bean>
</beans>

運行上面的代碼,將會出現下面的結果
結果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章