您好,登錄后才能下訂單哦!
本篇內容介紹了“怎么構建多平臺的Ignite集群”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
Ignite集群可以由它支持的任意平臺啟動的節點組成,包括Java、.NET和C++。本文會介紹如何通過NuGet和Maven運行一個.NET/Java集群
本文適用于對Java不熟悉的.NET開發人員,反之亦然,因此描述的會比較詳細。 本文會使用如下的軟件:
Visual Studio 2015(包括NuGet; 免費社區版);
IntelliJ IDEA (包括Maven; 免費社區版)。
連接Java和.NET節點;
使用Java和.NET類,通過同樣的名字和字段訪問Ignite緩存中的共享數據;
運行持續查詢,觀察來自另一個平臺的實時數據更新。
啟動IntelliJ IDEA,然后點擊“Create New Project”:
選擇Maven然后點擊“Next”:
輸入Maven信息,點擊“Next”然后“Finish”:
完成之后,會看到新項目打開的pom.xml
文件:
為project
片段增加Ignite依賴:
<dependencies> <dependency> <groupId>org.apache.ignite</groupId> <artifactId>ignite-core</artifactId> <version>1.7.0</version> </dependency> </dependencies>
IDEA可能會詢問是否導入項目改變,點擊任意的鏈接:
在src\main\java中添加Demo
類,代碼如下:
import org.apache.ignite.Ignition; public class Demo { public static void main(String[] args) { Ignition.start(); } }
通過Shift+F10
運行,然后在IDEA的控制臺上確認節點是否啟動:
通過Ctrl+F2
或者停止按鈕終止程序。
啟動Visual Studio然后點擊File -> New -> Project:
選擇Visual C# -> Windows -> Console Application:
確保在上邊選擇了.NET Framework版本4及以上
點擊“OK”,然后就會生成一個空的控制臺工程;
打開NuGet控制臺:Menu -> Tools -> NuGet Package Manager -> Package Manager Console;
輸入Install-Package Apache.Ignite
:
點擊回車,然后就會輸出Successfully installed 'Apache.Ignite 1.7.0' to IgniteMultiPlatform
這樣的消息。
將Program.cs
的內容改成如下這樣:
using System; using Apache.Ignite.Core; class Program { static void Main(string[] args) { Ignition.Start(); Console.ReadKey(); } }
通過Ctrl-F5
啟動程序,然后在控制臺中確認Ignite節點已經啟動:
現在,就可以同時在IDEA中啟動Java節點,在Visual Studio中啟動.NET節點,這時會在他們中的一個發現如下的錯誤:
IgniteSpiException: Local node's binary configuration is not equal to remote node's binary configuration [locBinaryCfg={globSerializer=null, compactFooter=true, globIdMapper=org.apache.ignite.binary.BinaryBasicIdMapper}, rmtBinaryCfg=null]
這個錯誤是說,.NET節點在BinaryConfiguration
中只支持BinaryBasicIdMapper
和BinaryBasicNameMapper
,需要在Java中顯式地進行設置,將Ignition.start();
行改成如下的代碼:
BinaryConfiguration binCfg = new BinaryConfiguration(); binCfg.setIdMapper(new BinaryBasicIdMapper()); binCfg.setNameMapper(new BinaryBasicNameMapper()); IgniteConfiguration cfg = new IgniteConfiguration().setBinaryConfiguration(binCfg); Ignition.start(cfg);
這時同時啟動Java和.NET節點,驗證他們可以發現對方:
[15:04:17] Topology snapshot [ver=2, servers=2, clients=0, CPUs=8, heap=7.1GB]
現在各個節點已經聯通,之后會在每個平臺上寫一個簡單的聊天程序來演示數據的交換。代碼非常簡單,因為API是相同的,并且語言語法也差不多。 首先,定義名字和成員完全相同的類。
右擊src\main\java項目文件夾然后選擇New -> Java Class,輸入Message
名字,代碼如下:
public class Message { public Message(String author, String text) { this.author = author; this.text = text; } final String author; final String text; }
右擊Solution Explorer的項目節點,然后選擇Add -> Class…,輸入Message
名字,代碼如下:
class Message { public Message(string author, string text) { Author = author; Text = text; } public string Author { get; } public string Text { get; } }
Basic
映射器是區分大小寫的,并且會忽略命名空間(包),因此這兩個類是可以互相映射的,可以在一個平臺中將Message實例注入緩存,然后在另一個平臺中獲取。 現在開始寫聊天程序本身,邏輯比較簡單:用戶輸入一個聊天信息,然后將其注入緩存,持續查詢會收到所有的緩存更新通知并且顯示他們。
將main
方法的代碼改成如下:
// Retrieve user name System.out.print("Hi, enter your name: "); Scanner consoleScanner = new Scanner(System.in); String name = consoleScanner.nextLine(); // Get or create cache IgniteCache<Long, Message> cache = ignite.getOrCreateCache("chat"); // Initialize unique ID sequence IgniteAtomicSequence messageId = ignite.atomicSequence("chatId", 0, true); // Set up continuous query ContinuousQuery<Long, Message> qry = new ContinuousQuery<>(); qry.setLocalListener(iterable -> { // This will be invoked immediately on each cache update for (CacheEntryEvent<? extends Long, ? extends Message> evt : iterable) System.out.println(evt.getValue().author + ": " + evt.getValue().text); }); cache.query(qry); // Run the chat loop while (true) { System.out.print("> "); String msgText = consoleScanner.nextLine(); Long msgId = messageId.incrementAndGet(); cache.put(msgId, new Message(name, msgText)); }
在Ignite.NET中有兩處不同(這些特性預計會在下一版本中實現):
需要在BinaryConfiguration中注冊一個用于緩存的類型(Java會自動做這個事);
API中還不支持Lambda表達式,需要單獨地實現ICacheEntryEventListener<K, V>
接口。
因此,創建一個單獨的類,代碼如下:
using System; using System.Collections.Generic; using Apache.Ignite.Core.Cache.Event; class CacheListener : ICacheEntryEventListener<long, Message> { public void OnEvent(IEnumerable<ICacheEntryEvent<long, Message>> evts) { foreach (var evt in evts) Console.WriteLine($"{evt.Value.Author}: {evt.Value.Text}"); } }
然后更新Main
方法:
// Retrieve user name Console.Write("Hi, enter your name: "); var name = Console.ReadLine(); // Register Message type var cfg = new IgniteConfiguration { BinaryConfiguration = new BinaryConfiguration(typeof(Message)) }; // Start Ignite and retrieve cache var ignite = Ignition.Start(cfg); var cache = ignite.GetOrCreateCache<long, Message>("chat"); // Initialize unique ID sequence var messageId = ignite.GetAtomicSequence("chatId", 0, true); // Set up continuous query cache.QueryContinuous(new ContinuousQuery<long, Message>(new CacheListener())); // Run the chat loop while (true) { Console.Write("> "); var msgText = Console.ReadLine(); var msgId = messageId.Increment(); cache[msgId] = new Message(name, msgText); }
“怎么構建多平臺的Ignite集群”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。