日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux上的WebSphere MQ开发快速入门

發(fā)布時間:2025/7/14 linux 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux上的WebSphere MQ开发快速入门 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
本文將通過用于向隊列發(fā)送消息和從隊列接收消息的示例應(yīng)用程序說明如何在 Linux 上著手安裝和配置 WebSphere MQ,以及如何為 MQ 環(huán)境開發(fā) Java 應(yīng)用程序。

引言

本文的目標是讓您輕松實現(xiàn) Linux? 上的 IBM? WebSphere? MQ 入門。由于大部分 Linux 服務(wù)器并沒有圖形用戶界面,因此本文將說明如何使用命令行工具在 Linux 上安裝和配置 WebSphere MQ。本文將說明如何使用 WebSphere MQ Java API 創(chuàng)建兩個示例 Java? 應(yīng)用程序:MQSend(用于向隊列發(fā)送消息)和 MQGet(用于從隊列接收消息)。

先決條件

  • WebSphere MQ V6 安裝包。
  • 一臺或兩臺安裝了 Linux 的計算機。本文使用兩臺安裝了 Suse Linux Enterprise Server V9 的計算機,不過也可以在一臺計算機上完成所有工作。
  • Linux 管理技能。
  • Java 開發(fā)方面的經(jīng)驗將有所幫助,但并非必須的,因為我們提供了經(jīng)過預(yù)編譯的 Java 示例應(yīng)用程序供下載和在命令行使用。

WebSphere MQ

WebSphere MQ 提供了連接層和應(yīng)用程序的可靠集成,為 SOA 提供了所需的基礎(chǔ)。WebSphere MQ 的主要特色功能包括:

有保證的消息交付
基于可靠隊列的消息傳遞,可確保消息不會丟失或重復(fù)。
基于標準的開發(fā)
使用 Java Message Service (JMS) API 和 Message Queue Interface (MQI)。
端到端安全
使用安全套接字層(Secure Sockets Layer,SSL)進行身份驗證、消息完整性檢查和數(shù)據(jù)加密。
Web 服務(wù)支持
用于保證 Web 服務(wù)傳輸和可靠性的簡單對象訪問協(xié)議(Simple Object Access Protocol,SOAP)。
異步處理
對應(yīng)用程序進行分離,以支持進行獨立于時間的處理。
多平臺支持
支持 80 種以上的配置。

有關(guān) WebSphere MQ 的更多信息,請參見本文結(jié)尾的參考資料

安裝 WebSphere MQ

安裝 WebSphere MQ 的過程非常簡單——直接將安裝包釋放到目錄中即可(本文使用 root 主目錄下的 mq_install)。可以安裝 RPM 安裝包中的所有內(nèi)容,但本文僅需要這部分東西。以下是 WebSphere MQ V6 中包括的包和目錄:

IBMJava2-SDK-1.4.2-0.0.i386.rpm MQSeriesClient-6.0.0-0.i386.rpm MQSeriesConfig-6.0.0-0.i386.rpm MQSeriesFTA-6.0.0-0.i386.rpm MQSeriesIES30-6.0.0-0.i386.rpm MQSeriesJava-6.0.0-0.i386.rpm MQSeriesKeyMan-6.0.0-0.i386.rpm MQSeriesMan-6.0.0-0.i386.rpm MQSeriesMsg_Zh_CN-6.0.0-0.i386.rpm MQSeriesMsg_Zh_TW-6.0.0-0.i386.rpm MQSeriesMsg_de-6.0.0-0.i386.rpm MQSeriesMsg_es-6.0.0-0.i386.rpm MQSeriesMsg_fr-6.0.0-0.i386.rpm MQSeriesMsg_it-6.0.0-0.i386.rpm MQSeriesMsg_ja-6.0.0-0.i386.rpm MQSeriesMsg_ko-6.0.0-0.i386.rpm MQSeriesMsg_pt-6.0.0-0.i386.rpm MQSeriesRuntime-6.0.0-0.i386.rpm MQSeriesSDK-6.0.0-0.i386.rpm MQSeriesSamples-6.0.0-0.i386.rpm MQSeriesServer-6.0.0-0.i386.rpm MQSeriesTXClient-6.0.0-0.i386.rpm PreReqs READMEs copyright gsk7bas-7.0-3.15.i386.rpm lap licenses

