中间件技术入门教程

[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阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,596评论 18 139
  • 吃晚饭时,突然想到舅舅家媳妇,跟老公说:最近朋友圈看不到她发信息了嘛?以前天天炫她儿子多么好,他们学了好多...
    庄小叶阅读 279评论 1 2
  • 小时候父母总是暴打我,我特别害怕我父母。地上有个纸袋子我踩了几下,父亲不让我踩。我说踩几下又有什么,父亲就生气...
    忘记过去的痛阅读 299评论 0 1
  • 枯身垂首悟禅中,瘦影凌霜对晚风。 不舍淤泥滋哺处,香红褪尽亦从容。
    醉梦絮语阅读 330评论 1 2