Java 如何使用Redis适配器写入Geode,然后使用Geode客户端读取/响应事件?

Java 如何使用Redis适配器写入Geode,然后使用Geode客户端读取/响应事件?,java,redis,gemfire,apache-kafka-connect,geode,Java,Redis,Gemfire,Apache Kafka Connect,Geode,我正在努力做到以下几点: region.get(Coder.stringToByteArrayWrapper("key")); org.apache.geode.cache.client.ServerOperationException: remote server on My-Computer(4352:loner):64103:58d54999: While performing a remote get at org.apache.geode.cache.client.inter

我正在努力做到以下几点:

region.get(Coder.stringToByteArrayWrapper("key"));
org.apache.geode.cache.client.ServerOperationException: remote server on My-Computer(4352:loner):64103:58d54999: While performing a remote get
    at org.apache.geode.cache.client.internal.AbstractOp.processObjResponse(AbstractOp.java:285)
    at org.apache.geode.cache.client.internal.GetOp$GetOpImpl.processResponse(GetOp.java:143)
    at org.apache.geode.cache.client.internal.AbstractOp.attemptReadResponse(AbstractOp.java:171)
    at org.apache.geode.cache.client.internal.AbstractOp.attempt(AbstractOp.java:382)
    at org.apache.geode.cache.client.internal.ConnectionImpl.execute(ConnectionImpl.java:275)
    at org.apache.geode.cache.client.internal.pooling.PooledConnection.execute(PooledConnection.java:332)
    at org.apache.geode.cache.client.internal.OpExecutorImpl.executeWithPossibleReAuthentication(OpExecutorImpl.java:900)
    at org.apache.geode.cache.client.internal.OpExecutorImpl.execute(OpExecutorImpl.java:158)
    at org.apache.geode.cache.client.internal.OpExecutorImpl.execute(OpExecutorImpl.java:115)
    at org.apache.geode.cache.client.internal.PoolImpl.execute(PoolImpl.java:763)
    at org.apache.geode.cache.client.internal.GetOp.execute(GetOp.java:91)
    at org.apache.geode.cache.client.internal.ServerRegionProxy.get(ServerRegionProxy.java:116)
    at org.apache.geode.internal.cache.LocalRegion.findObjectInSystem(LocalRegion.java:2776)
    at org.apache.geode.internal.cache.LocalRegion.nonTxnFindObject(LocalRegion.java:1488)
    at org.apache.geode.internal.cache.LocalRegionDataView.findObject(LocalRegionDataView.java:175)
    at org.apache.geode.internal.cache.LocalRegion.get(LocalRegion.java:1377)
    at org.apache.geode.internal.cache.LocalRegion.get(LocalRegion.java:1310)
    at org.apache.geode.internal.cache.LocalRegion.get(LocalRegion.java:1295)
    at org.apache.geode.internal.cache.AbstractRegion.get(AbstractRegion.java:320)
    at trial.GeodeTest.test_subscribe(GeodeTest.java:112)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Caused by: org.apache.geode.cache.RegionDestroyedException: Server connection from [identity(192.168.64.106(4352:loner):64103:58d54999,connection=1; port=64103]: Region named /ReDiS_StRiNgS/ReDiS_StRiNgS was not found during get request
    at org.apache.geode.internal.cache.tier.sockets.BaseCommand.writeRegionDestroyedEx(BaseCommand.java:615)
    at org.apache.geode.internal.cache.tier.sockets.command.Get70.cmdExecute(Get70.java:126)
    at org.apache.geode.internal.cache.tier.sockets.BaseCommand.execute(BaseCommand.java:165)
    at org.apache.geode.internal.cache.tier.sockets.ServerConnection.doNormalMsg(ServerConnection.java:780)
    at org.apache.geode.internal.cache.tier.sockets.ServerConnection.doOneMessage(ServerConnection.java:911)
    at org.apache.geode.internal.cache.tier.sockets.ServerConnection.run(ServerConnection.java:1166)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at org.apache.geode.internal.cache.tier.sockets.AcceptorImpl$1$1.run(AcceptorImpl.java:523)
    at java.lang.Thread.run(Thread.java:745)
  • 使用redis连接器将一些数据放入geode
  • 使用
    CacheListener
  • 使用Geode客户端及其在区域上的
    entrySet
    方法读取该数据
  • 我从Geode客户端访问redis数据时遇到了问题。我必须做到以下几点:

    region.get(Coder.stringToByteArrayWrapper("key"));
    
    org.apache.geode.cache.client.ServerOperationException: remote server on My-Computer(4352:loner):64103:58d54999: While performing a remote get
        at org.apache.geode.cache.client.internal.AbstractOp.processObjResponse(AbstractOp.java:285)
        at org.apache.geode.cache.client.internal.GetOp$GetOpImpl.processResponse(GetOp.java:143)
        at org.apache.geode.cache.client.internal.AbstractOp.attemptReadResponse(AbstractOp.java:171)
        at org.apache.geode.cache.client.internal.AbstractOp.attempt(AbstractOp.java:382)
        at org.apache.geode.cache.client.internal.ConnectionImpl.execute(ConnectionImpl.java:275)
        at org.apache.geode.cache.client.internal.pooling.PooledConnection.execute(PooledConnection.java:332)
        at org.apache.geode.cache.client.internal.OpExecutorImpl.executeWithPossibleReAuthentication(OpExecutorImpl.java:900)
        at org.apache.geode.cache.client.internal.OpExecutorImpl.execute(OpExecutorImpl.java:158)
        at org.apache.geode.cache.client.internal.OpExecutorImpl.execute(OpExecutorImpl.java:115)
        at org.apache.geode.cache.client.internal.PoolImpl.execute(PoolImpl.java:763)
        at org.apache.geode.cache.client.internal.GetOp.execute(GetOp.java:91)
        at org.apache.geode.cache.client.internal.ServerRegionProxy.get(ServerRegionProxy.java:116)
        at org.apache.geode.internal.cache.LocalRegion.findObjectInSystem(LocalRegion.java:2776)
        at org.apache.geode.internal.cache.LocalRegion.nonTxnFindObject(LocalRegion.java:1488)
        at org.apache.geode.internal.cache.LocalRegionDataView.findObject(LocalRegionDataView.java:175)
        at org.apache.geode.internal.cache.LocalRegion.get(LocalRegion.java:1377)
        at org.apache.geode.internal.cache.LocalRegion.get(LocalRegion.java:1310)
        at org.apache.geode.internal.cache.LocalRegion.get(LocalRegion.java:1295)
        at org.apache.geode.internal.cache.AbstractRegion.get(AbstractRegion.java:320)
        at trial.GeodeTest.test_subscribe(GeodeTest.java:112)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
        at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
        at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
        at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
        at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
        at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
        at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
        at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
        at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
        at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
        at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
        at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
        at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
        at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
        at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
    Caused by: org.apache.geode.cache.RegionDestroyedException: Server connection from [identity(192.168.64.106(4352:loner):64103:58d54999,connection=1; port=64103]: Region named /ReDiS_StRiNgS/ReDiS_StRiNgS was not found during get request
        at org.apache.geode.internal.cache.tier.sockets.BaseCommand.writeRegionDestroyedEx(BaseCommand.java:615)
        at org.apache.geode.internal.cache.tier.sockets.command.Get70.cmdExecute(Get70.java:126)
        at org.apache.geode.internal.cache.tier.sockets.BaseCommand.execute(BaseCommand.java:165)
        at org.apache.geode.internal.cache.tier.sockets.ServerConnection.doNormalMsg(ServerConnection.java:780)
        at org.apache.geode.internal.cache.tier.sockets.ServerConnection.doOneMessage(ServerConnection.java:911)
        at org.apache.geode.internal.cache.tier.sockets.ServerConnection.run(ServerConnection.java:1166)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at org.apache.geode.internal.cache.tier.sockets.AcceptorImpl$1$1.run(AcceptorImpl.java:523)
        at java.lang.Thread.run(Thread.java:745)
    
    我在使
    region.entrySet()正常工作时也遇到了很多麻烦。首先,它根本不适用于
    ClientRegionShortcut.PROXY
    ,而且似乎只有50%的时间适用于
    ClientRegionShortcut.CACHING\u PROXY

    下面是我用来测试这一点的代码(请注意,我是作为redis客户端使用的):

    @测试
    public void test_subscribe()引发InterruptedException、ExecutionException{
    ClientCache缓存=新建ClientCacheFactory()
    .addPoolLocator(主机、定位器\端口)
    .create();
    @SuppressWarnings({“rawtypes”,“unchecked”})
    CacheListener cl=新的CacheListenerAdapter(){
    @凌驾
    创建后公共无效(EntryEvent事件){
    System.out.println(“创建:”+event.getKey()+“=”+event.getNewValue());
    }
    @凌驾
    更新后公共无效(EntryEvent事件){
    System.out.println(“更新:“+event.getKey()+”将“+event.getOldValue()+”替换为“+event.getNewValue()”);
    }
    };
    区域=缓存
    .createClientRegionFactory(ClientRegionShortcut.CACHING_代理)
    .addCacheListener(cl)
    .setKeyConstraint(ByteArrayWrapper.class)
    .setValueConstraint(ByteArrayWrapper.class)
    .create(GeodeRedisServer.STRING_区域);
    RedisClient=RedisClient.create(“redis://”+HOST);
    StatefulRedisConnection=client.connect();
    RedisAsyncCommands cmd=connection.async();
    cmd.set(“1”,“HelloGeodeRedis”).get();
    cmd.set(“2”,“WorldGeodeRedis”+System.currentTimeMillis()).get();
    System.out.println(“FromRedis:+cmd.get(“2”).get());
    System.out.println(“FromGeode:+region.get(Coder.stringToByteArrayRapper(“2”)));
    对于(Map.Entry:region.entrySet()){
    System.out.format(“key=%s,value=%s\n”,entry.getKey(),entry.getValue());
    }
    cache.close();
    }
    
    我想知道这50%是否与我运行的服务器有关:

    gfsh>describe region --name=ReDiS_StRiNgS
    ..........................................................
    Name            : ReDiS_StRiNgS
    Data Policy     : persistent partition
    Hosting Members : my-redis
    
    Non-Default Attributes Shared By Hosting Members
    
     Type  |    Name     | Value
    ------ | ----------- | --------------------
    Region | size        | 2
           | data-policy | PERSISTENT_PARTITION
    
    gfsh>describe region --name my-region
    ..........................................................
    Name            : my-region
    Data Policy     : persistent replicate
    Hosting Members : my-server
                      my-redis
    
    Non-Default Attributes Shared By Hosting Members
    
     Type  |    Name     | Value
    ------ | ----------- | --------------------
    Region | data-policy | PERSISTENT_REPLICATE
           | size        | 2
           | scope       | distributed-ack
    
    gfsh>list members
          Name       | Id
    ---------------- | -----------------------------------------------------------
    my-locator | 172.16.202.245(my-locator:21234:locator)<ec><v0>:1024
    my-server  | 172.16.202.245(my-server:22154)<v1>:1025
    my-redis   | 172.16.202.245(my-redis:24890)<v2>:1026
    
    所以你有完整的免责声明,我测试这个的原因是我想把卡夫卡主题中的数据放到geode中,以避免自己编写geode卡夫卡连接器


    编辑:由于@Swapnil,50%的问题已得到解决,但现在我在
    入口集
    和事件通知工作方面又遇到了问题。看来,除非我使用redis客户端强制获取我输入的密钥,否则我不会收到任何
    EntryEvent
    通知。

    我怀疑这是您启动Geode服务器的方式。我这样设置Geode群集时没有遇到任何问题:

    gfsh>start locator --name=loc1  
    gfsh>start server --name=serv1 --redis-port=1111 --redis-bind-address=localhost  
    gfsh>start server --name=serv2 --server-port=40405 --redis-port=2222 --redis-bind-address=localhost
    
    Descripte regions向我展示了在两台服务器上都创建了RedisString:

    gfsh>describe region --name=/ReDiS_StRiNgS .......................................................... Name : ReDiS_StRiNgS Data Policy : partition Hosting Members : serv2 serv1 Non-Default Attributes Shared By Hosting Members Type | Name | Value ------ | ----------- | --------- Region | size | 0 | data-policy | PARTITION gfsh>descripe region--name=/ReDiS\u字符串 .......................................................... 名称:ReDiS_字符串 数据策略:分区 托管成员:serv2 服务1 托管成员共享的非默认属性 类型|名称|值 ------ | ----------- | --------- 区域|大小| 0 |数据策略|分区 然后从我的测试程序中,我通过Redis(绝地客户端)插入数据,然后成功地从Geode读取数据:

    public void putRedis() {
      Jedis jedis = new Jedis("localhost", 1111);
      for (int i=0; i<10; i++) {
        jedis.set("foo"+i, "bar"+i);
      }  
    }  
    
    public void readGeode() {
      ClientCacheFactory clientCacheFactory = new ClientCacheFactory();
      clientCacheFactory.addPoolLocator("localhost", 10334);
      ClientCache client = clientCacheFactory.create();
      Region redisStrings = client.createClientRegionFactory(ClientRegionShortcut.PROXY).create("ReDiS_StRiNgS");  
      for (int i=0; i<10; i++) {
        System.out.println(redisStrings.get(Coder.stringToByteArrayWrapper("foo"+i)));
      }
    }
    
    public void putRedis(){
    绝地武士=新绝地武士(“本地主机”,1111);
    
    对于(inti=0;i,我没有收到事件的问题是因为我没有注册我感兴趣的键

    添加
    region.registerInterestRegex(“.”)
    允许标记每个键的兴趣。它需要使用
    设置
    ClientCache
    。setPoolSubscriptionEnabled(true)

    ClientCache cache=new ClientCacheFactory()
    .addPoolLocator(主机、定位器\端口)
    .setPoolSubscriptionEnabled(真)
    .create();
    // ...
    区域=缓存
    .createClientRegionFactory(ClientRegionShortcut.CACHING_代理)
    .addCacheListener(cl)
    .setKeyConstraint(ByteArrayWrapper.class)
    .setValueConstraint(ByteArrayWrapper.class)
    .create(GeodeRedisServer.STRING_区域);
    registerInterestRegex(“.”);
    // ...
    
    谢谢,这确实与此有关。我停止了另一台服务器,没有出现更多错误。我想这意味着每台服务器都有一个redis适配器。50%的问题似乎已经解决,但现在我面临另一个问题:除非我使用geode客户端强制获取我输入的密钥,否则我不会收到任何事件通知,也不会在我的服务器中获得任何数据
    entrySet
    。我有