1. 程式人生 > >JAVA傳送接收MQ程式碼示例

JAVA傳送接收MQ程式碼示例

上幾篇關於MQ的部落格裡,並沒有介紹的透徹,今天我把用到的類整理到裡一起,集成了監視、查詢、傳送、接收、儲存報文的功能。

首先,新建TemoteTest類

申明:

    private static MQQueueManager qMgr; // 佇列管理器名稱
    private static MQQueue qQueue; // 訊息通道
    private static String Q_MANAGER; // QueueManager名
    private static String HOST_NAME; // 主機名
    private static int PORT; // 埠號
private static String MQ_NAME; // 本地佇列 private static String CHANNEL; // 連線通道 private static int CCSID; // 字符集 public static String dir = "C:/Users/admin/Desktop/遠端測試報文/";

在桌面新建一個名為【遠端測試報文】的資料夾,作為資料來源。

    /**
     * 迴圈所有檔案傳送
     * @param pa
     * @throws Exception
     */
    public static
void search(File pa) throws Exception { File[] fs = pa.listFiles(); for (int i = 0; i < fs.length; i++) { if (fs[i].isDirectory()) { search(fs[i]); } StringBuffer sb = new StringBuffer(); Reader rd = null
; try { rd = new FileReader(fs[i]); } catch (FileNotFoundException e) { e.printStackTrace(); } char[] cr = new char[20348]; try { while (rd.read(cr) > -1) { sb.append(new String(cr)); } } catch (IOException e) { e.printStackTrace(); } sendMsg(sb.toString()); } }

在這個方法中,將資料夾裡所有檔案都拿到,並將它讀成字串,再呼叫sendMsg()方法。

關於MQ初始化的方法:

    /**
     * 初始化
     */
    private static void init()
    {
        Properties prop = new Properties();
        InputStream is = RemoteTest.class.getResourceAsStream("/constant.properties");
        try
        {
            prop.load(is);
            Q_MANAGER = prop.getProperty("Q_MANAGER").trim();
            HOST_NAME = prop.getProperty("HOST_NAME").trim();
            PORT = Integer.parseInt(prop.getProperty("PORT").trim());
            MQ_NAME = prop.getProperty("MQ_NAME").trim();
            CHANNEL = prop.getProperty("CHANNEL").trim();
            CCSID = Integer.parseInt(prop.getProperty("CCSID").trim());

            MQEnvironment.hostname = HOST_NAME;
            MQEnvironment.port = PORT;
            MQEnvironment.channel = CHANNEL;
            MQEnvironment.CCSID = CCSID;

            qMgr = new MQQueueManager(Q_MANAGER);
            int qOptioin = MQC.MQOO_INPUT_AS_Q_DEF | MQC.MQOO_INQUIRE | MQC.MQOO_OUTPUT;
            qQueue = qMgr.accessQueue(MQ_NAME, qOptioin);
        } catch (IOException e)
        {
            e.printStackTrace();
        } catch (MQException e)
        {
            e.printStackTrace();
        }
    }

這裡可以直接把這些常量寫死,不過不建議這樣做。
如果在同一臺機器上測試,ip可以填寫127.0.0.1
在我的機器上它是這樣子的:

#佇列管理器名稱
Q_MANAGER = SEND
#主機
HOST_NAME = 127.0.0.1
#埠
PORT = 1414
#佇列
MQ_NAME = QUEUE
#通道
CHANNEL = CHANNEL
CCSID = 1383

傳送訊息的方法:

    /**
     * 傳送訊息
     */
    public static void sendMsg(String msgStr)
    {
        try
        {
            init();
            MQMessage qMsg = new MQMessage();
            qMsg.encoding = CCSID;
            qMsg.characterSet = CCSID;
            qMsg.writeString(msgStr);
            MQPutMessageOptions pmo = new MQPutMessageOptions();
            qQueue.put(qMsg, pmo);
            System.out.println("傳送成功");
        } catch (MQException e)
        {
            System.out.println("發生了一起異常,異常原因:" + e.reasonCode);
        } catch (IOException e)
        {
            System.out.println("發生了一起IO異常:" + e.getMessage());
        } finally
        {
            finalizer();
        }
    }

最後釋放:

    /**
     * 手動釋放
     */
    private static void finalizer()
    {
        try
        {
            qQueue.close();
            qMgr.disconnect();
        } catch (MQException e)
        {
            System.out.println("發生了一起異常,錯誤程式碼:" + e.reasonCode);
            e.printStackTrace();
        }
    }

