中間件技術入門教程

[TOC]

前言##

本博客介紹Java中間件的一些知識,僅僅是一些知識儲備。

中間件##

中間件概念###

中間件:中間件是一種介于操作系統和應用軟件之間的一種軟件,它使用系統軟件所提供的基礎服務(功能),銜接網絡上應用系統的各個部分或不同的應用,能夠達到資源共享、功能共享的目的。
若是以新一代的中間件系列產品來組合應用,同時配合以可復用的商務對象構件,則應用開發費用可節省至80%。

中間件分類###

  1. 消息中間件
    消息中間件適用與進行網絡通訊的系統,建立網絡通訊的通道,進行數據和文件的傳送
    產品:ActiveMQ、ZeroMQ、RabbitMQ、IBM webSphere MQ...
  2. 交易中間件
    交易中間件管理分布與不同操作系統的數據,實現數據一致性,保證系統的負載均衡
    產品:IBM CICS,Bea tuxedo...
  3. 對象中間件
    保證不同廠家的軟件之間的交互訪問
    產品:IBM componentbroker, iona orbix,borland visibroker...
  4. 應用服務器
    用來構造internet/intranet應用和其它分布式構件應用
    產品:IBM Websphere,Bea weblogic...
  5. 安全中間件
    以公鑰基礎設施(pki)為核心的、建立在一系列相關國際安全標準之上的一個開放式應用開發平臺
    產品:entrust entrust...
  6. 應用集成服務器
    把工作流和應用開發技術如消息及分布式構件結合在一起,使處理能方便自動地和構件、script 應用、工作流行為結合在一起,同時集成文檔和電子郵件
    產品:lss flowman、ibm flowmark、vitria businessagiliti

ESB##

ESB,即企業服務總線
松散耦合一直是企業軟件開發中的一個很重要的內容,而面向服務的SOA編程在隨著ESB的應用得到了進一步的發展,ESB就像服務提供者和服務使用者之間的中間層


這里寫圖片描述

JMS##

JMS,即Java Message Service
ESB僅僅是作為一個中間層,所以應用程序之間的消息通訊必須借助JMS,即通過JMS從服務使用者接收消息,并將其轉發到相應的服務提供者。
而且,JMS 還定義了可發送的若干不同類型的消息。例如,Text 消息包含消息的字符串表示形式;Object 消息包含序列化的 Java 對象;Map 消息包含鍵/值對的映射,等等。

附錄:
MQ DEMO:

package com.wms.batchMsg;

import java.io.File;
import java.io.IOException;
import java.sql.Timestamp;
import java.text.ParseException;
import java.util.Date;

import org.apache.log4j.Logger;

import com.ibm.mq.MQEnvironment;
import com.ibm.mq.MQException;
import com.ibm.mq.MQGetMessageOptions;
import com.ibm.mq.MQMessage;
import com.ibm.mq.MQPutMessageOptions;
import com.ibm.mq.MQQueue;
import com.ibm.mq.MQQueueManager;
import com.ibm.mq.constants.MQConstants;

public class MQUtil {
    
    private static String qmName;      
    private static MQQueueManager qMgr;
    
    private static Logger logger = Logger.getLogger(MQUtil.class);
    
    static{
        try{
            MQEnvironment.hostname=ConfigManager.getValue("MQ_MQHost");
            MQEnvironment.channel=ConfigManager.getValue("MQ_Server_Channel");
            MQEnvironment.CCSID=Integer.parseInt(ConfigManager.getValue("MQ_CCSID"));
            MQEnvironment.port=Integer.parseInt(ConfigManager.getValue("MQ_port"));
            //MQEnvironment.userID = ConfigManager.getValue("MQ_UserId");
            //MQEnvironment.password = ConfigManager.getValue("MQ_pass");
            qmName = ConfigManager.getValue("MQ_QMname");
            MQEnvironment.properties.put(MQConstants.TRANSPORT_PROPERTY,MQConstants.TRANSPORT_MQSERIES_CLIENT);
            qMgr = new MQQueueManager(qmName);
        }catch(MQException e){
            e.printStackTrace();
            logger.info("qManager failed: Completion code " + e.completionCode + " Reason Code is "
                    + e.reasonCode);
        }
    }
    
