1. 程式人生 > >用定時器傳送訊息,activemq總是報WARN報錯

用定時器傳送訊息,activemq總是報WARN報錯

2014-02-22 16:21:02,843 | WARN  | Transport Connection to: tcp://10.18.222.21:4751 failed: java.net.SocketException: Connection reset | org.apache.activemq.broker.TransportConnection.Transport | ActiveMQ Transport: tcp:///10.18.222.21:[email protected]
2014-02-22 16:21:02,843 | WARN  | Transport Connection to: tcp://127.0.0.1:4743 failed: java.net.SocketException: Connection reset | org.apache.activemq.broker.TransportConnection.Transport | ActiveMQ Transport: tcp:///127.0.0.1:

[email protected]

在專案中終於解決了這個困擾很久的問題,一直想不到是這個原因,還以為MQ有BUG,

  mqConnFactory = new ActiveMQConnectionFactory(config.getMqConfig().getUrl());

 connection = mqConnFactory.createConnection();

當時有2個方法都使用mqConnFactory.createConnection();一個是初始化,一個是檢查mq狀態,mqConnFactory.createConnection();一次就行了!

以下程式碼是另外一個測試程式,以上面無關。

傳送端:

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.Message;
import javax.jms.MessageProducer;
import javax.jms.Session;

import org.apache.activemq.ActiveMQConnectionFactory;
import org.quartz.CronScheduleBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

public class MessageSendAndReceive {

    public static Scheduler sched;

    public static void main(String[] args) throws Exception {
        MessageSendAndReceive.run();
    }

    public static void send() throws Exception {
        ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616");
        Connection connection = factory.createConnection();
        connection.start();
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        Destination destination = session.createQueue("TestQueue");
        Message message = session.createTextMessage("Hello JMS!");
        MessageProducer producer = session.createProducer(destination);
        producer.send(message);
        System.out.println("Send Message Completed!");
        // MessageConsumer comsumer = session.createConsumer(destination);
        // Message recvMessage = comsumer.receive();
        // System.out.println("Received:" + ((TextMessage)
        // recvMessage).getText());
        producer.close();
        session.close();
        connection.close();
    }

    public static void run() throws Exception {
        SchedulerFactory schedulerFactory = new StdSchedulerFactory();
        // 通過schedulerFactory獲取一個排程器
        sched = schedulerFactory.getScheduler();
        // 建立jobDetail例項,繫結Job實現類
        // 指明job的名稱,所在組的名稱,以及繫結job類
        // 建立LzstoneTimeTask的定時任務
        JobDetail jobDetail = JobBuilder.newJob(LzstoneTimeTask.class)
                .withIdentity("lzstoneJob", Scheduler.DEFAULT_GROUP).build();
        // 目標 建立任務計劃
        Trigger trigger = TriggerBuilder.newTrigger().withIdentity("simpleTrigger", "triggerGroup")
                .withSchedule(CronScheduleBuilder.cronSchedule("0/10 * * * * ?")).startNow().build();

        // 0 0 12 * * ? 代表每天的中午12點觸發
        // 把作業和觸發器註冊到任務排程中
        sched.scheduleJob(jobDetail, trigger);
        // 啟動排程
        sched.start();
    }

    // 停止
    public static void stop() throws Exception {
        sched.shutdown();
    }

}

Job:

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.Message;
import javax.jms.MessageProducer;
import javax.jms.Session;

import org.apache.activemq.ActiveMQConnectionFactory;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class LzstoneTimeTask implements Job {
    public void execute(JobExecutionContext context) throws JobExecutionException {
        try {
            // 執行的定時器任務
            ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616");
            Connection connection = factory.createConnection();
            connection.start();
            Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
            Destination destination = session.createQueue("TestQueue");
            Message message = session.createTextMessage("Hello JMS!");
            MessageProducer producer = session.createProducer(destination);
            // 訊息為非持久化訊息
            producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
            // 設定心跳訊息的存活時間,因為會定時傳送,所以,沒有必要永久存在。
            producer.setTimeToLive(1 * 1000);
            producer.send(message);
            System.out.println("Send Message Completed!");
            // MessageConsumer comsumer = session.createConsumer(destination);
            // Message recvMessage = comsumer.receive();
            // System.out.println("Received:" + ((TextMessage)
            // recvMessage).getText());
            producer.close();
            session.close();
            connection.close();
        } catch (Exception e) {

        }
    }
}

