ActiveMQ安裝與使用(windwos)

![51%71ZMOPR]O154T3CNI$@1.png](http://upload-images.jianshu.io/upload_images/3269064-2b5de5b351294297.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

1. ActiveMQ安裝

1.1 下載(版本5.14.5)

點我官網(wǎng)下載

1.2 安裝

解壓下載的壓縮文件到任意目錄中(eg. C:\Program Files (x86)\apache-activemq-5.14.5)革为,進(jìn)入%ACTIVEMQ_HOME%/bin目錄匙奴,根據(jù)自己的系統(tǒng)位數(shù)小压,進(jìn)入32/64目錄艇潭,點擊activemq.bat啟動ActiveMQ囤攀;

2. ActiveMQ與Spring整合使用

2.1 在Maven中添加ActiveMQ和JMS相關(guān)的pom,如下:
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jms</artifactId>
            <version>4.2.5.RELEASE</version>
        <!--<version>{spring.version}</version>-->
        </dependency>
        
        <!-- xbean 如<amq:connectionFactory /> -->
        <dependency>
            <groupId>org.apache.xbean</groupId>
            <artifactId>xbean-spring</artifactId>
            <version>3.16</version>
        </dependency>
        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-core</artifactId>
            <version>5.7.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-pool</artifactId>
            <version>5.12.1</version>
        </dependency>
2.2 添加配置文件spring-activemq.xml

在配置文件中加入以下配置信息裁赠,每個配置信息都有具體的解釋:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:amq="http://activemq.apache.org/schema/core" 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-2.0.xsd
        http://activemq.apache.org/schema/core 
        http://activemq.apache.org/schema/core/activemq-core.xsd">

    <!--配置連接ActiveMQ的連接基本信息 -->
    <amq:connectionFactory id="amqConnectionFactory"
        brokerURL="tcp://localhost:61616" userName="admin" password="admin" />

    <!-- 配置JMS連接工廠 -->
    <bean id="connectionFactory"
        class="org.springframework.jms.connection.CachingConnectionFactory">
        <constructor-arg ref="amqConnectionFactory" />
        <property name="sessionCacheSize" value="100" />
    </bean>

    <!-- 定義消息隊列(Queue) -->
    <bean id="demoQueueDestination" class="org.apache.activemq.command.ActiveMQQueue">
        <!-- 設(shè)置消息隊列的名字 -->
        <constructor-arg>
            <value>testQueue</value>
        </constructor-arg>
    </bean>

    <!-- 配置JMS模板(Queue)问窃,Spring提供的JMS工具類,它發(fā)送傻寂、接收消息息尺。 -->
    <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
        <property name="connectionFactory" ref="connectionFactory" />
        <property name="defaultDestination" ref="demoQueueDestination" />
        <property name="receiveTimeout" value="10000" />
        <!-- true是topic,false是queue疾掰,默認(rèn)是false -->
        <property name="pubSubDomain" value="false" />
    </bean>

    <!-- 配置消息隊列監(jiān)聽者(Queue) -->
    <!-- 打開監(jiān)聽器搂誉,會立即去消費消息(即,起到實時消費通信的作用) -->
    <!-- <bean id="queueMessageListener" class="com.hp.common.listener.QueueMessageListener"></bean> -->

    <!-- 顯示注入消息監(jiān)聽容器(Queue)静檬,配置連接工廠炭懊,監(jiān)聽的目標(biāo)是demoQueueDestination,監(jiān)聽器是上面定義的監(jiān)聽器 -->
    <!-- <bean id="queueListenerContainer"
        class="org.springframework.jms.listener.DefaultMessageListenerContainer">
        <property name="connectionFactory" ref="connectionFactory" />
        <property name="destination" ref="demoQueueDestination" />
        <property name="messageListener" ref="queueMessageListener" />
    </bean>
 -->
</beans>

注:在配置文件中拂檩,一定不要忘記加入ActiveMQ和JMS相關(guān)的schema

2.3 創(chuàng)建Producer和Consumer相關(guān)的Service

創(chuàng)建ProducerService侮腹,用于發(fā)送信息到消息中心

@Service
public class ProducerService {

    @Resource(name = "jmsTemplate")
    private JmsTemplate jmsTemplate;

    private Queue queue;

    /**
     * 根據(jù)目的地發(fā)送消息
     */
    public void sendMessage(Destination destination, final String msg) {
        System.out.println(Thread.currentThread().getName() + " 向隊列" + destination.toString()
                + "發(fā)送消息------->" + msg);
        jmsTemplate.send(destination, new MessageCreator() {
            public Message createMessage(Session session) throws JMSException {
                return session.createTextMessage(msg);
            }
        });
    }
    public String send(String userId, String msg) {
        System.out.println(
                Thread.currentThread().getName() + " 向 " + userId + " 的隊列" + userId.toString() + "發(fā)送消息------>" + msg);
        queue = new ActiveMQQueue(userId);
        jmsTemplate.send(queue, new MessageCreator() {

            @Override
            public Message createMessage(Session session) throws JMSException {
                TextMessage message=session.createTextMessage(msg);
                message.setStringProperty(userId, msg);
                return message;
            }
        });
        return "發(fā)送成功";

    }

    /**
     * 向默認(rèn)目的地發(fā)送消息
     */
    public String sendMessage(final String msg) {
        String destination = jmsTemplate.getDefaultDestinationName();
        System.out
                .println(Thread.currentThread().getName() + " 向隊列" + destination + "發(fā)送消息---------------------->" + msg);
        jmsTemplate.send(new MessageCreator() {
            public Message createMessage(Session session) throws JMSException {
                return session.createTextMessage(msg);
            }
        });
        return "發(fā)送成功";
    }

}

創(chuàng)建ConsumerService,用于接受消息


@Service
public class ConsumerService{

    @Resource(name = "jmsTemplate")
    private JmsTemplate jmsTemplate;

    public String receive(Destination destination) {
        TextMessage textMessage = (TextMessage) jmsTemplate.receive(destination);
        try {
            System.out.println("從隊列" + destination.toString() + "收到了消息:\t" + textMessage.getText());
        } catch (JMSException e) {
            e.printStackTrace();
        }
        return textMessage.toString();
    }

    public String receive(String userId) {
        Queue queue=new ActiveMQQueue(userId+"?consumer.prefetchSize=4");
        Message message = null;
        String property=null;
        
        try {
            
             message=jmsTemplate.receive(queue);
             property=message.getStringProperty(userId);
            System.out.println("從隊列" + queue.toString() + "收到了消息:\t" + property);
        } catch (JMSException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        return property;
    }

}
2.4 添加Controller稻励,用于曝露接口
@Controller
@RequestMapping(value="/mq")
public class MessageController {
    private Logger logger = Logger.getLogger(MessageController.class);

    @Resource(name = "demoQueueDestination")
    private Destination destination;

    @Autowired
    private ProducerService producer;

    @Autowired
    private ConsumerService consumer;
    

    @RequestMapping(value = "/SendMessage", method = RequestMethod.POST,produces="application/json")
    @ResponseBody
    public void send(@RequestParam(value = "userId",required=false)String userId,@RequestParam(value = "msg")String msg) {
        logger.info(Thread.currentThread().getName() + "------------send to jms Start");
        if (userId==null||"".equals(userId)) {
            producer.sendMessage(destination, msg);
        }else {
            producer.send(userId, msg);
        }
        
        logger.info(Thread.currentThread().getName() + "------------send to jms End");
    }

    @RequestMapping(value = "/ReceiveMessage", method = RequestMethod.GET)
    @ResponseBody
    public Object receive(@RequestParam(value = "userId",required=false)String userId) {
        logger.info(Thread.currentThread().getName() + "------------receive from jms Start");
        String tm=null;
        if (userId==null||"".equals(userId)) {
             tm = consumer.receive(destination);
        } else {
             tm = consumer.receive(userId);
        }
        logger.info(Thread.currentThread().getName() + "------------receive from jms End");
        return tm.toString();
    }

}
2.5 配置監(jiān)聽器(ek)

如果在配置文件中打開了監(jiān)聽器的注釋父阻,即打開監(jiān)聽器,消費者會立即去消費消息望抽,則還需要添加如下代碼:

public class QueueMessageListener implements MessageListener{

    @Override
    public void onMessage(Message message) {
        TextMessage tm=(TextMessage) message;
        try {
            System.out.println("QueueMessageListener監(jiān)聽到了文本消息:\t"
                    + tm.getText());
            //do other work
        } catch (JMSException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

3. 測試

啟動tomcat至非,將Javaweb項目運行在tomcat中,通過postman測試接口和方法
接受消息接口:http://localhost:8080/{project_neme}/mq/ReceiveMessage?userId={消息隊列名稱}
發(fā)送消息接口:http://localhost:8080/{project_neme}/mq/SendMessage?userId={消息隊列名稱}&msg={參數(shù)}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末糠聪,一起剝皮案震驚了整個濱河市荒椭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌舰蟆,老刑警劉巖趣惠,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件狸棍,死亡現(xiàn)場離奇詭異,居然都是意外死亡味悄,警方通過查閱死者的電腦和手機草戈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來侍瑟,“玉大人唐片,你說我怎么就攤上這事≌茄眨” “怎么了费韭?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長庭瑰。 經(jīng)常有香客問我星持,道長,這世上最難降的妖魔是什么弹灭? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任督暂,我火速辦了婚禮,結(jié)果婚禮上穷吮,老公的妹妹穿的比我還像新娘逻翁。我一直安慰自己,他們只是感情好捡鱼,可當(dāng)我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布卢未。 她就那樣靜靜地躺著,像睡著了一般堰汉。 火紅的嫁衣襯著肌膚如雪辽社。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天翘鸭,我揣著相機與錄音滴铅,去河邊找鬼。 笑死就乓,一個胖子當(dāng)著我的面吹牛汉匙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播生蚁,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼噩翠,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了邦投?” 一聲冷哼從身側(cè)響起伤锚,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎志衣,沒想到半個月后屯援,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體猛们,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年狞洋,在試婚紗的時候發(fā)現(xiàn)自己被綠了弯淘。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡吉懊,死狀恐怖庐橙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情借嗽,我是刑警寧澤态鳖,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站淹魄,受9級特大地震影響郁惜,放射性物質(zhì)發(fā)生泄漏堡距。R本人自食惡果不足惜甲锡,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望羽戒。 院中可真熱鬧缤沦,春花似錦、人聲如沸易稠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽驶社。三九已至企量,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間亡电,已是汗流浹背届巩。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留份乒,地道東北人恕汇。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像或辖,于是被迫代替她去往敵國和親瘾英。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內(nèi)容