OK,接下來,Main方法中:

public static void main(String[] args) throws Exception
    {
        File path = new File(dir);
        search(path);
    }

右鍵-Run以下,提示傳送成功,可以在MQ客戶端先檢視以下訊息佇列深度。

由於在寫部落格的時候,我只能在家裡的業餘時間寫,所以環境不允許,沒辦法截圖,不過所有的程式碼都是經得起考驗的可放心使用。

接下來,接收方法:

    /**
     * 接收訊息
     * 
     * @return
     */
    public static String getMsg()
    {
        final MQMessage revMessage = new MQMessage();
        try
        {
            init();
            MQGetMessageOptions gmo = new MQGetMessageOptions();
            revMessage.characterSet = CCSID;
            revMessage.encoding = CCSID;
            gmo.options += MQC.MQPMO_SYNCPOINT;
            if (qQueue.getCurrentDepth() <= 0)
            {
                System.out.println("當前佇列深度為0,佇列中沒有訊息。");
                return null;
            }
            qQueue.get(revMessage, gmo);
            String revString = revMessage.readStringOfByteLength(revMessage.getMessageLength());
            saveToXml(revString, System.currentTimeMillis());
            return revString;
        } catch (MQException e)
        {
            if (e.reasonCode == 2033) // 沒有訊息
            {
                System.out.println("沒收到訊息!");
            }
        } catch (IOException e)
        {
            e.printStackTrace();
        } finally
        {
            finalizer();
        }
        return null;
    }

查看了MQ文件,發現錯誤程式碼2033是空訊息。當然那一段異常程式碼可以刪掉了,因為在try方法中,我們首先判斷了佇列深度,如果佇列深度為0,那就返回null,。所以2033異常應該是沒有效果的。在來看一下儲存檔案:

    /**
     * 儲存檔案
     * 
     * @param content
     *            報文
     * @param number
     *            時間戳
     */
    private static void saveToXml(String content, long  name)
    {
        FileWriter fw;
        String path = "C:/Users/admin/Desktop/遠端測試報文2/";
        File filePath = new File(path);
        if (!filePath.exists())
        {
            filePath.mkdirs();
        }
        try
        {
            File newFile = new File("C:/Users/admin/Desktop/遠端測試報文2/" + name + ".xml");
            if (!newFile.exists())
            {
                fw = new FileWriter("C:/Users/admin/Desktop/遠端測試報文2/" + name + ".xml");
            } else 
            {
                fw = new FileWriter("C:/Users/admin/Desktop/遠端測試報文2/" + name + "2" + ".xml");
            }
            fw.write(content);
            fw.flush();
            fw.close();
        } catch (IOException e)
        {
            e.printStackTrace();
        }
    }

然後在main方法中,呼叫:

        while(true)
        {
            getMsg();
        }

將所有報文儲存成xml格式,這個只是我專案裡的需求,大家在開發中根據需求自己修改修改就可以用了。

下載地址:http://download.csdn.net/download/u012552275/9815601
(注:在下載的類中,和本章的程式碼稍有不同,下載好的類裡,儲存檔案的格式是用報文裡的節點擷取的,在開發中大家直接將本章的儲存程式碼稍加替換就可以使用了。)

自此,部落格將不再更新有關MQ的知識。
有什麼不懂的地方,歡迎留言,或者加群159143965

請支援我,掃描左側二維碼打賞,謝謝。

相關推薦

JAVA傳送接收MQ程式碼示例

上幾篇關於MQ的部落格裡,並沒有介紹的透徹,今天我把用到的類整理到裡一起,集成了監視、查詢、傳送、接收、儲存報文的功能。 首先,新建TemoteTest類 申明: private static MQQueueManager qMgr; // 佇

java傳送post請求程式碼

