<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    瘋狂

    STANDING ON THE SHOULDERS OF GIANTS
    posts - 481, comments - 486, trackbacks - 0, articles - 1
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    Spring和 jms

    Posted on 2013-04-11 11:30 瘋狂 閱讀(3648) 評論(0)  編輯  收藏 所屬分類: spring

    主要的幾個類說明:

    1 JmsTemplate 用于發送和接受消息。需要消息工廠參數。

    基于監聽:

    2 DefaultMessageListenerContainerSimpleMessageListenerContainer這兩個容器可以創建多個session和消費者來對每個隊列進行消息處理并條用消息監聽類的方法進行處理。并通過多線程進行處理。每個線程通過輪訓的方式(while(true))去進行消息接收處理。

    3 MessageListenerAdapter 它相當于一個特殊的自定義監聽器,里面可以調用一些消息格式的裝換工具。例如jsonxmlstringbean的轉換等等。

     

    其中DefaultMessageListenerContainer接受動態添加session。而后者不支持。

    ----

    具體消息監聽處理源碼過程如下:以DefaultMessageListenerContainer為例:

    ----

    1 初始化建立消費者線程:

    /**

         * Creates the specified number of concurrent consumers,

         * in the form of a JMS Session plus associated MessageConsumer.

         * @see #createListenerConsumer

         */

        protected void doInitialize() throws JMSException {

            establishSharedConnection();

            initializeConsumers();

        }

    protected void initializeConsumers() throws JMSException {

            // Register Sessions and MessageConsumers.

            synchronized (this.consumersMonitor) {

                if (this.consumers == null) {

                    this.sessions = new HashSet<Session>(this.concurrentConsumers);

                    this.consumers = new HashSet<MessageConsumer>(this.concurrentConsumers);

                    Connection con = getSharedConnection();

                    for (int i = 0; i < this.concurrentConsumers; i++) {

                        Session session = createSession(con);

                        MessageConsumer consumer = createListenerConsumer(session);

                        this.sessions.add(session);

                        this.consumers.add(consumer);

                    }

                }

            }

        }

    2 啟動消費者線程

    /**

         * Start the shared Connection, if any, and notify all invoker tasks.

         * @throws JMSException if thrown by JMS API methods

         * @see #startSharedConnection

         */

        protected void doStart() throws JMSException {

            // Lazily establish a shared Connection, if necessary.

            if (sharedConnectionEnabled()) {

                establishSharedConnection();

            }

     

            // Reschedule paused tasks, if any.

            synchronized (this.lifecycleMonitor) {

                this.running = true;

                this.lifecycleMonitor.notifyAll();

                resumePausedTasks();

            }

     

            // Start the shared Connection, if any.

            if (sharedConnectionEnabled()) {

                startSharedConnection();

            }

        }

    3消息消費

    其中的resumePausedTasks方法會進行輪訓處理:

    protected void resumePausedTasks() {

            synchronized (this.lifecycleMonitor) {

                if (!this.pausedTasks.isEmpty()) {//所有的線程一開始會被置為暫停

                    for (Iterator<?> it = this.pausedTasks.iterator(); it.hasNext();) {

                        Object task = it.next();

                        try {

                            doRescheduleTask(task);

                            it.remove();

                            if (logger.isDebugEnabled()) {

                                logger.debug("Resumed paused task: " + task);

                            }

                        }

                        catch (RuntimeException ex) {

                            logRejectedTask(task, ex);

                            // Keep the task in paused mode...

                        }

                    }

                }

            }

    每個線程是一個 AsyncMessageListenerInvoker,通過它的run方法來進行消息處理:

    先執行:

        private boolean invokeListener() throws JMSException {

                initResourcesIfNecessary();

                boolean messageReceived = receiveAndExecute(this, this.session, this.consumer);

                this.lastMessageSucceeded = true;

                return messageReceived;

            }

    接著:

    Message message = receiveMessage(consumerToUse);

     

    這就是最終的阻塞方法去獲取消息

    /**

         * Receive a message from the given consumer.

         * @param consumer the MessageConsumer to use

         * @return the Message, or <code>null</code> if none

         * @throws JMSException if thrown by JMS methods

         */

        protected Message receiveMessage(MessageConsumer consumer) throws JMSException {

            return (this.receiveTimeout < 0 ? consumer.receive() : consumer.receive(this.receiveTimeout));

        }

    4調用我們自定義的監聽器:

    其中監聽器可以實現SessionAwareMessageListenerMessageListener接口,不一樣的地方在于前者會把sessionmessage參數給你,你可以進行一個回調操作。后者只有消息內容message參數。

    protected void invokeListener(Session session, Message message) throws JMSException {

            Object listener = getMessageListener();

            if (listener instanceof SessionAwareMessageListener) {

                doInvokeListener((SessionAwareMessageListener) listener, session, message);

            }

            else if (listener instanceof MessageListener) {

                doInvokeListener((MessageListener) listener, message);

            }

            else if (listener != null) {

                throw new IllegalArgumentException(

                        "Only MessageListener and SessionAwareMessageListener supported: " + listener);

            }

            else {

                throw new IllegalStateException("No message listener specified - see property 'messageListener'");

            }

        }

    主站蜘蛛池模板: 亚洲AV成人精品一区二区三区 | 国产精品亚洲色图| 亚洲AV日韩精品一区二区三区| xxxx日本在线播放免费不卡| 日本亚洲欧洲免费天堂午夜看片女人员| 免费成人在线电影| 亚洲日韩精品国产3区| 区三区激情福利综合中文字幕在线一区亚洲视频1 | 成人电影在线免费观看| 亚洲国产情侣一区二区三区| 免费人妻无码不卡中文字幕18禁| 中文字幕亚洲无线码| 99视频在线免费| 久久亚洲日韩精品一区二区三区| 啦啦啦中文在线观看电视剧免费版 | 亚洲国产日韩综合久久精品| 亚洲综合亚洲综合网成人| 91福利视频免费| 少妇亚洲免费精品| 亚洲国产av美女网站| 亚洲日韩小电影在线观看| 免费人成视频在线| 中文字幕乱码一区二区免费| 亚洲精品第一国产综合亚AV| 亚洲成a人片77777老司机| 四虎影视永久免费视频观看| h视频在线观看免费网站| 精品国产污污免费网站入口在线| 亚洲jjzzjjzz在线播放| 亚洲AV永久纯肉无码精品动漫| 天天干在线免费视频| 99久久综合精品免费| 一级毛片视频免费观看| 亚洲精品无码一区二区| 久久久亚洲AV波多野结衣| 国外亚洲成AV人片在线观看| 免费看少妇作爱视频| av免费不卡国产观看| 久操视频在线免费观看| 亚洲一区二区三区免费| 羞羞漫画页面免费入口欢迎你|