当前位置: 首页 > 知识库问答 >
问题:

在不启用p2p类加载的情况下使apache ignite连续查询工作

林波鸿
2023-03-14

我一直试图让我的ignite连续查询代码在不将对等类加载设置为Enabled的情况下工作。但是,我发现代码不起作用。我试着调试,发现对cache.query(qry)的调用出错,并出现消息“failed to marshal custom event”错误。当我启用对等类加载时,代码按预期工作。有没有人可以提供指导,说明我如何在不加载对等类的情况下工作?下面是调用连续查询的代码段。

   public  void subscribeEvent(IgniteCache<String,String> cache,String inKeyStr,ServerWebSocket websocket ){
    System.out.println("in thread "+Thread.currentThread().getId()+"-->"+"subscribe event");
     //ArrayList<String> inKeys = new ArrayList<String>(Arrays.asList(inKeyStr.split(",")));

     ContinuousQuery<String, String> qry = new ContinuousQuery<>();

    /****
     * Continuous Query Impl
     */

    inKeys = ","+inKeyStr+",";
    qry.setInitialQuery(new ScanQuery<String, String>((k, v) -> inKeys.contains(","+k+",")));
    qry.setTimeInterval(1000);
    qry.setPageSize(1);

    // Callback that is called locally when update notifications are received.
  //  Factory<CacheEntryEventFilter<String, String>> rmtFilterFactory = new com.ccx.ignite.cqfilter.FilterFactory().init(inKeyStr);      

    qry.setLocalListener(new CacheEntryUpdatedListener<String, String>() {

          @Override public void onUpdated(Iterable<CacheEntryEvent<? extends String, ? extends String>> evts) {
            for (CacheEntryEvent<? extends String, ? extends String> e : evts)
            {

                          System.out.println("websocket locallsnr data in thread "+Thread.currentThread().getId()+"-->"+"key=" + e.getKey() + ", val=" + e.getValue());
                          try{
                          websocket.writeTextMessage("key=" + e.getKey() + ", val=" + e.getValue());
                          }
                          catch (Exception e1){
                              System.out.println("exception local listener "+e1.getMessage());
                              qry.setLocalListener(null) ;                }

            }

          }
        } );

   qry.setRemoteFilterFactory( new com.ccx.ignite.cqfilter.FilterFactory().init(inKeys));

    try{        

          cur = cache.query(qry);
          for (Cache.Entry<String, String> e : cur)
         { 
           System.out.println("websocket initialqry data in thread "+Thread.currentThread().getId()+"-->"+"key=" + e.getKey() + ", val=" + e.getValue());
           websocket.writeTextMessage("key=" + e.getKey() + ", val=" + e.getValue());
         }
    }
    catch (Exception e){
          System.out.println("exception cache.query "+e.getMessage());

          }        
    }

下面是远程筛选器类,我已经将它制作成一个自包含的jar并推送到ignite的libs文件夹中,这样服务器节点就可以获取它

public class FilterFactory
{

public Factory<CacheEntryEventFilter<String, String>> init(String inKeyStr ){
System.out.println("factory init called jun22 ");

return new Factory <CacheEntryEventFilter<String, String>>() {
    private static final long serialVersionUID = 5906783589263492617L;

        @Override public CacheEntryEventFilter<String, String> create() {
            return new CacheEntryEventFilter<String, String>() {
                @Override  public boolean evaluate(CacheEntryEvent<? extends String, ? extends String> e) {
                    //List inKeys = new ArrayList<String>(Arrays.asList(inKeyStr.split(",")));
                    System.out.println("inside remote filter factory ");
                    String inKeys = ","+inKeyStr+",";

                    return inKeys.contains(","+e.getKey()+",");
                }
            };
        }
    };
}
}

共有1个答案

宰父熙云
2023-03-14

您需要在拓扑中的所有节点上显式部署CQ类(特别是远程筛选器)。只需使用它们创建一个JAR文件,并在启动节点之前将其放入libs文件夹。

 类似资料:
  • 我有HTML+CSS页面,其中有两个按钮: 我想让“顶级评论”默认可见。所以在本页的最后,我将简单的JavaScript 自动点击“顶部评论”按钮。 在我的开发环境中,一切都运行良好。但当将代码上传到启用CloudFlare的生产服务器时。JavaScript click()函数不起作用。 我已经为这个问题给CloudFlare的支持写了信,但两天后仍然没有任何回应。 对于我如何调试为什么这个Ja

  • 我有一个具有两个属性的dynamoDB表: A: 主分区键 B: 主排序键 我想使用属性B查询这个表,因为我不知道A的值。可以这样做吗? 是否可以将B设为GSI(全局二级索引),如何使用B查询表,因为B已经是排序键。

  • (是的,这是hacky,可能不是最佳实践,但它是体积最小的解决方案) 我有一个涉及几个jar的项目——一个可运行的启动器、一个服务器、一个服务器的包装器和服务器的插件。 启动器通过启动一个新的未连接的进程、一个子进程或者只是实例化它来运行包装器,这取决于配置。对于这个问题来说,这应该不重要。 包装器使用URLClassLoader来加载服务器jar并启动它,这工作正常。 在启动服务器之前,包装器会

  • 例如,JPA标准API可以在没有生成元模型的情况下使用。失去了类型安全性,但我可以在运行时仅使用反射来创建查询,而无需事先了解数据模型。我想以同样的方式使用Querydsl。我不关心类型安全问题,因为我不知道数据模型。 在我最近的项目中,我想使用Querydsl,主要是因为它构成了持久性之上的另一层。所以我希望可以在JPA、JDO、JDBC、Lucene、Hibernate Search、Mong

  • 远程类加载是指加载未在执行位置显示的类。 例如,JavaApplet需要将类从服务器加载到本地并在本地执行。 一些包含URLClassLoader的程序需要从网络加载类,并在本地执行。 RMI怎么样?我找到了一个名为RMIClassLoader的类?是远程类加载吗?

  • 问题内容: 我有一个2的幂的整数输入(1、2、4、8等)。我希望函数不使用log()返回位位置。例如,对于上述输入,对于C#,将分别返回{0,1,2,3}。另外,如果可以在SQL中完成。 谢谢! 问题答案: 我发现执行此操作最快的代码来自Bit Twiddling Hacks网站。具体而言,基于DeBruijn序列的查找。参见http://graphics.stanford.edu/~seande