【问题标题】:Enabling compatibility mode in infinispan doesn't seems to do anything?在 infinispan 中启用兼容模式似乎没有任何作用?
【发布时间】:2015-07-08 19:21:34
【问题描述】:

我是 infinispan 的新手,但功能满足我的需求。

我正在使用带有缓存的 Java 嵌入式 HotRot 端点的 C++ HotRod 客户端,当我放入 K/V 时,Java 缓存侦听器会抛出有关 B[ 和 String 之间的转换错误的异常。

我发现我可能必须启用兼容模式,所以我做了,但它似乎没有做任何事情。

这是我的代码:

主要java软件:

public static void main(final String[] args)  
{  
     final EmbeddedCacheManager manager = new DefaultCacheManager();  
     final PersistenceConfigurationBuilder persistConfig = new ConfigurationBuilder().persistence();  
     final SingleFileStoreConfigurationBuilder fileStore = new SingleFileStoreConfigurationBuilder(persistConfig).location("cache");  
     final Configuration config = persistConfig.addStore(fileStore).build();  
     config.compatibility().enabled();  
     manager.defineConfiguration("records", config);  

     final Cache<String, String> c = manager.getCache("records");  
     c.addListener(new CacheListener());  

     new HotRodServer().start(new HotRodServerConfigurationBuilder().build(), manager);  

     while(true)  
     {  
          try  
          {  
               Thread.sleep(1000);  

               System.out.println(c.size());  
          }  
          catch(final InterruptedException e)  
          {  
          }  
     }  
}  

我的缓存监听器:

@CacheEntryCreated  
public void observeAdd(final CacheEntryCreatedEvent<Object, String> event)  
{  
     if(event.isPre())  
          return;  

     System.err.println(event.getKey().getClass().getSimpleName());  
     System.err.println("new entry : " + event.getKey() + " -> " + event.getValue());  
}  

异常摘录:

Caused by: java.lang.ClassCastException: [B cannot be cast to java.lang.String
                at recordprocessing.CacheListener.observeAdd(CacheListener.java:38) ~[classes/:na]
                at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_25]
                at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_25]
                at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_25]
                at java.lang.reflect.Method.invoke(Method.java:483) ~[na:1.8.0_25]
at org.infinispan.notifications.impl.AbstractListenerImpl$ListenerInvocationImpl$1.run(AbstractListenerImpl.java:286) ~[infinispan-core-7.2.3.Final.jar:7.2.3.Final]
                ... 60 common frames omitted

我的 c++ hotrod 客户端正是来自文档:

#include "infinispan/hotrod/ConfigurationBuilder.h"  
#include "infinispan/hotrod/RemoteCacheManager.h"  
#include "infinispan/hotrod/RemoteCache.h"  
#include <stdlib.h>  

using namespace infinispan::hotrod;  

int main(int argc, char** argv)  
{  
     ConfigurationBuilder b;  
     b.addServer().host("127.0.0.1").port(11222);  
     RemoteCacheManager cm(builder.build(), false);  
     RemoteCache<std::string, std::string> cache = cm.getCache<std::string, std::string>(std::string("records"));  

     cm.start();  

     std::string k1("key13");  
     std::string v1("boron");  

     rc.put(k1, v1);  

     cm.stop();  

     return 0;  
}  

我做错了什么?以及需要进行哪些更改才能使此代码正常工作?

谢谢。

最好的问候。

【问题讨论】:

  • 每当您问同样的问题时,请与 JBoss 论坛交叉链接。
  • 这就是我所做的,现在我可以发布答案了。

标签: java c++ infinispan


【解决方案1】:

我的代码是错的,其实我没有设置兼容模式,config.compatibility().enabled();只是返回当前模式。

这是我必须更改代码以启用兼容模式的方法:

final EmbeddedCacheManager manager = new DefaultCacheManager();
final PersistenceConfigurationBuilder persistConfig = new ConfigurationBuilder().persistence();
final SingleFileStoreConfigurationBuilder fileStore = new SingleFileStoreConfigurationBuilder(persistConfig).location("cache");
final Configuration config = persistConfig.addStore(fileStore).compatibility().enable().build();
manager.defineConfiguration("records", config);

这是我在 JBoss 论坛上的问题:https://developer.jboss.org/thread/261123

【讨论】:

    猜你喜欢
    • 2021-03-27
    • 1970-01-01
    • 2017-01-06
    • 1970-01-01
    • 2018-11-29
    • 1970-01-01
    • 2018-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多