    public static MQQueue getSendQueue(String queueName) {
        MQQueue sQueue;
        int openSendOptions = MQConstants.MQOO_OUTPUT | MQConstants.MQOO_FAIL_IF_QUIESCING
                | MQConstants.MQOO_SET_IDENTITY_CONTEXT;
        try {
            sQueue = qMgr.accessQueue(queueName, openSendOptions);
        } catch (MQException e) {
            e.printStackTrace();
            return null;
        }
        return sQueue;
    }
    
    public static MQQueue getReceiveQueue(String revQueueName){
        MQQueue rQueue ;
        int openRcvOptions = MQConstants.MQOO_INPUT_AS_Q_DEF | MQConstants.MQOO_FAIL_IF_QUIESCING;
        try{
            rQueue = qMgr.accessQueue(revQueueName, openRcvOptions);
        }catch(MQException e){
            e.printStackTrace();
            return null;
        }
        return rQueue;
    }
    
    public static void sendMsg(MQMsgEntity entity,String queueName) {
        MQQueue sendQ = null;
        try {
            MQMessage qMsg = new MQMessage();
            byte[] qByte = entity.getMsgStr().getBytes("UTF-8");
//            String message = entity.getMsgStr();
            qMsg.messageId = MQConstants.MQMI_NONE;
            //TODO send and receive
            if(entity.getCorrelId()!=null){
                qMsg.correlationId = entity.getCorrelId();
            }
            qMsg.format = MQConstants.MQFMT_STRING;
            qMsg.write(qByte);
            MQPutMessageOptions pmo = new MQPutMessageOptions();
            pmo.options = pmo.options + MQConstants.MQPMO_NEW_MSG_ID;
            pmo.options = pmo.options + MQConstants.MQPMO_NO_SYNCPOINT;
            pmo.options = pmo.options + MQConstants.MQPMO_SET_IDENTITY_CONTEXT;
            sendQ = getSendQueue(queueName);
            sendQ.put(qMsg, pmo);
            qMgr.commit();
            //logger.info("The send message is: " +new String(qByte,"UTF-8"));
        } catch (MQException e) {
            logger.info("A WebSphere MQ error occurred : Completion code "
                            + e.completionCode + " Reason Code is "
                            + e.reasonCode);
        } catch (java.io.IOException e) {
            logger.info("An error occurred whilst to the message buffer "
                            + e);
        }finally{
            try{
                if(sendQ!=null){
                    sendQ.close();
                }
            }catch(MQException e){
                // TODO Auto-generated catch block
                e.printStackTrace();
                logger.info("Error for MQ connection:"+e.getMessage());
            }
        }

    }
    
//    public static void messageHandlerByQueueName(MQMsgEntity entity,String queueName) {
//      try {
//          if(queueName.equalsIgnoreCase("sap_OrdersQueue")){
//              ECOrder order = new ECOrder();
//              order.CallOrderCURFC(entity, "ZECI001");
//          }else if(queueName.equalsIgnoreCase("sap_OrderPendReqQueue")){
//              ECOrderPending orderPending = new ECOrderPending();
//              orderPending.CallOrderPendRFC(entity, "ZECI005");
//          }else if(queueName.equalsIgnoreCase("sap_OrderPendCancelQueue")){
//              ECOrderPending orderPending = new ECOrderPending();
//              orderPending.CallCancelOrderPendRFC(entity, "ZECI006");
//          }else if(queueName.equalsIgnoreCase("sap_ECReturnsQueue")){
//              ECOrder order = new ECOrder();
//              order.callOrderCancelRFC(entity, "ZECI001");
//          }else if(queueName.equalsIgnoreCase("sap_downpaymentQueue")){
//              ECDownPayment downPayment = new ECDownPayment();
//              downPayment.callDownPaymentRFC(entity, "ZECI007");
//          }else if(queueName.equalsIgnoreCase("sap_360LBPQueue")){
//              EC360LBP lbp = new EC360LBP();
//              lbp.generateHtmlFromQueue(entity.getMsgStr());
//          }
//      } catch (Exception e) {
//          e.printStackTrace();
//          logger.error(e.getMessage());
//      }
//      
//    }
    