監聽:

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.ExceptionListener;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.Session;
import javax.jms.TextMessage;

import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;

public class Jms_Receiver_Listener extends Thread implements MessageListener, ExceptionListener {
    // ConnectionFactory :連線工廠,JMS 用它建立連線
    ConnectionFactory connectionFactory;
    // Connection :JMS 客戶端到JMS Provider 的連線
    Connection connection = null;
    // Session:一個傳送或接收訊息的執行緒
    Session session;
    // Destination :訊息的目的地
    Destination destination;
    // 訊息接收者
    MessageConsumer consumer;

    public Jms_Receiver_Listener() {
        String url = "tcp://localhost:61616";
        // 在ActiveMq的console配置的queue的名字
        String queue = "TestQueue";
        connectionFactory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER,
                ActiveMQConnection.DEFAULT_PASSWORD, url);
        // 構造從工廠得到連線物件
        try {
            connection = connectionFactory.createConnection();
            connection.setExceptionListener(this);// 異常處理
            connection.start();// 連線啟動
            // 如果為true,則佇列裡面的訊息沒有被取走,繼續存在
            session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
            // 獲取session,
            destination = session.createQueue(queue);
            consumer = session.createConsumer(destination);
        } catch (JMSException e) {
            System.err.println("Create fail!");
            e.printStackTrace();
        }
    }

    public void run() {
        try {
            consumer.setMessageListener(this);
        } catch (JMSException e) {
            System.err.println(" MessageListener failed...");
            e.printStackTrace();
        }

    }

    public void onMessage(Message message) {
        try {
            if (message instanceof TextMessage) {
                TextMessage txtMsg = (TextMessage) message;
                String msg = txtMsg.getText();
                System.out.println("Received: " + msg);
            }

        } catch (JMSException e) {
            System.err.println("The process of getting a message failed...");
            e.printStackTrace();
        }
    }

    // 非同步訊息異常處理
    public void onException(JMSException arg0) {
        System.err.println("JMS異常!");
    }

    // 測試程式
    public static void main(String[] args) {
        Jms_Receiver_Listener jrl = new Jms_Receiver_Listener();
        jrl.start();
    }
}

相關推薦

定時傳送訊息activemq總是WARN

2014-02-22 16:21:02,843 | WARN  | Transport Connection to: tcp://10.18.222.21:4751 failed: java.net.SocketException: Connection reset | o

定時寫時鐘

在頁面中可以看到用定時器來寫的那些小時鐘,今天我們就來簡單的實現一下這樣的小功能: 實現時鐘需要注意到的 是: 1.在獲取月份的時候要注意到,getMonth方法是從0開始的,使用的時候要注意的是要加一。 2.用getDay的時候,注意星期日是0,使用的時候要注意。 3.使用定時器的

定時的顏色大小位置全部隨機