public static String sendPost(String url, String param) { PrintWriter out = null; Bu

JAVA傳送郵件最全示例

傳送郵件是我們在程式開發中很常見的功能,比如註冊通知、找回密碼等,在網上也有很多關於JAVA傳送郵件的示例,但多數都是隻介紹了其中的一部分,今天為大家提供一些JAVA傳送各種形式郵件的示例,供大家學習參考。 JAVA Mail JAVA Mail是很常用的用於傳送郵件的包,我們可以從

如何在WebService接收一個XML檔案並解析,客戶端如何傳送這個XML檔案?急求簡單程式碼示例。。

客戶端 xmlHttp = null; if (window.XMLHttpRequest) { // If IE7, Mozilla, Safari, and so on: Use native object. xmlHtt

JAVA傳送手機簡訊,client簡訊傳送介面示例(java)

程式碼中有註釋: //傳送簡訊的方法 private static ObjectMapper mapper = new ObjectMapper(); public String sendSms(){ Long phoneNum = getLong("phoneNum"); Map

深度優先與廣度優先Java實現程式碼示例【轉】

在程式設計生活中,我們總會遇見樹性結構 而當我們需要遍歷所有節點的時候有兩種遍歷演算法,1.深度優先,2.廣度優先 1.深度優先(DFS) 英文縮寫為DFS即Depth First Search.其過程簡要來說是對每一個可能的分支路徑深入到不能再深入為止,而且每個節點只能訪問一

UDP完成資料的傳送接收程式碼

要實現UDP通訊需要建立一個傳送端程式和一個接收端程式,很明顯,在通訊時只有接收端程式先執行,才能避免因傳送端傳送的資料無法接收,而造成資料丟失。因此,首先需要來完成接收端程式的編寫。 UDP完成資料的傳送 /* * 傳送端  * 1,建立DatagramSocket

《大話設計模式》Java程式碼示例(三)之裝飾模式

裝飾模式(Decorator):動態地給一個物件新增一些額外的職責,就增加功能來說,裝飾模式比生成子類更為靈活。 package decorator; /** * 裝飾模式(Decorator) * Person類 */ public class Perso

《大話設計模式》Java程式碼示例(四)之代理模式

代理模式(Proxy):為其他物件提供一種代理以控制對這個物件的訪問。 package proxy; /** * 代理模式(Proxy) * 被追求者類 */ public class SchoolGirl { private String nam

《大話設計模式》Java程式碼示例(五)之工廠方法模式

工廠方法模式(Factory Method):定義一個用於建立物件的介面,讓子類決定例項化哪一個類,工廠方法使一個類的例項化延遲到其子類。 package factorymethod; /** * 工廠方法模式(Factory Method) * 雷鋒類 */

《大話設計模式》Java程式碼示例(六)之原型模式

原型模式(Prototype):用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。 一、淺拷貝:被複制物件的所有變數都含有與原來物件相同的值,而所有的對其他物件的引用都仍然指向原來的物件。 package prototype.bitwisecopy;

《大話設計模式》Java程式碼示例(八)之建造者模式

建造者模式(Builder):將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。 package builder; /** * 建造者模式(Builder) * 建造者抽象類 */ public abstract class Pers

《大話設計模式》Java程式碼示例(七)之模板方法模式

模板方法模式:定義一個操作中的演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟。 package templatemethod; /** * 模板方法模式(Template Method) *

《大話設計模式》Java程式碼示例(十一)之抽象工廠模式

抽象工廠模式(Abstract Factory):提供一個建立一系列相關或相互依賴物件的介面,而無需指定它們具體的類。 package abstractfactory; /** * 抽象工廠方法(Abstract Factory) * 使用者實體類 */ p

《大話設計模式》Java程式碼示例(十三)之介面卡模式

介面卡模式(Adapter):將一個類的介面轉換成客戶希望的另外一個介面。Adapter模式使得原本由於介面不捷榮而不能一起工作的那些類可以一起工作。 package adapter; /** * 介面卡模式(Adapter) * 球員抽象類 */ publ

《大話設計模式》Java程式碼示例(十四)之備忘錄模式

備忘錄模式(Memonto):在不破壞封裝性的前提下,捕獲一個物件的內部狀態,並在該物件之外儲存這個狀態,這樣以後就可將該物件恢復到原先儲存的狀態。 package memento; /** * 備忘錄模式(Memento) * 遊戲角色 */ public

《大話設計模式》Java程式碼示例(十八)之橋接模式

橋接模式(Bridge):將抽象部分與它的實現部分分離,使它們都可以獨立地變化。 package bridge; /** * 橋接模式(Bridge) * 手機軟體抽象類 */ public abstract class PhoneSoft { pu

Java死鎖程式碼示例

public class DeadLocak { private final Object left = new Object(); private final Object right = new Object(); public void le

設計模式之工廠方法模式,附Java程式碼示例

模式定義 工廠方法模式(Factory Method Pattern)又稱為工廠模式,也叫虛擬構造器(Virtual Constructor)模式或者多型工廠(Polymorphic Factory)模式,它屬於類建立型模式。在工廠方法模式中,工廠父類負責定義建立產品物件的公共介面,而工廠子類則

Java mail 傳送接收郵件

文字郵件:package mypack; import java.util.Properties; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.S