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

使用动态生成的类部署Hazelcast用户代码

周宸
2023-03-14

我有一个由hazelcast节点网格组成的应用程序,它使用了广泛的运行时字节码生成(asm)。具体地说,我正在根据用户输入的过滤器表达式动态构建谓词<>Java函数。我希望将谓词存储在一个映射中,这样它们就可以在整个集群中使用,而不必重新编译。谓词不是唯一的实例。我还有在运行时生成的ORM样式映射类,它们需要在整个集群中共享。这些类由名为DynamicLassLoader的自定义类加载器加载。

一开始,我无法在Hazelcast IMAP中存储自定义生成的类,得到一个ClassNotFoundException。但是,我发现如果告诉Hazelcast使用config.setClassLoader()使用我的自定义DynamicClassLoader,那么它就能够找到我的动态类并在本地成员中使用它们,这样我就不会在同一成员中的IMAP中序列化和反序列化我的自定义类的实例。

但是,我仍然无法反序列化由其他成员插入到映射中的谓词的实例。我启用了UserCodeDeployment并在html" target="_blank">调试器中逐级检查代码,以确认如果它在本地找不到类,那么它将点击UserCodeDeploymentClassLoader.java,并且在classNotFoundException上,它将继续检查类的其他成员,但它无法找到它们。我还没能发现这到底是怎么工作的。它似乎在一个内部映射中查找任何给定类都可以在其上找到的成员,但它在其中没有找到我的类。我相信它会向其他成员分配一个操作,然后查找类,但在本例中,它似乎没有使用我的自定义类加载器,所以它无法找到我的自定义类。

如何使动态生成的类与HazelCast上的UserCodeDeployment一起工作?有没有一种方法我可以‘注册’我的动态类与成员的代码服务或类似的东西?

谢谢你,特洛伊。

共有1个答案

淳于升
2023-03-14

经过大量的调试,我终于弄明白了这一点。原来,Hazelcast中对目标成员查找类的操作调用ClassDataProvider.java中的loadBytecodeFromParent()。这将使用类加载器上的GetResourceStream查找.class文件:

String resource = className.replace('.', '/').concat(".class");

...

is = parent.getResourceAsStream(resource);

它基本上在文件系统上查找类文件。因为我的动态类完全在内存中,所以没有.class文件资源可供它查找。

我解决了这个问题,方法是在DynamicClassLoader中放入一个hashmap来保留生成的字节码,并在进一步查看之前重写GetResourceStream以在可用时返回该字节码。现在起作用了!

 类似资料:
  • 问题内容: 我正在尝试在我的网站上生成QR码。他们要做的就是在其中包含一个URL,该URL将在我的网站上提供。最简单的方法是什么? 问题答案: 值得补充的是,除了@abaumg发布的QR码库外,Google还提供了一个 [QR Code API] QRCodes API非常感谢链接更新。 要使用this,基本上是: 是您要生成的QR图像的尺寸, 这是您要更改为QR码的url编码的字符串,并且 的是

  • 我想在使用hazelcast缓存的两节点tomcat集群上部署一个servlet。设置如下: null

  • 我正在尝试使用由Cassandra支持的MapStore。为此,使用ClientUserCodeDeploymentConfig将这些MapStore和MapLoader实现推送到Hazelcast成员,如下所示 我在初始化CassandRamapStoreFactory时看到以下问题。这似乎是Java9模块特性的问题,而我使用的是Java11。请指导我如何在客户机/服务器部署方法中使用Hazel

  • 本文向大家介绍PHP使用GIFEncoder类生成gif动态滚动字幕,包括了PHP使用GIFEncoder类生成gif动态滚动字幕的使用技巧和注意事项,需要的朋友参考一下 今天在公司,经理让做一个滚动字幕。但是,不许生成gif图片。所以上网找了GIFEncoder这个类库。确实很好用,但是,应用过程中也出现了一些问题,现在写在这里,以供后来人参考,少走弯路。 文字滚动分为两种情况。第一种为水平滚动

  • 我有一个WildFly集群,它应该将所有主题消息共享给不同的节点,并在一个节点离线时保存它们。< br >在这种情况下,我需要耐用的订阅服务器。 我注意到如果我使用相同的clientID,系统会进行负载平衡。如果我将clientID或认购名称更改为唯一值,它就可以工作。 那么什么时候使用唯一的clientID,什么时候使用subscriptionName 我的答案是,每个节点的唯一clientID

  • 问题内容: 我已阅读的有关该主题的大多数答案都指向System.Windows.Forms.WebBrowser类或Microsoft HTML对象库程序集的COM接口mshtml.HTMLDocument。 WebBrowser类没有带我到任何地方。以下代码无法检索由我的Web浏览器呈现的HTML代码: 以上仅是示例。我对寻找一种解决方法以找出我所在的城镇的名字并不感兴趣。我只需要了解如何以编程