    public MQQueueManager generateNewMQQM(){
        MQQueueManager qMgr = null;
        try{
              
            MQEnvironment.hostname=ConfigManager.getValue("MQ_MQHost");
            MQEnvironment.channel=ConfigManager.getValue("MQ_Server_Channel");
            MQEnvironment.CCSID=Integer.parseInt(ConfigManager.getValue("MQ_CCSID"));
            MQEnvironment.port=Integer.parseInt(ConfigManager.getValue("MQ_port"));   
            String qmName = ConfigManager.getValue("MQ_QMname");
            MQEnvironment.properties.put(MQConstants.TRANSPORT_PROPERTY,MQConstants.TRANSPORT_MQSERIES_CLIENT);
            qMgr = new MQQueueManager(qmName);
            
        }catch(MQException e){
            e.printStackTrace();
            logger.info("qManager failed: Completion code " + e.completionCode + " Reason Code is "
                    + e.reasonCode);
        }
        return qMgr;
    }
    
    public void MultiThreadGetMqMessage(MQQueueManager qMgr,String queueName){
        MQQueue revQ = null;
        String mqString = null;
        MQMsgEntity entity = new MQMsgEntity();
        
        int openRcvOptions = MQConstants.MQOO_INPUT_AS_Q_DEF | MQConstants.MQOO_FAIL_IF_QUIESCING;
        try {
            MQMessage retrievedMessage = new MQMessage();
            MQGetMessageOptions gmo = new MQGetMessageOptions();
            gmo.options += MQConstants.MQPMO_NO_SYNCPOINT;// 
            gmo.options = gmo.options + MQConstants.MQGMO_WAIT;//
            gmo.options = gmo.options + MQConstants.MQGMO_FAIL_IF_QUIESCING;// 
            gmo.waitInterval = MQConstants.MQWI_UNLIMITED;// 
            gmo.matchOptions = MQConstants.MQMO_MATCH_MSG_ID;
            retrievedMessage.format=MQConstants.MQFMT_STRING;
            //  MQC.MQWI_UNLIMITED;
            revQ = qMgr.accessQueue(queueName, openRcvOptions);
            revQ.get(retrievedMessage, gmo);
            qMgr.commit();
            int length = retrievedMessage.getDataLength();
            if(length >0){
                long startTime = System.currentTimeMillis();
                byte[] msg = new byte[length];
                retrievedMessage.readFully(msg);
                mqString = new String(msg, "UTF-8");
                if(queueName.equalsIgnoreCase("sap_360LBPQueue")){
                    mqString = mqString.replace("'", "\"");
                }
                long timeuse = System.currentTimeMillis() - startTime;
                Date currentDate = new Date();
                Timestamp receiveTimestamp = new Timestamp(currentDate.getTime());
                logger.info("=========mqString from "+queueName+" :"+mqString);
                DBUtil.insertIntoMQLog("Receive",queueName, mqString, timeuse, "success", "", null, receiveTimestamp);
                entity.setMsgStr(mqString);
                //messageHandlerByQueueName(entity,queueName);
                
                
            }else{
                logger.info("Error MQ string Sent!");
            }
        }
        catch (MQException e) {
            e.printStackTrace();
            if (e.reasonCode != 2033) 
            {
                logger.info(e.getMessage());
                logger.info("Completion code "
                        + e.completionCode + " Reason Code is " + e.reasonCode);
            }
        } catch (IOException e) {
            logger.info("IO error:" + e.getMessage());
        } finally{
            try{
                if(revQ!=null){
                    revQ.close();
                }
            }catch(MQException mqEx){
                int rc = mqEx.reasonCode;
                if (rc != MQException.MQRC_NO_MSG_AVAILABLE)
                {
                    logger.info(" PUT Message failed with rc = " 
                + rc);
                }

            }
        }
    }
    
