You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Apache Geode .NET原生客户端执行连续查询时遇序列化异常

解决Apache Geode .NET客户端连续查询"Got unhandled message type 26"异常

这个错误Got unhandled message type 26通常是因为协议消息不兼容或者序列化配置不匹配导致的,结合你的场景(存储简单字符串、常规查询正常),我整理了几个针对性的解决思路:

1. 优先检查Java服务端和.NET客户端的Geode版本一致性

Geode的Java服务端和Native .NET客户端的版本必须完全一致(比如都是1.15.0、1.16.0),版本不匹配会导致协议消息类型不识别——这是触发message type 26错误最常见的原因。

  • 确认Java服务端的Geode版本(比如看pom.xml/gradle依赖)
  • 确认.NET客户端的Apache.Geode NuGet包版本和服务端完全一致

2. 移除不必要的PDX序列化配置(针对字符串场景)

你存储的是简单字符串,Geode原生支持基本类型的序列化,不需要PDX。当前两端的PDX配置反而可能导致序列化冲突:

服务端修改:

  • 删除cache.xml中的<pdx>整个配置块
  • 移除Java代码中的.setPdxReadSerialized(true)

.NET客户端修改:

  • 移除CacheFactory中的.SetPdxReadSerialized(true).SetPdxIgnoreUnreadFields(true)
  • 删掉cache.TypeRegistry.PdxSerializer = new ReflectionBasedAutoSerializer();这一行

3. 修正连续查询的类型匹配问题

你的Region是<string, string>,但连续查询相关的对象用了<string, object>,类型不匹配会导致序列化解析失败:

.NET客户端连续查询代码修改:

// 修正泛型类型为<string, string>,和Region一致
CqAttributesFactory<string, string> cqAttribsFactory = new CqAttributesFactory<string, string>();
ICqListener<string, string> listener = new CacheListener<string, string>();
cqAttribsFactory.InitCqListeners(new ICqListener<string, string>[] { listener });
CqAttributes<string, string> cqAttribs = cqAttribsFactory.Create();
CqQuery<string, string> cquery = qs.NewCq<string, string>("select * from /example_region", cqAttribs, false);

对应的CacheListener实现调整:

确保Listener的泛型参数和Region匹配,避免类型转换错误:

public class CacheListener<TKey, TResult> : ICqListener<TKey, TResult> 
{
    public virtual void OnEvent(CqEvent<TKey, TResult> ev) 
    {
        // 直接使用TResult类型,不需要强制转object
        TResult val = ev.getNewValue();
        TKey key = ev.getKey();
        CqOperation opType = ev.getQueryOperation();
        string opStr = opType switch 
        {
            CqOperation.OP_TYPE_CREATE => "CREATE",
            CqOperation.OP_TYPE_UPDATE => "UPDATE",
            _ => "DESTROY"
        };
        Console.WriteLine("MyCqListener::OnEvent called with key {0}, op {1}, value {2}.", key, opStr, val);
    }

    // 其余方法保持不变
    public virtual void OnError(CqEvent<TKey, TResult> ev) => Console.WriteLine("MyCqListener::OnError call");
    public virtual void Close() => Console.WriteLine("MyCqListener::Close call");
}

4. 确保服务端Region支持订阅功能

连续查询依赖Geode的订阅机制,需要给Region开启订阅支持:
修改服务端cache.xml的Region配置:

<region name="example_region">
    <region-attributes refid="REPLICATE">
        <!-- 开启订阅支持 -->
        <subscription-enabled>true</subscription-enabled>
    </region-attributes>
</region>

5. 验证客户端Pool配置

确认.NET客户端的Pool配置正确指向服务端的cache-server端口(你服务端配置的是40404),比如客户端的cache.xml中Pool的配置应该类似:

<pool name="serverPool">
    <server host="localhost" port="40404"/>
</pool>

按照以上步骤逐一排查后,重新启动服务端和客户端,连续查询应该可以正常运行。

内容的提问来源于stack exchange,提问作者Eluamous

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:25:52