<!DOCTYPE html><html> <head> <meta charset="utf-8" /> <title>柱狀圖</title> <style type="text/css"> canvas { border

spring 整合mybatis——多資料來源切換(附帶定時的配置儲存過程連線資料多於50條分批進行操作)

新建com.millery.utils包在其下新建DataSourceContextHolder類 package com.millery.utils; public class DataSourceContextHolder { private

JS定時(setTimeoutsetInterval)

一次性定時器 setTimeout <script> function show(){ alert("廣告廣告。。。"); }

quartz定時的使用定時任務的動態增刪改

目錄 一、簡介: 二、使用: 三、測試: 一、簡介: Java的定時任務通常使用以下方式: 使用JDK自帶的Timer 使用quartz框架 這裡主要是使用quartz來實現。Quartz是一款效能強大的定時任務排程器。開發人員可以使用Qua

高效蜂鳴驅動法:定時掃描代替軟體延時

  上班跟上學果然不一樣,就比如一個蜂鳴器的驅動,學生時代寫蜂鳴器的程式倒也直觀:     PWM_SET(0x0a,0x80);//PWM0輸出4.24Khz,佔空比50%     Delay_ms(200);//延時200ms

網頁版聊天系統快捷鍵傳送訊息的實現、

收集的資訊如下: 部落格園(用PostMessage 向Windows視窗傳送Alt組合鍵): http://www.cnblogs.com/willen/archive/2008/10/22/1316523.html   (仿QQ): https://github.c

JS定時製作時鐘

製作思路 1.首先需要時鐘的背景圖片,時針圖片,分針圖片,秒針圖片。鍾背景圖片固定(相對定位),時/分/秒針圖片旋轉(絕對定位); 2.設定定時器; 3.獲取系統時間,時/分/秒/毫秒; 4.秒針圖片每秒旋轉6°,分針每分針旋轉6°,時針每小時旋轉30°。 <!DOCTYPE

微信裡面的簽到加積分介面(已經測試過沒問題)服務號不能每天傳送訊息為了避免這個每天簽到的時候推送一條最新的訊息給客戶。

  public string QianDao(string WeiXinId, string key)//引數是微訊號         {             strs = WeiXinId.Trim() + "WJXFGCLN+Mihaha";          

Springboot+websocket+定時實現訊息推送

由於最近有個需求,產品即將到期(不同時間段到期)時給後臺使用者按角色推送,功能完成之後在此做個小結 1. 在啟動類中添加註解@EnableScheduling import org.mybatis.spring.annotation.MapperScan; import

WebSocket傳送訊息大於126位元組和大於65535位元組的處理

網上搜了一下WebSocket的合包函式,發現不能直接使用。查了很多資料,終於弄出來了,大於65535位元組的沒有測試,但是小於65535的測試通過下面是C#程式碼,其他程式碼根據此程式碼修改即可public static byte[] PackData(string message) {         

微信小程式定時實現倒計時效果

平常在微信小程式開發的時候,因專案的需求,倒計時必不可少,下面主要講解定時器在微信小程式中的使用。這裡要先宣告一點的就是,該篇主要實現倒計時功能,而且實現是時長較短的倒計時,其他的優化什麼的不作主要考慮。如果實現簡單的60s倒計時效果,我們可直接使用setInterval即可

定時控制Led燈閃爍

實驗目的 閃燈程式在嵌入式學習中猶如“Hello World!”在C/C++語言學習中一樣經典。它以簡單的方式引導了無數的嵌入式愛好者。通過本節的學習你可以基本瞭解STM32的GPIO以及基本定時器的使用。 硬體說明 本例程需要一個定時器和一個LED,其中LED就是擴充套件板上的紅色LED接在PD3上且正極接

簡單的一個定時控制的流水燈c程式

用定時器以間隔500MS在6位數碼管上依次顯示0、1、2、3….C、D、E、F,重複。 #include<reg52.h> typedef unsigned int u8; typede

python 傳送訊息ActiveMq

生產: 你可以產生訊息 通過POST request to the server, like curl -u admin:admin -d "body=message" http://localhost:8161/api/message/TEST?type=queue

Handler傳送訊息週期性更新UI總結

1.Handler的作用 handler是用於執行緒間傳送訊息和處理訊息的。 2.Handler傳送訊息的方式 1.最常用的方式是: handler.sendMessage()、handler.sendEmptyMessage()、handler.s

51微控制器組合語言程式設計:定時控制輸出矩形波

80C51微控制器的時鐘頻率為12MHz,利用定時器T1和P1.0輸出矩形脈衝。波形只畫出了2段:一段為100us 另一段為50us。要完全的、完整的、詳細的編寫此程式的過程!謝謝懸賞分:5 | 解決時間:2011-1-9 15:24------------------------最佳答案:用一個定時器定時

STM32F103的普通定時中斷問題存在開機後初始化一開啟允許中斷定時立刻進入中斷函式一次

問題: 存在開機後初始化,在TIM3_Int_Init()裡面,一開啟允許中斷函式TIM_ITConfig(),定時器立刻進入中斷函式一次。只進一次。初始化函式最後已經關閉定時器:TIM_Cmd(TIM3, DISABLE);  //暫關閉TIMx外設。將這個函式提到初始化

檢視當前伺服器中的所有的topic建立topic,刪除topic,通過shell命令傳送訊息通過shell消費訊息檢視topic詳情,對分割槽數進行修改

一、 Kafka常用操作命令  檢視當前伺服器中的所有topic [root@hadoop3 kafka]# bin/kafka-topics.sh --list --zookeeper hadoop11:2181 [root@hadoop3 kafk