簡體   English   中英

Apache Geode - 在基於 DUnit 的測試服務器/遠程服務器上使用來自客戶端的相同代碼創建區域

[英]Apache Geode - Creating region on DUnit Based Test Server/Remote Server with same code from client

我試圖在以下文檔中重用代碼: https://geode.apache.org/docs/guide/11/developing/region_options/dynamic_region_creation.ZFC35FDC70D5FC69D269883A8

我遇到的第一個問題是

Cache cache = CacheFactory.getAnyInstance();
Region<String,RegionAttributes<?,?>> regionAttributesMetadataRegion = createRegionAttributesMetadataRegion(cache);

不應在構造函數中執行。 如果是這樣,代碼在客戶端實例中執行,它在非服務器錯誤上失敗。當這個修復我收到

[fatal 2021/02/15 16:38:24.915 EET <ServerConnection on port 40527 Thread 1> tid=81] Serialization filter is rejecting class org.restcomm.cache.geode.CreateRegionFunction
java.lang.Exception: 
at org.apache.geode.internal.ObjectInputStreamFilterWrapper.lambda$createSerializationFilter$0(ObjectInputStreamFilterWrapper.java:233)

問題是代碼正在 dunit MemberVM 上執行,所需的 class 實際上是 package 的一部分,在該部分下執行測試。 所以我想我應該以某種方式將這些類(或者可能是 jar)分別注冊到 dunit MemberVM。 怎么做?

另一個問題是:當前代碼正在檢查該區域是否存在,如果不存在則調用該方法。 在這兩種情況下,它還嘗試創建 clientRegion。 問題是這是否是正確的方法?

Region<?,?> cache = instance.getRegion(name);
if(cache==null) {
    Execution execution = FunctionService.onServers(instance);
    ArrayList argList = new ArrayList();
    argList.add(name);
    Function function = new CreateRegionFunction();
    execution.setArguments(argList).execute(function).getResult();
}

ClientRegionFactory<Object, Object> cf=this.instance.createClientRegionFactory(ClientRegionShortcut.CACHING_PROXY).addCacheListener(new ExtendedCacheListener());
this.cache = cf.create(name);

BR Yulian Oifa

我遇到的第一個問題是 Cache cache = CacheFactory.getAnyInstance(); 不應在構造函數中執行。 如果是這樣,代碼在客戶端實例中執行,它在非服務器錯誤上失敗。當這個修復我收到

在服務器端注冊Function ,您可以通過ID執行它,而不是通過網絡發送 object(因此您不需要實例化Serialization filter )錯誤。 例如, FunctionService.onServers(instance).execute(CreateRegionFunction.ID)

問題是代碼正在 dunit MemberVM 上執行,所需的 class 實際上是 package 的一部分,在該部分下執行測試。 所以我想我應該以某種方式將這些類(或者可能是 jar)分別注冊到 dunit MemberVM。 怎么做?

事實上,出於安全原因, Geode不允許序列化/反序列化任意類。 內部Geode分布式測試使用MemberVM並設置一個特殊的屬性 ( serializable-object-filter ) 來規避這個問題。 這是一個示例,說明如何在自己的測試中實現這一目標。

另一個問題是:當前代碼正在檢查該區域是否存在,如果不存在則調用該方法。 在這兩種情況下,它還嘗試創建 clientRegion。 問題是這是否是正確的方法?

如果客戶端應用程序使用動態創建的區域,那么是的,您應該創建它,否則您將無法使用它。


作為旁注, Geode在創建Region時實現了很多內部邏輯,因此我不建議您自己動態創建區域。 相反,建議直接使用gfsh create region命令,或者查看它的內部工作原理(參見此處)並嘗試重新使用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM