Springboot + DWR 實(shí)現(xiàn)消息推送

SpringBoot 整合 dwr ,實(shí)現(xiàn) js 直接調(diào)用后端 Service.

前一段時(shí)間由于工作需要接觸到了dwr,使用dwr將mq接收到的消息推送到前臺(tái)厌衙,最近項(xiàng)目改用springboot隆判,因此又去重新回爐了一下。
1.新建springboot項(xiàng)目,添加下面dwr的依賴文件

       <!-- DWR -->
        <dependency>
            <groupId>org.directwebremoting</groupId>
            <artifactId>dwr</artifactId>
            <version>3.0.2-RELEASE</version>
        </dependency>

2.添加spring.xml,配置dwr掃描
spring.xml 內(nèi)容:

<?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:dwr="http://www.directwebremoting.org/schema/spring-dwr"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.directwebremoting.org/schema/spring-dwr http://www.directwebremoting.org/schema/spring-dwr-3.0.xsd">

    <dwr:annotation-config/>

    <dwr:annotation-scan scanRemoteProxy="false" base-package="com.hikvision.lcc.dwr"/>

    <dwr:configuration/>
</beans>

springboot 需要加載spring.xml罐寨,在啟動(dòng)類中做如下配置:

@SpringBootApplication
@ImportResource("classpath*:spring/spring.xml")
public class Demo2Application {
    public static void main(String[] args) {
        SpringApplication.run(Demo2Application.class, args);
    }
}
  1. 之前項(xiàng)目用到的是dwr.xml進(jìn)行配置自沧,在springboot中我們需要用Java代碼進(jìn)行配置,配置類如下:

@Configuration
public class DwrConfig {

    /**
     *  加入 DWR servlet明刷,相當(dāng)于在xml中配置
     * @return
     */
    @Bean
    public ServletRegistrationBean servletRegistrationBean() {
       DwrSpringServlet servlet = new DwrSpringServlet();
        ServletRegistrationBean registrationBean = new ServletRegistrationBean(servlet, "/dwr/*");
        //設(shè)置成true使DWR能夠debug和進(jìn)入測試頁面婴栽。
        registrationBean.addInitParameter("debug", "true");
        //pollAndCometEnabled 設(shè)置成true能增加服務(wù)器的加載能力,盡管DWR有保護(hù)服務(wù)器過載的機(jī)制辈末。
        registrationBean.addInitParameter("pollAndCometEnabled", "true");
        
        registrationBean.addInitParameter("activeReverseAjaxEnabled", "true");
        registrationBean.addInitParameter("maxWaitAfterWrite", "60");
        return registrationBean;
    }
}

4.基本配置結(jié)束愚争,先寫個(gè)小小的demo一下映皆。新建一個(gè)service類

@Service
@RemoteProxy  // spring 的注解,相當(dāng)于暴露服務(wù)
public class DemoDwr {
    //TODO  這塊可以注入服務(wù)
    @RemoteMethod
    public String hello(){
        return "hello  dada " ;
    }
    @RemoteMethod
    public String echo(String  string){
        return "hello   " + string ;
    }
}

接著寫一個(gè)簡單的html來個(gè)階段性測試轰枝。
demo.html

<html>
<head>
    <title></title>
    <script type='text/javascript' src='/dwr/engine.js'></script>
    <script type='text/javascript' src='/dwr/interface/DemoDwr.js'></script>
    
</head>
hello
<script>
    DemoDwr.echo('叫我小司馬', function (str) {
        alert(str);
    });
</script>
</html>

運(yùn)行項(xiàng)目捅彻,刷新一下頁面就可以感受到自己的勞動(dòng)成果了。



*****************************************我是華麗的分割線******************************************
你以為這就結(jié)束了鞍陨,萬里長征才走了幾米遠(yuǎn).... 接著我們進(jìn)入進(jìn)階測試步淹。


5.接著我簡單演示一下如何從后端推送到前端消息。
先寫一個(gè)DWR工具類DwrScriptSessionManagerUtil诚撵,可以直接拷貝缭裆,一般變化不大。

public class DwrScriptSessionManagerUtil extends DwrServlet {
    private static final long serialVersionUID = -7504612622407420071L;
    public void init(final String key, final String value) throws ServletException {
        Container container = ServerContextFactory.get().getContainer();
        ScriptSessionManager manager = container.getBean(ScriptSessionManager.class);
        ScriptSessionListener listener = new ScriptSessionListener() {
            public void sessionCreated(ScriptSessionEvent ev) {
                HttpSession session = WebContextFactory.get().getSession();
                //String userId = ((User) session.getAttribute("userinfo")).getHumanid() + "";
                System.out.println("a ScriptSession is created!");
                ev.getSession().setAttribute(key, value);
            }
            public void sessionDestroyed(ScriptSessionEvent ev) {
                System.out.println("a ScriptSession is distroyed");
            }
        };
        manager.addScriptSessionListener(listener);

    }

}

假如你已經(jīng)有一個(gè)加收消息的類DemoConsumer寿烟,如果mq不熟悉的建議先補(bǔ)一補(bǔ)去幼驶,在這我就不細(xì)說了。我的消費(fèi)者代碼大概如下韧衣,牽扯到業(yè)務(wù)會(huì)自行略去盅藻。

@Service
@RemoteProxy
public class Demo2Consumer extends AbstractSpringNotifyConsumer {
   //保存scriptSession , 這個(gè)方法需要在頁面剛已加載的時(shí)候調(diào)用畅铭,為了前端和后端建立連接氏淑。
    @RemoteMethod
    public void onPageLoad(String tag) {
        //獲取當(dāng)前的ScriptSession
        try {
            ScriptSession scriptSession =  WebContextFactory.get().getScriptSession();
            if(scriptSession != null){
                scriptSession.setAttribute("tag", tag);
            }
            DwrScriptSessionManagerUtil dwrScriptSessionManagerUtil = new DwrScriptSessionManagerUtil() ;
            dwrScriptSessionManagerUtil.init("tag",tag);
        } catch (Exception e) {

        }
        System.out.println("onPageLoad 被調(diào)用 :" + tag);
    }

  // mq接受到消息會(huì)觸發(fā)這個(gè)方法
 @Override
    public void onMessage(TextNotifyMessage message) throws NotifyException {

        System.out.println(" 收到消息  " + message.getData());
        System.err.println(" 收到消息  " + message.getData());
        // 下面代碼變化不大,主要是給前端推送
        Browser.withAllSessionsFiltered(new ScriptSessionFilter() {

            public boolean match(ScriptSession session) {
                /* 這塊判斷是否合法 硕噩,可以在這塊驗(yàn)證用戶的合法性假残,為了簡單我直接返回true*/
                return true;
                  /*  if (session.getAttribute("userId") == null) {
                        return false;
                    } else {
                        return (session.getAttribute("userId")).equals(userId);
                    }*/
            }

        }, new Runnable() {
            private ScriptBuffer script = new ScriptBuffer();

            public void run() {
                //設(shè)定前臺(tái)接收消息的方法和參數(shù)  在前臺(tái)js里定義getmessage (data) 的方法,就會(huì)自動(dòng)被調(diào)用
                script.appendCall("getmessage", message.getData());
                Collection<ScriptSession> sessions = Browser.getTargetSessions();
                for (ScriptSession scriptSession : sessions) {
                    scriptSession.addScript(script);
                }
                System.out.println("dwrtool  showmessage 調(diào)用 ");
            }
        });
    }
}
  1. 現(xiàn)在再來改改原來的html炉擅,
<html>
<head>
    <title></title>
    <script type='text/javascript' src='/dwr/engine.js'></script>

    <script type='text/javascript' src='/dwr/interface/Demo2Consumer.js'></script>

    <script>
        function onpage(){
            // 頁面加載直接調(diào)用這個(gè)函數(shù)辉懒,我這塊使用點(diǎn)擊按鈕
            Demo2Consumer.onPageLoad("123456");
        }
        // 后端會(huì)調(diào)用這個(gè)函數(shù)
        function getmessage(data){
            alert(data);
        }
    </script>