下面是安裝步驟:

  • 設(shè)置 Linux 服務(wù)器。本文使用主機名 WMQ1WMQ2WMQ1 的 IP 地址為 192.168.28.71,WMQ2 的 IP 地址為 192.168.28.72。
  • 安裝 WebSphere MQ 前,必須執(zhí)行 ./mqlicense.sh,以閱讀和接受許可證。
  • 安裝所需的 MQ 包及 WebSphere MQ Java 和 IBM Java SDK 包,以便為 WebSphere MQ 開發(fā) Java 客戶機:
    wmq1:~/mq_install # rpm -ivh IBMJava2-SDK-1.4.2-0.0.i386.rpm wmq1:~/mq_install # rpm -ivh MQSeriesRuntime-6.0.0-0.i386.rpm wmq1:~/mq_install # rpm -ivh MQSeriesServer-6.0.0-0.i386.rpm wmq1:~/mq_install # rpm -ivh MQSeriesJava-6.0.0-0.i386.rpm
  • WebSphere MQ 現(xiàn)在已經(jīng)完成安裝,并有用于進行配置的名為 mqm 的用戶和組。缺省情況下,WebSphere MQ 安裝在 /opt/mqm 中,隊列和其他配置信息位于用戶 mqm 的主目錄中。Java SDK 安裝在 /opt/IBMJava2-142 中,Java 解釋程序位于 /opt/IBMJava2-142/bin 中。

    下一步是進行配置。本文為兩臺計算機使用了具有本地和遠程隊列的單個隊列管理器,用于測試示例應(yīng)用程序。

    配置 WebSphere MQ

    WebSphere MQ 術(shù)語和定義
    隊列管理器
    提供隊列服務(wù)和 API 及用于管理隊列的管理功能的系統(tǒng)管理程序。
    隊列
    消息所發(fā)送到的命名目的地。
    本地隊列
    位于隊列管理器本地的隊列。
    遠程隊列
    駐留在其他隊列管理器(可能位于其他主機上)的隊列。
    傳輸隊列
    以遠程隊列為目標的臨時消息隊列。
    通道
    隊列管理器之間的通信路徑。
    偵聽器
    從客戶機或其他隊列管理器接受網(wǎng)絡(luò)請求。
    命令服務(wù)器
    驗證命令并將有效命令發(fā)送到命令處理器(后者隨后執(zhí)行命令)。

    配置過程包括以下幾個步驟:

    • 創(chuàng)建隊列管理器。
    • 啟動隊列管理器。
    • 創(chuàng)建隊列和通道。
    • 啟動命令服務(wù)器、偵聽器和通道。

    兩臺 WebSphere MQ 計算機都需要執(zhí)行這些步驟。下面的部分將僅說明如何在 WMQ1 上進行配置,但在 WMQ2 上也需要進行這些步驟。

    創(chuàng)建并啟動隊列管理器

    使用 root 登錄到 WMQ1,然后鍵入 su - mqm,以更改到用戶 mqm。使用以下命令為 WMQ1 計算機創(chuàng)建隊列管理器:

    mqm@wmq1:~/ # crtmqm WMQ1QM

    使用以下命令啟動隊列管理器。

    mqm@wmq1:~/ # strmqm WMQ1QM

    創(chuàng)建隊列和通道

    使用命令行工具配置 WebSphere MQ。以下給出了 WMQ1 的配置腳本。此腳本定義本地隊列、遠程隊列、傳輸隊列、發(fā)送方通道和接收方通道。將以下腳本保存為 WMQ1QM.conf:

    DEFINE QLOCAL ('WMQ1InputQ') +REPLACEDEFINE QLOCAL ('WMQ2QMXmitQ') +DESCR('Transmission Queue to WMQ2QM') +USAGE(XMITQ) +TRIGGER +TRIGTYPE(FIRST) +TRIGDPTH(1) +TRIGDATA('WMQ1QM.WMQ2QM') +INITQ('SYSTEM.CHANNEL.INITQ') +REPLACEDEFINE QREMOTE ('WMQ1OutputQ') +XMITQ('WMQ2QMXmitQ') +RNAME('WMQ2InputQ') +RQMNAME('WMQ2QM') +REPLACEDEFINE CHANNEL ('WMQ1QM.WMQ2QM') CHLTYPE(SDR) +TRPTYPE(TCP) +CONNAME('192.168.28.72(1414)') +XMITQ('WMQ2QMXmitQ') +REPLACEDEFINE CHANNEL ('WMQ2QM.WMQ1QM') CHLTYPE(RCVR) +TRPTYPE(TCP) +REPLACEDEFINE CHANNEL ('SYSTEM.ADMIN.SVRCONN') CHLTYPE(SVRCONN) +TRPTYPE(TCP) +DESCR(' ') +HBINT(300) +MAXMSGL(4194304) +MCAUSER('MUSR_MQADMIN') +RCVDATA(' ') +RCVEXIT(' ') +SCYDATA(' ') +SCYEXIT(' ') +SENDDATA(' ') +SENDEXIT(' ') +REPLACE

    上面的配置腳本可作為其他 WebSphere MQ 安裝的模版使用。只需要更改粗體部分的名稱,即可在其他 WebSphere MQ 安裝中設(shè)置隊列和通道。此配置腳本中包含大量條目——有關(guān)它們的更多信息,請參見 WebSphere MQ 信息中心

    使用以下命令創(chuàng)建隊列和通道,以配置 WebSphere MQ:

    mqm@wmq1:~/ # runmqsc WMQ1QM < WMQ1QM.conf > qcreate.log

    runmqsc 命令用于發(fā)出 WebSphere MQ 命令。在本例中,這些命令從 WMQ1QM.conf 文件讀取,而輸出被定向到 qcreate.log。打開 qcreate.log,驗證其中不存在語法錯誤,全部有效命令均得到了處理。

    啟動服務(wù)

    需要啟動命令服務(wù)器、偵聽器和通道,然后就可以進行示例應(yīng)用程序的部署和測試工作了。

    mqm@wmq1:~/ # strmqcsv WMQ1QM & mqm@wmq1:~/ # runmqlsr -m WMQ1QM -t TCP &

    驗證隊列管理器和偵聽器在兩臺計算機上運行,然后啟動通道:

    mqm@wmq1:~/ # runmqchl -m WMQ1QM -c WMQ1QM.WMQ2QM & mqm@wmq1:~/ # runmqchl -m WMQ1QM -c WMQ2QM.WMQ1QM &

    現(xiàn)在已經(jīng)安裝了 WebSphere MQ,并進行了配置,已準備好可以進行測試了。下面一部分將給出兩個基于 Java 的應(yīng)用程序的源代碼,分別用于向隊列發(fā)送消息和從隊列接收消息。

    示例應(yīng)用程序

    用于將消息放入隊列中 (MQSend) 和從隊列獲取消息 (MQGet) 的示例 Java 應(yīng)用程序可使用前面部分中定義的隊列。這些應(yīng)用程序支持 String 消息,旨在用于測試和作為說明如何從 Java 應(yīng)用程序使用 WebSphere MQ 的示例。可以從腳本使用應(yīng)用程序,包括各種類型的應(yīng)用程序。MQSend 和 MQGet 都從 MQConnector 類進行擴展,該類可提供 WebSphere MQ 連接、初始化 WebSphere MQ、打開和關(guān)閉隊列,向隊列發(fā)送消息及從隊列接收消息。

    MQConnector

    MQConnector 是用于進行發(fā)送和獲取操作的超類。該類處理打開連接和發(fā)送及獲取消息的工作。將使用屬性文件對其進行配置,需要在屬性文件中指定主機地址、隊列管理器名稱和隊列名稱:

    queue.manager=WMQ1QM queue.manager.host=192.168.28.71 queue.name=WMQ1OutputQ

    以下是 MQConnector 源代碼:

    package mqconn;import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.Properties;import com.ibm.mq.MQC; 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;public class MQConnector {protected String qManager = ""; // define name of queue managerprotected String qManagerHost = "";protected String queuName = ""; // define name of queueprotected MQQueue mqQueue;protected MQQueueManager qMgr;public static boolean DEBUG = true;public MQConnector(){}public void initMq(){try{FileInputStream fis = new FileInputStream(new File("mqconnect.properties"));Properties props = new Properties();props.load(fis);fis.close();qManager = props.getProperty("queue.manager");qManagerHost = props.getProperty("queue.manager.host");queuName = props.getProperty("queue.name");// Create a connection to the queue managerMQEnvironment.channel = "SYSTEM.DEF.SVRCONN";MQEnvironment.hostname = qManagerHost;debug("Connecting to QueueManager " + qManager + " on " + qManagerHost);qMgr = new MQQueueManager(qManager);}catch (Exception e){e.printStackTrace();}}public void openQueue() throws MQException{// Set up the options on the queue we wish to open...// Note. All WebSphere MQ Options are prefixed with MQC in Java.int openOptions = MQC.MQOO_INPUT_AS_Q_DEF | MQC.MQOO_OUTPUT;// Now specify the queue that we wish to open,// and the open options... debug("Opening queue: " + queuName);try{mqQueue = qMgr.accessQueue(queuName, openOptions);}catch(MQException mqe){//check if MQ reason code 2045//means that opened queu is remote and it can not be opened as //input queue//try to open as output onlyif(mqe.reasonCode==2045){openOptions = MQC.MQOO_OUTPUT;mqQueue = qMgr.accessQueue(queuName, openOptions);}}}public void putMessageToQueue(String msg) throws MQException{try{debug("Sending message: " + msg);MQPutMessageOptions pmo = new MQPutMessageOptions(); MQMessage mqMsg = new MQMessage();mqMsg.write(msg.getBytes());// put the message on the queuemqQueue.put(mqMsg, pmo);}catch (IOException e){e.printStackTrace();}}public String getMessageFromQueue() throws MQException {try{MQMessage mqMsg = new MQMessage();MQGetMessageOptions gmo = new MQGetMessageOptions();// Get a message from the queuemqQueue.get(mqMsg,gmo); //Extract the message dataint len=mqMsg.getDataLength();byte[] message = new byte[len];mqMsg.readFully(message,0,len);return new String(message);}catch(MQException mqe){int reason=mqe.reasonCode;if(reason==2033)//no messages{return null;}else{throw mqe;}} catch (IOException e){e.printStackTrace();return null;}}public void closeQueue() throws MQException{debug("Closing queue and disconnecting QueueManager...");// Close the queue...mqQueue.close();// Disconnect from the queue managerqMgr.disconnect();}protected boolean hasArg(String arg, String[] args){for(int i=0;i<args.length;i++){if(args[i].equals(arg)){return true;}}return false;}public void debug(Object msg){if (DEBUG){System.out.println(msg);}}}

    該類向其他應(yīng)用程序提供 WebSphere MQ 功能。還可以在自己的應(yīng)用程序中將 MQConnector 作為其他類的超類或?qū)嵱妙愂褂谩R韵路椒?Java 應(yīng)用程序提供消息傳遞功能:

    initMQ()
    讀取屬性并創(chuàng)建隊列管理器對象。
    openQueue()
    打開屬性文件中指定的隊列。
    closeQueue()
    關(guān)閉已打開的隊列。
    disconnectMq()
    斷開隊列管理器。
    putMessageToQueue(String)
    將字符串消息放置到指定的隊列。
    getMessageFromQueue()
    從指定的隊列讀取字符串消息。

    MQSend

    MQSend(如下所示)將使用 MQConnector 類,是用于向隊列發(fā)送消息的命令行程序。消息作為命令行參數(shù)指定,可以使用其將文件內(nèi)容作為消息發(fā)送:

    package mqconn;import java.io.BufferedReader; import java.io.FileReader;import com.ibm.mq.MQException;public class MQSend extends MQConnector {public MQSend(){}public void send(String[] args) throws MQException{boolean argsAreFiles = hasArg("-f", args);initMq();openQueue();for (int i = 0; i < args.length; i++){if (args[i].equals("-f"))continue;if (!argsAreFiles){putMessageToQueue(args[i]);}else{try{// send file contents as messageBufferedReader br = new BufferedReader(new FileReader(args[i]));StringBuffer msg = new StringBuffer();for (String line = br.readLine(); line != null; line = br.readLine()){msg.append(line);msg.append('/n');}br.close();putMessageToQueue(msg.toString());}catch (Exception e){System.out.println("Error while processing file " + args[i] + ": "+ e.toString());}}System.out.println("Message sent.");}closeQueue();disconnectMq();}public static void main(String[] args){MQSend mqsend = new MQSend();MQConnector.DEBUG = false;try{if (args == null || args.length == 0){System.out.println("Usage: " + mqsend.getClass().getName()+ " [-f] <file name | message> [<file name | message> ...]");System.exit(0);}mqsend.send(args);}catch (Exception e){System.out.println(e.toString());System.out.println("Usage: " + mqsend.getClass().getName()+ " [-f] <file name | message> [<file name | message> ...]");}}}

    MQSend 使用 MQConnector 提供消息傳遞,實際的 MQSend 程序功能非常簡單。它有兩種操作模式:

    • 將每個命令行參數(shù)作為獨立消息傳遞。
    • 使用 -f 選項發(fā)送文件內(nèi)容。在本例中,每個命令行參數(shù)都是文件名。

    MQGet

    MQGet 類(如下所示)非常簡單——從指定的隊列檢索消息,并將其寫入到標準輸出。可以通過使用重定向?qū)⑾⒋鎯υ谖募小?/p>

    package mqconn;import com.ibm.mq.MQException;public class MQGet extends MQConnector {public MQGet(){}public String getMessages(String[] args) throws MQException{String message=getMessageFromQueue();return message;}public static void main(String[] args){MQGet mqget = new MQGet();MQConnector.DEBUG=false;try{mqget.initMq();mqget.openQueue();String msg=mqget.getMessages(args);if(msg!=null){System.out.println(msg); }mqget.closeQueue();mqget.disconnectMq(); }catch (Exception e){e.printStackTrace();System.out.println("Usage: "+mqget.getClass().getName()+" ");}} }

    MQGet 使用 mqconnect.properties 文件中指定的隊列管理器和隊列。下一部分將給出一些可供進行測試的示例用例。

    示例用例

    以下是一些用例,均使用 WMQ1 作為發(fā)送方,WMQ2 作為接收方,說明了如何使用 MQSend 和 MQGet 應(yīng)用程序。

    準備工作

    在使用示例前,您需要進行一些準備工作,如設(shè)置屬性和編寫一些 Helper 腳本等。為 WMQ1 中的 MQSend 應(yīng)用程序使用以下屬性:

    queue.manager=WMQ1QM queue.manager.host=127.0.0.1 queue.name=WMQ1OutputQ

    為 WMQ2 中的 MQGet 應(yīng)用程序使用以下屬性:

    queue.manager=WMQ2QM queue.manager.host=127.0.0.1 queue.name=WMQ2InputQ

    為了節(jié)約鍵入的時間,以下提供了用于進行發(fā)送和接收的兩個腳本。

    /opt/IBMJava2-142/bin/java -cp .:com.ibm.mq.jar mqconn.MQSend "$@"

    /opt/IBMJava2-142/bin/java -cp .:com.ibm.mq.jar mqconn.MQGet "$@"

    使用 chmod 755 mqsendchmod 755 mqget 將這些腳本轉(zhuǎn)換為可執(zhí)行文件。本文中的所有類和文件都位于 /var/mqm/bin 目錄中,其中 /var/mqm 是 mqm 用戶的主目錄。

    命令

    第一個示例命令將消息發(fā)送到上面指定的隊列。下面的示例清單給出了實際的命令,另外還給出了命令的輸出。

    mqm@wmq1:~/bin> ./mqsend "This is test message" MQJE001: Completion Code 2, Reason 2045 Message sent.

    MQJE001 是預(yù)期出現(xiàn)的內(nèi)容。Reason 2045 表示在本例中無法將要打開的隊列作為輸入隊列打開,因為此隊列是遠程隊列。MQJE001 由 WebSphere MQ 類輸出到標準錯誤。如果不希望看到這些錯誤消息,請將標準錯誤重新定向到 /dev/null ./mqsend "This is test message" 2> /dev/null。若要了解原因代碼的含義,請使用 mqrc 2045

    在 WMQ2 上,使用 mqget 命令接收消息:

    mqm@wmq2:~/bin> ./mqget This is test message

    如果再次執(zhí)行 mqget,會看到預(yù)期的 MQJE001 消息。mqrc 2033 中的 2033 表示“MQRC_NO_MSG_AVAILABLE”。檢索消息并將其從隊列刪除。以下代碼說明了如何發(fā)送多個消息:

    mqm@wmq1:~/bin> ./mqsend "This is test message" This is another message MQJE001: Completion Code 2, Reason 2045 Message sent. Message sent. Message sent. Message sent. Message sent.

    接收消息與上面所示的 mqget 命令相同。以下代碼說明了如何接收多個消息:

    mqm@wmq2:~/bin> ./mqget This is test message mqm@wmq2:~/bin> ./mqget This mqm@wmq2:~/bin> ./mqget is mqm@wmq2:~/bin> ./mqget another mqm@wmq2:~/bin> ./mqget message mqm@wmq2:~/bin> ./mqget MQJE001: Completion Code 2, Reason 2033

    下一個示例將發(fā)送所有 Java 文件的內(nèi)容:

    mqm@wmq1:~/bin> ls -1 mqconn/*.java | awk '{print "mqsend -f "$1""}' | sh 2> /dev/null Message sent. Message sent. Message sent.

    下一個示例讀取消息并將其保存到文件中:

    mqm@wmq2:~/bin> ./mqget > msg1.txt

    mqget 命令的輸出被定向到 msg1.txt。

    結(jié)束語

    本文說明了 Linux 上的 WebSphere MQ 使用入門知識。只需要進行一些安裝和配置步驟,就能讓 WebSphere MQ 正常運行,而這些步驟正是了解 WebSphere MQ 的更多信息的良好起點。文中提供的示例應(yīng)用程序說明了可以如何方便地獲取對 WebSphere MQ 及消息傳遞功能的訪問。示例應(yīng)用程序還可作為開發(fā)自定義應(yīng)用程序的不錯借鑒。






    回頁首

    下載

    描述名字大小下載方法Sample code
    mqsamples.zip332 KBHTTP

    ?

    ?

    本文轉(zhuǎn)自 http://www.ibm.com/developerworks/cn/websphere/library/techarticles/0705_salkosuo/0705_salkosuo.html#resources

    《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

    總結(jié)

    以上是生活随笔為你收集整理的Linux上的WebSphere MQ开发快速入门的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 亚洲精品无码久久久久 | 永久看看免费大片 | 超碰com | 99re这里只有精品在线 | 97国产成人 | 亚洲中字幕 | 午夜视频福利 | 成人黄色短视频在线观看 | 久久国产成人精品国产成人亚洲 | 超碰啪啪 | 天天搞天天搞 | aa视频在线 | 亚洲男人天堂 | 三级特黄视频 | se94se欧美| 四虎黄网 | 国产区福利 | 中文字幕在线视频播放 | 91黄瓜| 妺妺窝人体色www在线下载 | 日韩天天 | 中文字幕免费播放 | 国产免费视频 | 中文日韩欧美 | 国产黄大片 | 免费无码不卡视频在线观看 | 51国产在线| 日本激情一区 | 天天干天天操天天摸 | 日本久草视频 | 黑人精品xxx一区一二区 | 国产一级高清视频 | 99人妻碰碰碰久久久久禁片 | 德国艳星videos极品hd | 你懂的在线观看网址 | 国产91亚洲| 视频在线亚洲 | 国产视频一区二区三区在线观看 | 久久久久久久久久久久久久久久久久久 | www.99re7.com| 国产精品18久久久久久vr下载 | 性视频免费看 | 9l视频自拍蝌蚪9l视频成人 | 日本免费网址 | 爆乳2把你榨干哦ova在线观看 | 黄色小视频在线观看 | 牛牛精品视频 | 日本在线观看免费 | 欧美成人自拍视频 | 亚洲涩涩爱 | 国产精选久久 | 国产美女特级嫩嫩嫩bbb | 亚洲淫| 久久久久久无码精品人妻一区二区 | 性史性dvd影片农村毛片 | 日本一区中文 | 国产午夜精品一区二区三区欧美 | 草免费视频 | 天天草天天爽 | 亚洲伦理精品 | 天堂在线免费视频 | 日本肉体xxxx裸体xxx免费 | 91黄色免费网站 | 又黄又爽的视频 | 天堂网av2014 | 欧美日韩一级片在线观看 | 国产精品ww | 亚洲精品香蕉 | 超碰在97| 在线观看特色大片免费网站 | 丝袜av在线播放 | 亚洲黄网在线 | 中文字幕日韩精品亚洲一区小树林 | 男生操女生免费网站 | 美女脱光内衣内裤 | 国产精品资源网站 | 久久久精品福利 | 日韩av中文在线观看 | 在线观看日韩国产 | www九九热| 日日日日日日bbbbbb | 午夜影院a| 69av网| 夜夜操网址 | 欧美不卡在线视频 | 久久久久久在线观看 | 欧美人妻少妇一区二区三区 | 在线视频免费观看你懂的 | 欧美日本综合 | 精品国产aⅴ麻豆 | 欧美黑人精品 | 欧美在线aa | 北条麻妃一区二区三区 | 日韩av成人在线 | 蜜桃精品在线观看 | 久久久久久久色 | 狠狠做深爱婷婷综合一区 | 香蕉视频网站在线 | 韩国视频一区二区三区 |