maven構(gòu)建springmvc+activeMQ

一叁熔、簡介

關(guān)于jms,請參閱https://docs.oracle.com/javaee/6/tutorial/doc/bncdr.html床牧,看內(nèi)容是做rpc服務(wù)的東西荣回,公司用的是weblogic自帶的jms,其實(shí)原理差不多戈咳,都是創(chuàng)建一個消息工廠心软,添加隊列,從隊列中發(fā)消息著蛙;現(xiàn)在應(yīng)該不少公司再用dubbo和zookeeper做吧删铃,這個以后再研究。

二踏堡、使用

1.添加依賴

       <!-- activemq -->
        <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>

        <!-- xbean 如<amq:connectionFactory /> -->
        <dependency>
            <groupId>org.apache.xbean</groupId>
            <artifactId>xbean-spring</artifactId>
            <version>3.16</version>
        </dependency>

2.生產(chǎn)消費(fèi)者模式猎唁,其實(shí)就是發(fā)送者和接收者

package com.web.jms.service;

import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import javax.jms.*;

@Service
public class ProducerService {

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

    @Resource(name = "queueDestination")
    private Destination responseDestination;

    public void sendMessage(final String msg){
        System.out.println(">>>>\n"+Thread.currentThread().getName()+" 向隊列"+responseDestination+"發(fā)送消息---------------------->"+msg);
        jmsTemplate.send(new MessageCreator() {
            public Message createMessage(Session session) throws JMSException {
                TextMessage textMessage = session.createTextMessage(msg);
                textMessage.setJMSReplyTo(responseDestination);
                return textMessage;
            }
        });
    }
}

消費(fèi)者

package com.web.jms.service;

import org.springframework.jms.core.JmsTemplate;
import org.springframework.stereotype.Service;

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

@Service
public class ConsumerService {

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

    public TextMessage 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;
    }
}

3.消費(fèi)者監(jiān)聽

package com.web.jms.listener;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;

public class JmsListener implements MessageListener {

    public void onMessage(Message message) {
        TextMessage textMsg = (TextMessage) message;
        try {
            System.out.println("接收到了消息,消息內(nèi)容是:" + textMsg.getText());
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }
}

4.errorhandler

package com.web.jms.handler;

import org.springframework.stereotype.Service;
import org.springframework.util.ErrorHandler;

@Service
public class JmsErrorHandler implements ErrorHandler{

    public void handleError(Throwable throwable) {
        System.out.println("出錯了顷蟆!");
        throwable.printStackTrace();
    }
}

5.配置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"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:amq="http://activemq.apache.org/schema/core"
       xmlns:jms="http://www.springframework.org/schema/jms"
       xmlns:mvc="http://www.alibaba.com/schema/stat"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop-4.1.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx-4.1.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-4.1.xsd
        http://activemq.apache.org/schema/core
        http://activemq.apache.org/schema/core/activemq-core-5.7.0.xsd
        http://www.alibaba.com/schema/stat http://www.alibaba.com/schema/stat.xsd
        http://www.springframework.org/schema/jms
        http://www.springframework.org/schema/jms/spring-jms-4.1.xsd ">


    <context:annotation-config />

    <!-- ActiveMQ 連接工廠 -->
    <!-- 真正可以產(chǎn)生Connection的ConnectionFactory胖秒,由對應(yīng)的 JMS服務(wù)廠商提供-->
    <!-- 如果連接網(wǎng)絡(luò):tcp://ip:61616缎患;未連接網(wǎng)絡(luò):tcp://localhost:61616 以及用戶名,密碼-->
    <amq:connectionFactory id="amqConnectionFactory"
                           brokerURL="tcp://localhost:61616"
                           userName="admin" password="admin"  />

    <!-- Spring Caching連接工廠 -->
    <!-- Spring用于管理真正的ConnectionFactory的ConnectionFactory -->
    <bean id="connectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
        <!-- 目標(biāo)ConnectionFactory對應(yīng)真實(shí)的可以產(chǎn)生JMS Connection的ConnectionFactory -->
        <property name="targetConnectionFactory" ref="amqConnectionFactory"></property>
        <!-- 同上阎肝,同理 -->
        <!-- <constructor-arg ref="amqConnectionFactory" /> -->
        <!-- Session緩存數(shù)量 -->
        <property name="sessionCacheSize" value="100" />
    </bean>

    <!-- Spring JmsTemplate 的消息生產(chǎn)者 start-->

    <!-- 定義JmsTemplate的Queue類型 -->
    <bean id="jmsQueueTemplate" class="org.springframework.jms.core.JmsTemplate">
        <!-- 這個connectionFactory對應(yīng)的是我們定義的Spring提供的那個ConnectionFactory對象 -->
        <constructor-arg ref="connectionFactory" />
        <!-- 非pub/sub模型(發(fā)布/訂閱),即隊列模式 -->
        <property name="pubSubDomain" value="false" />
        <property name="defaultDestination" ref="queueDestination" />
    </bean>