</head>
hello
<input type="button" onclick="onpage()" value="onpage" >
</html>

效果展示:點(diǎn)擊onpage 按鈕后會(huì)一直對(duì)話框彈出,顯示的就是mq接收到的消息谍失。
7.補(bǔ)充眶俩,和前端聊了聊以后,前端給建議不需要調(diào)用onpage記載快鱼,也可以調(diào)用dwr的js函數(shù)颠印,這塊我貼上供大家參考


<script>
    //  激活ajax    
  dwr.engine.setActiveReverseAjax(true)
    // 頁面未加載的時(shí)候是否發(fā)送通知
    dwr.engine.setNotifyServerOnPageUnload(true,true)
    // 出現(xiàn)錯(cuò)誤后的處理方法
    dwr.engine.setErrorHandler(function(){})

    function getmessage(data){
        if (window.eventBus) {
            window.eventBus.$emit('getDwr',data);
        }
    }
</script>

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市抹竹,隨后出現(xiàn)的幾起案子线罕,更是在濱河造成了極大的恐慌,老刑警劉巖窃判,帶你破解...
    沈念sama閱讀 218,607評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钞楼,死亡現(xiàn)場離奇詭異,居然都是意外死亡袄琳,警方通過查閱死者的電腦和手機(jī)询件,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門燃乍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人雳殊,你說我怎么就攤上這事橘沥。” “怎么了夯秃?”我有些...
    開封第一講書人閱讀 164,960評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵座咆,是天一觀的道長。 經(jīng)常有香客問我仓洼,道長介陶,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,750評(píng)論 1 294
  • 正文 為了忘掉前任色建,我火速辦了婚禮哺呜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘箕戳。我一直安慰自己某残,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評(píng)論 6 392
  • 文/花漫 我一把揭開白布陵吸。 她就那樣靜靜地躺著玻墅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪壮虫。 梳的紋絲不亂的頭發(fā)上澳厢,一...
    開封第一講書人閱讀 51,604評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音囚似,去河邊找鬼剩拢。 笑死,一個(gè)胖子當(dāng)著我的面吹牛饶唤,可吹牛的內(nèi)容都是我干的徐伐。 我是一名探鬼主播,決...
    沈念sama閱讀 40,347評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼搬素,長吁一口氣:“原來是場噩夢啊……” “哼呵晨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起熬尺,我...
    開封第一講書人閱讀 39,253評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎谓罗,沒想到半個(gè)月后粱哼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,702評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡檩咱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評(píng)論 3 336
  • 正文 我和宋清朗相戀三年揭措,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了胯舷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,015評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡绊含,死狀恐怖桑嘶,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情躬充,我是刑警寧澤逃顶,帶...
    沈念sama閱讀 35,734評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站充甚,受9級(jí)特大地震影響以政,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜伴找,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評(píng)論 3 330
  • 文/蒙蒙 一盈蛮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧技矮,春花似錦抖誉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至耿币,卻和暖如春梳杏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背淹接。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評(píng)論 1 270
  • 我被黑心中介騙來泰國打工十性, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人塑悼。 一個(gè)月前我還...
    沈念sama閱讀 48,216評(píng)論 3 371
  • 正文 我出身青樓劲适,卻偏偏與公主長得像,于是被迫代替她去往敵國和親厢蒜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子霞势,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評(píng)論 2 355

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)斑鸦,斷路器愕贡,智...
    卡卡羅2017閱讀 134,657評(píng)論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,822評(píng)論 6 342
  • Spring Web MVC Spring Web MVC 是包含在 Spring 框架中的 Web 框架,建立于...
    Hsinwong閱讀 22,409評(píng)論 1 92
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,152評(píng)論 25 707
  • 我的家鄉(xiāng)位于淮河中上游的一個(gè)小村落巷屿,古老神秘的建筑固以,清澈見底的小河,每每夜晚都讓人魂?duì)繅衾@。離鄉(xiāng)數(shù)年偶爾歸鄉(xiāng)憨琳,少了...
    天上沒有坑閱讀 4,153評(píng)論 0 0