<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 41  文章 - 7  trackbacks - 0
    <2016年6月>
    2930311234
    567891011
    12131415161718
    19202122232425
    262728293012
    3456789

    常用鏈接

    留言簿

    隨筆分類

    隨筆檔案

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    在本章中我們將覆蓋:
    1. 使用.NET client
    2. 通過MQTT綁定iPhone應用與RabbitMQ
    3. 在Andriod上使用消息來更新Google Maps
    4. 通過Andriod后端來發布消息
    5. 使用Qpid來交換RabbitMQ消息
    6. 使用Mosquitto來交換RabbitMQ消息
    7. 使用.NET clients來綁定WCF程序
    介紹
    在前面的章節中,我們已經介紹了基本概念。現在,我們要使用這些概念來創建真實的應用程序。在這里我們不會講解AMQP新的概念,但你會看到RabbitMQ的一些典型用法,我們會讓RabbitMQ與其它技術進交互,以實現終端用戶為桌面和移動平臺上的應用程序。事實上RabbitMQ / AMQP與一般的消息傳遞技術一樣,其主要目的是分離分布式應用程序中的不同模塊,這樣使其很容易地混合多種技術,并可有廣泛的選擇。
    使用.Net client
    .NET是一個官方的RabbitMQ clients。在這個例子中,我們將使用它來創建一個訂閱者 。我們會使用Microsoft Windows Presentation Foundation (WPF)來創建我們第一個桌面程序。 可通過 http://msdn.microsoft.com/en-us/library/ms754130.aspx來了解更多信息.
    我們會將.NET client綁定到第1章使用AMQP中廣播消息食譜中的Java dispatcher上。你可在Chapter04/Recipe01目錄中找到例子的源碼.
    準備
    你需要Visual Studio 2008或更新的版本, .NET framework 3.5 或 4以上版本,以及RabbitMQ .NET client包, RabbitMQ.Client.dll,這些你可在https://www.rabbitmq.com/dotnet.html下載.
    如何做
    為了實現使用RabbitMQ來消費消息的 .NET 程序,我們需要執行下面的步驟:
    1. 創建一個WPF應用程序,然后添加RabbitMQ.Client.dll引用.
    2. 連接broker:
    connection_factory.Uri = "amqp://guest:guest@" +edRabbitmqHost.Text + ":5672/";
    3. 在myLastnews.fanout_01/06 交換器上綁定一個臨時隊列:
    String myqueue = channel.QueueDeclare().QueueName;
    channel.QueueBind(myqueue,news_exchange, "");
    4. 啟動一個訂閱者線程:
    sub = new Subscription(channel, myqueue, true);
    StartSubscriberThread(sub);
    5. 接收消息:
    foreach (BasicDeliverEventArgs e in sub) {
    ...
    Encoding.UTF8.GetString(e.Body);
    }

    6. 將消息寫入列表框:
    Action<String> action = delegate(String value){lsnews.Items.Insert(0,value);};
    Dispatcher.BeginInvoke(action,Encoding.UTF8.GetString(e.Body));

    如何工作
    client綁定到了myLastnews.fanout_01/06交換器上(已在第1章的使用AMQP的廣播消息食譜中創建).一旦將隊列與交換器進行了綁定(步驟3),我們將使用StartSubscriberThread(sub)來啟動一個新的線程,且方法會會執行new Thread(() => InternalStartSubscriber(sub)) (步驟4). 收到的消息(步驟5)將會使用BeginInvoke()方法將其添加到列表框中.
    為了試驗這個例子,你們執行下面的操作:
    1. 從Chapter01/Recipe06/Java_6 中使用 java -cp ./ rabbitmq-client.jar rmqexample.Publish來運行publisher
    2. 運行 .NET client并連接broker ? 結果如下圖所示:
    更多
    AMQP的其中一個目標是集成不同開發語言,我們應該已經學會了如何使用下面的語言來分發相同的消息:
    1. Java
    2. Python
    3. Ruby
    4. .NET
    在后面的食譜中,我們將增加其它clients和技術.
    也可參考
    更全面的文檔,請訪問https://www.rabbitmq.com/dotnet.html.

    通過MQTT來綁定iphone app與RabbitMQ
    MQTT (Message Queue Telemetry Transport,消息隊列遙測傳輸)是一種快速且輕量的開源協議. MQTT廣泛用于物聯網。更多信息,可查看http://mqtt.org/ 和http://en.wikipedia.org/wiki/Internet_of_Things.
    在本例中,我們將通過使用Mosquitto(http://mosquitto.org/)包的MQTT創建一個app來綁定ios移動設備與RabbitMQ .
    我們也將看到如何來接收由下面的程序發出的消息:
    1. 在第3章節管理RabbitMQ-通過瀏覽器來管理RabbitMQ食譜中提出的RabbitMQ web 管理應用程序來
    2. 在第1章節使用AMQP-使用topic交換器來處理消息食譜中介紹的publisher
    你可在Chapter04/Recipe02目錄中找到此例的源碼.

    TIP
    通過MQTT,可以發送和接收消息,但它不是Apple Push 通知的替換物.

    準備 
    跟隨本食譜,你需要:
    1. Apple Xcode IDE (https://developer.apple.com/xcode/)
    2. iOS開發包(https://developer.apple.com/library/ios/navigation/)
    3. Mosquitto C 包(https://bitbucket.org/oojah/mosquitto/src)
    如何做
    在本例中,我們需要啟用MQTT插件以允許MQTT clients連接,然后按下面的步驟來創建一個iOS應用程序:
    1. 使用 rabbitmq-plugins enable rabbitmq_mqtt 命令來在RabbitMQ上安裝MQTT插件.
    2. 重啟RabbitMQ.
    3. 創建一個無ARC (Automatic Reference Counting)的新Xcode project,如下所示:


    4. 下載Mosquitto C 包(https://bitbucket.org/oojah/mosquitto/src) ,將從它的lib目錄中拷貝 .h,.c 文件到示例樹的libmosquitto空目錄中.
    5. 導入Moquitto C包,并將包添加到 project property Header search path.
    6. 在你的MQTT接口文件中添加下面的include指令:
    #include "mosquitto.h"
    7. 要使用包來啟動,你必須使用mosquitto_lib_init()來初始化;
    8. 創建一個適用于所有操作的struct mosquitto *mosq;
    9. 使用mosq = mosquitto_new(NULL, true, self)來初始化struct;.
    10. 使用下面的代碼來罪魁禍首RabbitMQ broker:
    mosquitto_username_pw_set(mosq, NULL, NULL);
    mosquitto_connect(mosq, cip, 1883, 60);
    11. 使用下面的代碼來訂閱隊列:
    mosquitto_subscribe(mosq, NULL, "tecnology.rabbitmq.ebook", 0);
    12. 使用mosquitto_message_callback_set(mosq,on_message)來設置消息回調;

    13. 使用mosquitto_loop(mosq,1, 1)來開啟循環來接收服務端消息;
    14. 你的app準備好后,你就可以發送消息了。首先,你可以使用web管理控制臺:切換到amq.topic交換器,并使用路由鍵technology.rabbitmq.ebook來發布消息.
    15. 如果你想使用第1章節使用AMQP-使用topic交換器來處理消息路由食譜中的Java publisher,你需要使用路由鍵technology.rabbitmq.ebook將myTopicExchangeRoutingKey_01/08交換器與amq.topic 交換器進行綁定,正如我們在第2章節中超載AMQP標準-理解交換器到交換器食譜中看到的一樣(譯者注:綁定除了可發生在隊列與交換器外,也可以綁定交換器和交換器)。
    16. 使用mosquitto_disconnect(mosq) 來斷開client,隨后mosquitto_destroy(mosq)將釋放struct.
    17. 最后,使用mosquitto_lib_cleanup()來釋放包資源。

    如何工作
    從版本3.0開始, RabbitMQ支持MQTT協議. 你可以使用rabbitmq-plugins來啟用. Mosquitto是最流行的MQTT實現。在這個例子中,我們使用了它的C client library.通過此插件,使得AMQP和MQTT之間可相互通信!
    在初始化步驟后以及步驟9-12后,client就已經準備就緒了,這意味著iPhone已經創建了一個綁定到amq.topic 交換器上的隊列,其路由鍵為
    rabbitmq.ebook.現在你可以將隊列視為一個普通的AMQP隊列.
    現在打開web管理控制臺(the Managing RabbitMQ from a browser recipe in Chapter 3Managing RabbitMQ),并使用綁定的路由鍵發送一個test message,如下所示:
    你的iPhone現在已經收到了test message!
    現在我們假設第1章節使用AMQP-使用topic交換器來處理消息路由食譜是一個龐大企業系統中的一部分,它是難于修改的。
    你不能修改publisher和consumer的軟件,但你需要將"book's" 信息重定向到iPhone.
    非常簡單!使用e-2-e擴展就可從管理控制臺進行交換器綁定(參考第2章節超越AMQP標準-理解交換器到交換器食譜),在Add binding from this exchange panel中設置正確的路由鍵,如下所示:
    交換器已經綁定了.現在我們可以執行第1章節使用AMQP-使用topic交換器來處理消息路由食譜中的操作,看看會發生什么?你會看到消息被正確地路由了!
    所有通過路由鍵technology.rabbitmq.ebook來發送的消息都將被重定向到amq.topic exchange,然后再到你的iPhone app.
    更多
    在這個例子中,為了演示RabbitMQ能應用于多種應用上下文,我們混合使用了前面章節中學過的概念以及一些新的技術。
    不修改現有軟件,知道如何來添加或刪除新模塊,這非常重要.這很棒,不是嗎?

    TIP
    如果Mosquitto server不在LAN內,在連接mosquitto_connect(mosq, cip, 1883, 60 /*keepalive*/ )配置正確的keep-alive參數是非常重要的。
    也可參考
    MQTT: http://mqtt.org/.
    你需要閱讀整個Mosquitto C client 文檔:http://mosquitto.org/api/files/mosquitto-h.html.
    TIP
    You can run this example even on a MQTT server as test.mosquitto.org with the routing-key #.
    Other interesting links are http://www.eclipse.org/paho/ and http://mqtt.org/2011/08/mqtt-used-by-facebook-messenger.

    在Andriod上使用消息來更新Google Maps
    RabbitMQ與Android使用起來是相當簡單的; Dalvik虛擬機的字節碼完全兼容桌面Java版本, 且RabbitMQ JAR文件包含的API文件也是一樣的。
    在本食譜中,
    我們打算策劃一個如何在移動應用程序中使用RabbitMQ的真實例子,特別是使用其它Andriod設備發送的AMQP消息來更新Google Maps上的位置。
    但,本食譜中兩食譜項目中的第一部分,因此,在這里我們主要關注于應用程序消息,在下一個食譜中,我們將展示如何在Andriod設備中使用消息邏輯 。
    兩個食譜也是互補的,在本食譜中,我們將在Anriod上展示RabbitMQ consumer,它將在地圖上繪畫出收到的位置.producer會在下個食譜中展示,它會通過RabbitMQ來發布位置. 你可以在Chapter04/Recip中找到本食譜中的源碼。

    準備
    要使本食譜正常工作,你需要:
    1. Android SDK tools (http://developer.android.com/sdk/index.html)
    2. Andriod API至少為11的Android設備(Honeycomb 和 Android 3.0.x或更高), 并提供OpenGL ES 2.0支持
    3. 需要在Andriod設備上安裝Google Play
    如何做
    1. 從Android SDK Manager中安裝Google Play Services:
    2. 從Eclipse中,創建一個新的Android application. 然后跟隨向導,最小的SDK必須是API11. 創建一個空的Activity.
    3. 仔細參照Google Play服務提供的說明: http://developer.android.com/google/play-services/setup.html
    以及如何使用Google Map Android API v2上的說明: https://developers.google.com/maps/documentation/android/start.
    4. 將RabbitMQ library files (commons-cli-1.1.jarcommons-io-1.2.jar,and rabbitmq-client.jar)拷貝到project的libs目錄.
    5. 在由Eclipse向導創建的"Hello world!" TextView位置 ,插入一個片斷—你可以編輯對應的XML布局文件activity_main.xml,并插入下面的內容:
    <fragment
    android:id="@+id/mapFragment"
    android:name="com.google.android.gms.maps.MapFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true" />
    6. 創建一個包含經度位置和緯度位置簡單的MapCmd類.
    7. 創建單例枚舉(enum)MapController,它實現了MapCmd類的線程安全FIFO隊列.

    8. 創建一個用于異步消費RabbitMQ消息的ActualConsumer類,正好我們在第1章,使用AMQP中看到的一樣,并覆蓋其handleDelivery方法:
    public void handleDelivery(
    String consumerTag,
    Envelope envelope,
    BasicProperties properties,
    byte[] body) throws java.io.IOException {
    String message = new String(body);
    MapController.INSTANCE.AddCmdFromJson(message);
    }
    9. 創建RabbitmqHandler類,并暴露其Connect()和Disconnect()方法,在其內部,它將調用所有需要的RabbitMQ API,以使app異步消費消息。本類中自定義的連接參數將以常量的方式進行定義。
    10. 創建UpdateMap類,其內部是Runnable 接口的MainActivity實例, 它會定期地執行繪畫操作:
    public class UpdateMap implements Runnable {
    GoogleMapmMap;
    publicUpdateMap(GoogleMapmMap_) {
    mMap = mMap_;
    }
    @Override
    public void run() {
    MapController.INSTANCE.ExecuteCmds(mMap);
    updateHandler.postDelayed(this, UPDATE_INTERVAL);
    }
    };
    11. 在最初由Eclipse創建的MainActivity類中,填充OnCreate() 方法:
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mMap = ((MapFragment)
    getFragmentManager().findFragmentById(R.id.mapFragment)).getMap();
    mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
    updateMap = new UpdateMap(mMap);
    updateHandler = new Handler();
    updateHandler.postDelayed(updateMap, UPDATE_INTERVAL);

    rabbitmqHandler = new RabbitmqHandler();
    AsyncTask<Void, Void, Void>aconnect = new
    AsyncTask<Void, Void, Void>() {
    @Override
    protected Void doInBackground(Void... params) {
    try {
    rabbitmqHandler.Connect();
    } catch (IOException e) {
    // TODO handle this
    }
    return null;
    }
    };
    aconnect.execute((Void)null);
    }
    12. 最后對稱地實現OnDestroy()方法來清理連接和資源.

    如何工作
    為了要使用Google Maps, 則必須安裝Google Play,以使其服務對于 Android SDK開發,調試,部署。另外,我們必須在Google API console
    (https://code.google.com/apis/console)上注冊過
    Google Maps。
    不要忘記在AndroidManifest.xml中插入你自己的key. 在我們的例子中,我們留了一個占位符:
    <meta-data
    android:name="com.google.android.maps.v2.API_KEY"
    android:value="SET-YOUR-GOOGLE-ANDROID-MAPS-KEY-HERE"/>
    在我們講述了一個基礎Google Maps 程序后(步驟 1-5),我們已經通過RabbitMQ中介,實現了從其它設備接收地球坐標的必要邏輯。
    因為需要響應的安卓移動應用程序,必須強制性從一個不同的線程上執行接收操作,而主線程則執行一些繪圖和地圖相關的操作。這就是我們要實現一個線程安全MapCmd類的FIFO隊列的原因,并使其對于 MapController 單例可用; MapCmd 對象是通過RabbitMQ consumer線程,調用MapController.INSTANCE.AddCmdFromJson()方法塞入隊列的.

    MapController FIFO 隊列消費者是Android程序的主線程. 我們創建了一個Handler對象來從main線程中周期性地調用updateMap.run()方法,并從隊列中消費MapCmd命令, 以及更新地圖顯示。
    要完成這個應用程序,我們必須使用IP地址和RabbitMQ broker的憑證來定制RabbitmqHandler類,此類負責處理與RabbitMQ的連接以及消費者線程的創建。
    在Andriod程序的的main activity 中,我們創建并初始化了RabbitmqHandler實例(步驟11), 但值得注意的是我們在AsyncTask匿名對象中已經調用了它的Connect()方法; 并且強制不在主線程(包含RabbitMQ連接的線程)中執行任何網絡同步操作.
    當我們在 Andriod設備上啟動應用程序時,我們可以看到Google Maps會加載默認的世界地圖,在我們發送消息前,什么都不會發生。要測試這個例子,需要在web瀏覽器中打開RabbitMQ管理控制臺 (參考第3章節-管理RabbitmMQ中的從瀏覽器中管理RabbitMQ食譜); 我們應該能夠看到一個從Andriod設備連接的臨時隊列.我們可以直接向這個隊列發布消息,也可以將消息發布到amq.fanout交換器,并指定負載為JSON 格式,如下面的代碼所示:
    {"lat":44.4937,"lon":11.3430}
    當我們提交消息后,應用程序會聚焦在這里. 通過發送多個這個點附近的坐標, 我們將繪制出下面的屏幕截圖:

    更多
    在本食譜中,我們已經展示了如何在Andriod設備上開發基于消息通信的分布式應用程序.為了簡單起見,我們省略了許多關于身份認證,負載均衡,安全的細節。
    此外,這個例子只完成了項目的一半,在這里,我們只實現了消費者,以及從RabbitMQ控制臺來發送JSON格式的消息。
    項目的后半部分將在下個食譜中展示,在你跳到下個章節之前,你需要注意地理坐標的數據可以是任意的-例如,它也可以來自嵌入式GPS設備。

    TIP
    對于嵌入式設備的移動設備,出于性能優化,應該盡量使用MQTT,而不是使用native RabbitMQ AMQP協議,這一點,我們已經在通過MQTT來綁定iPhone app與RabbitMQ食譜中看到過了.

    從Andriod后端發送消息
    在本食譜中,我們將完成前面食譜中開始的項目。我們將實現一個Android app來發布當前設備的位置給RabbitMQ. 當然,這個例子相對于前一個例子來說,是比較簡單的,因為我們不會在地圖上繪制位置,但我們仍然會需要Google Play 服務,因為我們需要使用它的位置服務。同時,對于設備上可用的位置傳感器,它也提供了一個有用的抽象,以使應用程序能夠兼容廣泛的Andriod設備。

    準備
    要完成此食譜 ,我們需要:
    1. Android SDK 工具 (http://developer.android.com/sdk/index.html)
    2. 一臺帶Android API 11級以上(Honeycomb 和Android 3.0.x 或更高)的Andriod設備
    3. Andriod設備上安裝有Google Play服務
    如何做
    1. 從Android SDK Manager中安裝Google Play 服務,這已經在前面的食譜中看過了.
    2. 創建 一個新的Android應用程序.跟隨向導,需要的最小SDK必須是API11.創建一個空的Activity.
    3. 仔細遵循Google的說明來設置Google Play服務(http://developer.android.com/google/play-services/setup.html).
    4. 拷貝RabbitMQ library 文件(commons-cli-1.1.jarcommons-io-1.2.jar,and rabbitmq-client.jar)到項目的libs目錄中.
    5. 在由 Eclipse wizard創建Hello world! TextView的地方, 插入一個名為followmeSwitch的 switch widget.你可以編輯相應的XML layout文件activity_main.xml,并插入下面的代碼:
    <Switch
    android:id="@+id/followmeSwitch"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="28dp"
    android:text="@string/followme" />
    6. 創建一個繼承至IntentService的SenderService類.
    7. 在MainActivity.java中設置開關動作:
    final Switch fms =(Switch)findViewById(R.id.followmeSwitch);
    fms.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(CompoundButtonbuttonView,
    booleanisChecked) {
    if (isChecked) {
    serviceIntent = new Intent(MainActivity.this,
    SenderService.class);
    startService(serviceIntent);
    } else {
    stopService(serviceIntent);
    } }
    });

    如何工作
    在本食譜中,我們接近了混合使用RabbitMQ和Android技術的另一種模式: 在后端來發布消息,即時是用戶界面在Andriod設備上不可視。
    首先,我們創建了一個帶開關的標準Android應用程序:當打開時,我們可以向RabbitMQ broker來分發消息,當關閉時,我們可以停止消息的分發。
    因此,我們將followmeSwitch操作綁定了SenderService中 (步驟7).記住這點是很重要的:當我們在Andriod服務中啟動一個后臺job時,后臺事件依然是通過應用程序的主線程來執行的,并且我們也需要采用與設計Andriod GUIS時相同的響應方針.
    但在我們的例子中,我們已經決定使用IntentService 幫助類來啟動一個不間斷運行的后端線程.在這個線程中,我們將連接broker,并且通過調用locationClient.getLastLocation()方法周期性地發送設備當前位置給RabbitMQ(參考步驟6中提到的源文件代碼).

    TIP
    在這個例子中,我們使用了Andriod標準的序列化類android.util.JsonWriter來代替前面我們看到的RabbitMQ JSONWriter. 事實上,后者不能在Andriod設備上工作,因為Dalvik只包含了Java beans的子集,缺少了相關的反射.
    只要用戶關閉了開關,我們就會立即退出線程.通過在一臺設備上運行此程序,并在另一臺設備上運行前面食譜中的程序,我們可以通過RabbitMQ消息來交流我們的地理位置。
    更多 
    Google localization client library允許位置變化時觸發事件,因此這應該是發送地理位置坐標的最佳方法。這種方案可以優化電池的使用,但為了簡單起見,我們沒有這樣做。但就此應用程序來說,功能是完整的。你可以運行多個不同的設備來允當消費者-當我們將消息發送到fanout時,它們會同步的更新位置。你甚至可以并發地運行多個生產者,但當前實現只是將它們的數據混合在一起,如果要從多個不同設備來繪制多個不同軌跡,你需要替換fanout交換器,每個生產者需要使用topic交換器且帶不同的路由鍵來發送消息。
    使用Qpid來交換RabbitMQ消息
    在本食譜中,我們將看到如何使用RabbitMQ client來與Apache Qpid交互.
    準備
    你需要從http://qpid.apache.org/download.html下載 Qpid;我們使用的是Java版本.
    如何做
    1. 從前面的章節中來獲取Java示例,如:第1章使用AMQP中的廣播消息或使用topic交換器來處理消息路由食譜中的例子
    2. 運行Qpid server.
    3. 運行clients.

    如何工作
    當你從第1章使用AMQP中的廣播消息中的例子來執行client的時候,Qpid server與的RabbitMQ的行為一樣,如下所示:
    TIP
    QPid 使用相同的RabbitMQ端口,因此如果要在同一臺機上運行這兩者,你可以修改端口或者關閉RabbitMQ(端口沖突).
    使用Mosquitto來交換RabbitMQ消息
    在這個例子中,我們會創建一個java proxy,此代理會獲取來自Andriod后臺來發布消息食譜例子中發布的消息,并將它們轉發到任何一個移動OS,正如我們在通過MQTT來綁定iPhone應用程序到RabbitMQ食譜中看到的一樣,可按下面的截圖來使用MQTT服務器:
    準備
    你需要Paho Java library client, 你可在http://git.eclipse.org/c/paho/org.eclipse.paho.mqtt.java.git/中找到.

    如何做
    1. 你需要創建一個amq.fanout交換器的消費者:
    String myQueue = channel.queueDeclare().getQueue();
    String myExchange = "amq.fanout";
    channel.queueBind(myQueue,myExchange,"");
    2. 使用Paho Java client來創建一個MQTT連接:
    mqttClient = new MqttClient(MQTTip,
    MqttClient.generateClientId());
    mqttClient.connect();
    3. 將獲取到的GPS消息發送給MQTT服務器:
    mqttClient.publish("follow.me", message, 0, false);
    4. 當通過MQTT綁定iPhone app與RabbitMQ時,修改路由的topic:
    mosquitto_subscribe(mosq, NULL, "follow.me", 0);
    5. 當通過MQTT綁定iPhone app與RabbitMQ時,使用MQTT服務器IP的地址修改服務器的IP

    如何工作
    按照步驟1-3,我們已經創建了兩個連接,一個是RabbitMQ,一個是MQTT服務器。
    當Android app發送了一些消息時,消息者接收到消息后會使用mqttClient.publish("follow.me", message,0,false)將其發布Mosquitto server;.
    在iPhone程序上,你需要使用follow.me來修改topic,你也需要修改服務器IP地址,結果如下面的屏幕截圖所示:

    因此,如果Android app啟用了后,你可以在你的iPhone app中看經度和緯度.

    TIP
    我們使用了公共服務器test.mosquitto.org,在使用前,請先網站的免責聲明.

    更多
    We have divided the broker's responsibility, one for the AMQP protocol and one for the MQTT protocol.
    也可參考
    你可在http://www.eclipse.org/paho/找到更多關于Paho的更多信息. 當你創建Paho Java client 源碼時,構建器會在你的文件系統:
    yourbasedir/org.eclipse.paho.mqtt.java/org.eclipse.paho.client.mqttv3/build/dist/javadoc中創建javadoc.

    使用.Net來綁定WFC應用程序
    在這個例子中,我們將展示如何使用不同的技術來構建一個分布式應用程序. 其目標是創建一個健康程序來收集本地網絡應用程序的狀態信息。如果出現問題的話,應用程序會觸發警報并將其發送給移動設備,在這里,我們使用Amazon EC2云來提供高可用性。但,EC2不是強制性的.
    我們將使用Windows Communication Foundation (WCF) 和 RabbitMQ WCF 服務模塊來創建這個例子. WCF service 將扮演主機健康收集器,并且會有多個客戶端會向WCF服務發送消息。
    RabbitMQ service 模塊允許在AMQP之上使用SOAP協議. 我們也會將消息重定向到 also redirect the messages to a mobile iOS application via MQTT using the proxy already seen in the recipe
    Exchanging RabbitMQ messages with Mosquitto.
    In this recipe, we are going to use AMQP, SOAP, and MQTT as protocols, RabbitMQ, WCF,and iOS as technologies, and finally, an AWS EC2 instance as the server. The architecture is
    summarized in the following figure:

    準備
    你需要Visual Studio 2005或2008, .NET framework 3.5,以及RabbitMQ WCF 服務模塊, 這些你可以在http://www.rabbitmq.com/dotnet.html中找到.
    下載WCF library的zip包.

    如何做
    1. 創建一個WCF應用程序,然后通過拷貝project中libs目錄下的RabbitMQ.ServiceModel.dll來配置RabbitMQ service模塊. 接著通過右部按扭來打開App.config文件,并導航至Edit WCF configuration Advanced binding extension new 并選擇剛剛拷貝的文件。
    2. 通過導航至WCF configuration bindings new bind configuration來創建一個綁定, 并按下面的截圖為配置RabbitMQ實例:
    3. 通過導航至Edit configuration Endpoints New Service End point來配置WCF end point, 然后設置Contract為WcfLib.IService1rabbitmqExtension的Binding屬性 (在步驟1中已配置), 以及rabbitmqBinding的BindingConfiguration屬性(步驟2已配置). 其結果如下所示:
    4. 導航至Edit configuration services endpoint new and insert soap.amqp:///來配置host.
    5. 創建Service1接口方法SendMachineInfo(MachineInfomachine Info),并在Service1 類中實現.
    6. 創建一個新的C# project,為了使用接口方法,還需要添加服務端依賴.
    7. 配置client App.conf ,并為RabbitMQ service 模塊添加配置 (步驟 1和2 ), 然后導航至Edit configuration Client endpoints and adding soap.amqp:///Service1來配置client service; 綁定截圖如下
    8. 使用ClientService :ClientBase<IService1>, IService1來啟動client .
    9. 使用base.Channel.SendMachineInfo(machineInfo)來調用接口;
    10. 如果你喜歡,你可以修改Exchanging RabbitMQ messages with Mosquitto 食譜來向iphone發送警報.你只需要修改下面的行:
    String myExchange = "amq.direct";
    channel.queueBind(myQueue,myExchange,"/Service1");

    如何工作
    根據步驟1-4, 我們使用RabbitMQ繼承了WCF 標準綁定, 并且我們創建了一個單向通信,它是一種發后即忘模式,且服務端只創建了一個綁定至 amq.direct 交換器的隊列,其路由鍵為/Service1.
    MachineInfo類是按照SOAP來編碼的 (步驟9); 服務器隨后會執行函數SendMachineInfo(MachineInfomachineInfo). SOAP消息作為AMQP消息的內嵌負載。在這個例子中,服務端將警告消息存儲在C:\warningstatus.store文件中,clients每秒都會檢查CPU和內存的使用情況,并在出現警告時執行遠程調用。如果你執行步驟10,你就會在app中收到消息,就像下面展示的一樣:
    Mosqui
    更多
    在這個例子中,我們已經嘗試使用了RabbitMQ Amazon Elastic Compute Cloud(EC2),以及不同網絡中的WCF WCF客戶機和服務器。理解RPC調用是由broker來保證,且與標準RPC調用(模塊之間直接通信)有所區別,這是很重要的。在這種方式中,架構是松耦合的,RabbitMQ是當作bus來使用的,因此它可以附著不同的clients.WCF 綁定是一種Microsoft架構與其它系統集成時的強有力工具。
    你可以使用web管理控制臺或命令行來監控隊列。
    通信也可以是雙向的,使用兩個隊列:一個用于請求,另一個用于異步響應

    也可參考
    查看https://www.rabbitmq.com/dotnet.html 并找到 section A description of the WCF binding and Service Model.
    查看http://aws.amazon.com/ec2/ 來了解更多關于Amazon EC2的信息;總之,我們也會在接下來的Amazon cloud章節中介紹.
    posted on 2016-06-13 20:25 胡小軍 閱讀(1772) 評論(2)  編輯  收藏 所屬分類: RabbitMQ

    FeedBack:
    # re: RabbitMQ-CookBook-Chapter4-Mixing Different Technologies[未登錄] 2016-06-14 09:14 XIAOCAO
    圖片全部顯示不出來!  回復  更多評論
      
    # re: RabbitMQ-CookBook-Chapter4-Mixing Different Technologies 2016-06-14 09:36 hxj
    @XIAOCAO
    抱歉,后面會增加圖片。如果想查看圖片,可以閱讀原書Rabbit CookBook  回復  更多評論
      
    主站蜘蛛池模板: 国产亚洲综合久久系列| 亚洲国产亚洲片在线观看播放| 日韩电影免费在线观看网站| 4444亚洲国产成人精品| **aaaaa毛片免费同男同女| 亚洲欧美日韩中文高清www777| 日韩免费视频在线观看| 拍拍拍无挡免费视频网站| 亚洲综合视频在线观看| 免费萌白酱国产一区二区| 日韩免费高清播放器| 亚洲欧美日韩中文高清www777| 亚洲国产精品无码久久久不卡| 91免费资源网站入口| 中文字幕无码一区二区免费| 亚洲夂夂婷婷色拍WW47| 亚洲大尺度无码专区尤物| 日韩成人在线免费视频 | 亚洲国产欧美日韩精品一区二区三区| 四虎永久免费地址在线观看| 三年片在线观看免费观看大全动漫| 亚洲免费闲人蜜桃| 亚洲精品无码久久久久| 宅男666在线永久免费观看| 无码人妻精品中文字幕免费 | a毛片免费全部在线播放**| 亚洲一区精品中文字幕| 国产a不卡片精品免费观看| aⅴ免费在线观看| 中国一级特黄的片子免费| 亚洲youwu永久无码精品| 久久亚洲精品无码aⅴ大香| 国产成人综合亚洲AV第一页| 日韩一区二区三区免费体验| 精品国产sm捆绑最大网免费站| 99久久99这里只有免费的精品| 国产精品无码亚洲一区二区三区| 亚洲精品二三区伊人久久| 久久精品国产亚洲av影院| 国产综合亚洲专区在线| 亚洲国产综合精品一区在线播放|