    public static String getMQMessage(String queueName) throws ParseException {
        MQQueue revQ = null;
        String mqString = null;
        MQMsgEntity entity = new MQMsgEntity();
        try {
            MQMessage retrievedMessage = new MQMessage();
            MQGetMessageOptions gmo = new MQGetMessageOptions();
            gmo.options += MQConstants.MQPMO_NO_SYNCPOINT;// 
            gmo.options = gmo.options + MQConstants.MQGMO_WAIT;//
            gmo.options = gmo.options + MQConstants.MQGMO_FAIL_IF_QUIESCING;// 
            gmo.waitInterval = MQConstants.MQWI_UNLIMITED;// 
            gmo.matchOptions = MQConstants.MQMO_MATCH_MSG_ID;
            retrievedMessage.format=MQConstants.MQFMT_STRING;
            //  MQC.MQWI_UNLIMITED;
            revQ = getReceiveQueue(queueName);
            revQ.get(retrievedMessage, gmo);
            qMgr.commit();
            int length = retrievedMessage.getDataLength();
            if(length >0){
                byte[] msg = new byte[length];
                retrievedMessage.readFully(msg);
                mqString = new String(msg, "UTF-8");
                logger.info("=========getMQMessage===mqString from "+queueName+" :"+mqString);
                entity.setMsgStr(mqString);
                //messageHandlerByQueueName(entity,queueName);
            }else{
                logger.info("Error MQ string Sent!");
            }
        }
        catch (MQException e) {
            e.printStackTrace();
            if (e.reasonCode != 2033) 
            {
                e.printStackTrace();
                logger.info("Completion code "
                        + e.completionCode + " Reason Code is " + e.reasonCode);
            }
        } catch (java.io.IOException e) {
            System.out.println("error" + e.getMessage());
        }finally{
            try{
                if(revQ!=null){
                    revQ.close();
                }
            }catch(MQException mqEx){
                int rc = mqEx.reasonCode;
                if (rc != MQException.MQRC_NO_MSG_AVAILABLE)
                {
                System.out.println(" PUT Message failed with rc = " 
                + rc);
                }

            }
        }
        return mqString;
    }

    public void revAndSend(MQMsgEntity entity,String queueName){
        //
        sendMsg(entity,queueName);
    }
    
    public void subscribeMessage() throws ParseException{
        while(true){
            logger.info("waiting to get message.....");
            getMQMessage("sap_OrdersQueue");
            
        }
    }
    
    public void subscribeOrderPendMessage() throws ParseException{
        while(true){
            logger.info("waiting to get message.....");
            getMQMessage("sap_ECReturnsQueue");
            
        }
    }
    
    
    
    public  static void main(String[] args) throws IOException, ParseException {
        MQMsgEntity entity = new MQMsgEntity();
        String sendMsg = XMLBeanUtil.readFileToString(new File("D://batchXML0108.txt"));
        int intPktCtlNbr = 1;
        String StrPkt = null;
        String newPktCtlNbr =null;
        for (int i = 0; i < 20000; i++) {
            newPktCtlNbr = String.format("%09d", intPktCtlNbr+i);  
            StrPkt="<PktCtlNbr>"+"V"+newPktCtlNbr+"</PktCtlNbr>";
            String changeSendMsg = sendMsg.replaceAll("<PktCtlNbr>6001996171</PktCtlNbr>", StrPkt);
            System.out.println(StrPkt);
            entity.setMsgStr(changeSendMsg);
            sendMsg(entity,"wms_SAPOrderQueue");
        }
//      MQUtil util = new MQUtil();
//      util.subscribeMessage();
//      util.subscribeOrderPendMessage();
//      util.messageHandlerByQueueName(entity, "sap_360LBPQueue");
//      getMQMessage("sap_OrderPendCancelQueue");
//      System.out.println("rev message is:"+message);
    }

}


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,702評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,615評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,606評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,044評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,826評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,227評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,307評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,447評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,992評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,807評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,001評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,550評論 5 361
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,243評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,667評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,930評論 1 287
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,709評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,996評論 2 374

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,785評論 18 139
  • 吃晚飯時,突然想到舅舅家媳婦,跟老公說:最近朋友圈看不到她發信息了嘛?以前天天炫她兒子多么好,他們學了好多...
    莊小葉閱讀 286評論 1 2
  • 小時候父母總是暴打我,我特別害怕我父母。地上有個紙袋子我踩了幾下,父親不讓我踩。我說踩幾下又有什么,父親就生氣...
    忘記過去的痛閱讀 309評論 0 1
  • 枯身垂首悟禪中,瘦影凌霜對晚風。 不舍淤泥滋哺處,香紅褪盡亦從容。
    醉夢絮語閱讀 347評論 1 2