    <!--Spring JmsTemplate 的消息生產(chǎn)者 end-->

    <!-- 消息消費(fèi)者 start-->

    <!-- 配置消息隊列監(jiān)聽者(Queue) -->
    <bean id="queueMessageListener" class="com.web.jms.listener.JmsListener" />

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

    <bean id="JmsErrorHandler" class="com.web.jms.handler.JmsErrorHandler"></bean>

    <!-- 消息消費(fèi)者 end -->

    <!-- 定義隊列目的地 嫉父,點(diǎn)對點(diǎn) -->
    <bean id="queueDestination" class="org.apache.activemq.command.ActiveMQQueue">
        <constructor-arg>
            <value>queue</value>
        </constructor-arg>
    </bean>

</beans>

6.web.xml中添加啟動文件

<!-- 1.針對Spring配置:讀取配置文件 -->
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
      classpath:config/applicationContext.xml,
      classpath:config/applicationContext-ActiveMQ.xml
    </param-value>
  </context-param>

7.controller

package com.web.jms.controller;

import com.web.jms.service.ConsumerService;
import com.web.jms.service.ProducerService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.annotation.Resource;
import javax.jms.Destination;
import javax.jms.TextMessage;
import java.text.SimpleDateFormat;
import java.util.Date;

@Controller
@RequestMapping("/jms")
public class JmsController {

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

    //隊列消息生產(chǎn)者
    @Autowired
    private ProducerService producer;

    //隊列消息消費(fèi)者
    @Autowired
    private ConsumerService consumer;

    @RequestMapping(value = "/SendMessage", method = RequestMethod.GET)
    @ResponseBody
    public void send() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:ss");
        String msg = sdf.format(new Date());
        System.out.println(Thread.currentThread().getName()+"------------send to jms Start");
        producer.sendMessage(msg);
        System.out.println(Thread.currentThread().getName()+"------------send to jms End");
    }

    @RequestMapping(value= "/ReceiveMessage",method = RequestMethod.GET)
    @ResponseBody
    public void receive(){
        System.out.println(Thread.currentThread().getName()+"------------receive from jms Start");
        TextMessage tm = consumer.receive(destination);
        System.out.println(Thread.currentThread().getName()+"------------receive from jms End");
    }
}

-end-

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末沛硅,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子绕辖,更是在濱河造成了極大的恐慌摇肌,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件仪际,死亡現(xiàn)場離奇詭異围小,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)树碱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進(jìn)店門肯适,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人成榜,你說我怎么就攤上這事框舔。” “怎么了赎婚?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵刘绣,是天一觀的道長。 經(jīng)常有香客問我挣输,道長纬凤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任歧焦,我火速辦了婚禮移斩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘绢馍。我一直安慰自己向瓷,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布舰涌。 她就那樣靜靜地躺著猖任,像睡著了一般。 火紅的嫁衣襯著肌膚如雪瓷耙。 梳的紋絲不亂的頭發(fā)上朱躺,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天刁赖,我揣著相機(jī)與錄音,去河邊找鬼长搀。 笑死宇弛,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的源请。 我是一名探鬼主播枪芒,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼谁尸!你這毒婦竟也來了舅踪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤良蛮,失蹤者是張志新(化名)和其女友劉穎抽碌,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體决瞳,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡货徙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了瞒斩。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片破婆。...
    茶點(diǎn)故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖胸囱,靈堂內(nèi)的尸體忽然破棺而出祷舀,到底是詐尸還是另有隱情,我是刑警寧澤烹笔,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布裳扯,位于F島的核電站,受9級特大地震影響谤职,放射性物質(zhì)發(fā)生泄漏饰豺。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一允蜈、第九天 我趴在偏房一處隱蔽的房頂上張望冤吨。 院中可真熱鬧,春花似錦饶套、人聲如沸漩蟆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽怠李。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間捺癞,已是汗流浹背夷蚊。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留髓介,地道東北人惕鼓。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像唐础,于是被迫代替她去往敵國和親呜笑。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評論 2 351

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

  • ActiveMQ 即時通訊服務(wù) 淺析http://www.cnblogs.com/hoojo/p/active_m...
    bboymonk閱讀 1,482評論 0 11
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,778評論 6 342
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理彻犁,服務(wù)發(fā)現(xiàn),斷路器凰慈,智...
    卡卡羅2017閱讀 134,638評論 18 139
  • ActiveMQ 簡介:ActiveMQ 是Apache出品汞幢,最流行的,能力強(qiáng)勁的開源消息總線微谓。ActiveMQ ...
    CoderZS閱讀 2,666評論 0 23
  • 十八歲我們有太多的憧憬 幻想一場美輪美奐的旅行 那時的高三奮書于學(xué)海 卻始終每天抱著夢想進(jìn)去自己的小世界 學(xué)霸的心...
    Treasure瑩閱讀 134評論 0 1