2017-08-23 134 views
0

我正在创建自定义谓词。它需要一个整数并将其与map的值进行比较。无法在Hazelcast中使用快速聚合时创建自定义谓词

public class LocationPredicate implements Predicate<Key, Portable> { 

    private int rssi; 

    public LocationPredicate() { 
    } 

    public LocationPredicate(int rssi) { 
     this.rssi = rssi; 
    } 

    @Override 
    public boolean apply(Entry<Key, Aortable> arg0) { 
     return false; 
     //int val = arg0.getValue().getData().getLocation().getRssiVal(); 
     //return (rssi == val) ; 
    } 

} 

当我运行程序时,我收到以下错误:

Exception in thread "main" com.hazelcast.nio.serialization.HazelcastSerializationException: java.lang.ClassNotFoundException: com.snmpapp.main.LocationPredicate 
    at com.hazelcast.internal.serialization.impl.JavaDefaultSerializers$JavaSerializer.read(JavaDefaultSerializers.java:224) 
    at com.hazelcast.internal.serialization.impl.StreamSerializerAdapter.read(StreamSerializerAdapter.java:48) 
    at com.hazelcast.internal.serialization.impl.AbstractSerializationService.toObject(AbstractSerializationService.java:184) 
    at com.hazelcast.client.impl.protocol.task.map.MapAggregateWithPredicateMessageTask.getPredicate(MapAggregateWithPredicateMessageTask.java:45) 
    at com.hazelcast.client.impl.protocol.task.map.AbstractMapQueryMessageTask.call(AbstractMapQueryMessageTask.java:87) 
    at com.hazelcast.client.impl.protocol.task.AbstractCallableMessageTask.processMessage(AbstractCallableMessageTask.java:35) 
    at com.hazelcast.client.impl.protocol.task.AbstractMessageTask.initializeAndProcessMessage(AbstractMessageTask.java:123) 
    at com.hazelcast.client.impl.protocol.task.AbstractMessageTask.run(AbstractMessageTask.java:103) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 
    at com.hazelcast.util.executor.HazelcastManagedThread.executeRun(HazelcastManagedThread.java:64) 
    at com.hazelcast.util.executor.HazelcastManagedThread.run(HazelcastManagedThread.java:80) 
    at ------ submitted from ------.(Unknown Source) 
    at com.hazelcast.client.spi.impl.ClientInvocationFuture.resolveAndThrowIfException(ClientInvocationFuture.java:95) 
    at com.hazelcast.client.spi.impl.ClientInvocationFuture.resolveAndThrowIfException(ClientInvocationFuture.java:32) 
    at com.hazelcast.spi.impl.AbstractInvocationFuture.get(AbstractInvocationFuture.java:155) 
    at com.hazelcast.client.spi.ClientProxy.invoke(ClientProxy.java:172) 
    at com.hazelcast.client.proxy.ClientMapProxy.aggregate(ClientMapProxy.java:1356) 
    at com.snmpapp.main.Main.main(Main.java:370) 
Caused by: java.lang.ClassNotFoundException: com.aruba.acp.snmpapp.main.LocationPredicate 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
    at com.hazelcast.nio.ClassLoaderUtil.tryLoadClass(ClassLoaderUtil.java:149) 
    at com.hazelcast.nio.ClassLoaderUtil.loadClass(ClassLoaderUtil.java:123) 
    at com.hazelcast.nio.IOUtil$ClassLoaderAwareObjectInputStream.resolveClass(IOUtil.java:522) 
    at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1613) 
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1518) 
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1774) 
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351) 
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371) 
    at com.hazelcast.internal.serialization.impl.JavaDefaultSerializers$JavaSerializer.read(JavaDefaultSerializers.java:219) 
    at com.hazelcast.internal.serialization.impl.StreamSerializerAdapter.read(StreamSerializerAdapter.java:48) 
    at com.hazelcast.internal.serialization.impl.AbstractSerializationService.toObject(AbstractSerializationService.java:184) 
    at com.hazelcast.client.impl.protocol.task.map.MapAggregateWithPredicateMessageTask.getPredicate(MapAggregateWithPredicateMessageTask.java:45) 
    at com.hazelcast.client.impl.protocol.task.map.AbstractMapQueryMessageTask.call(AbstractMapQueryMessageTask.java:87) 
    at com.hazelcast.client.impl.protocol.task.AbstractCallableMessageTask.processMessage(AbstractCallableMessageTask.java:35) 
    at com.hazelcast.client.impl.protocol.task.AbstractMessageTask.initializeAndProcessMessage(AbstractMessageTask.java:123) 
    at com.hazelcast.client.impl.protocol.task.AbstractMessageTask.run(AbstractMessageTask.java:103) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 
    at com.hazelcast.util.executor.HazelcastManagedThread.executeRun(HazelcastManagedThread.java:64) 
    at com.hazelcast.util.executor.HazelcastManagedThread.run(HazelcastManagedThread.java:80) 

我有点困惑。我需要在服务器上创建谓词吗?我作为Hcast客户端运行,客户端正在创建谓词。

据我所知,当你创建谓词时,它会作为序列化对象发送到hazelcast服务器。

此外,我试图实现Predicate作为可序列化,但它没有帮助。 谢谢

+0

澄清支持文本,包括将其移出代码示例。 – Turophile

+0

支持评论的整齐语言 – Turophile

回答

1

我没有Hazelcast的经验,但据我所知,在序列化和反序列化过程中,您可以传递状态(在本例中为成员变量),但不是行为(您实际的应用方法的实现)。不知何故(我对这项技术没有经验),你应该把你的课程提供给Hazelcast的类加载器(也许复制到classpath)。祝你好运!

+0

这是正确的,该类需要在Hazelcast节点类路径上。也就是说,只需部署这些类。使用Hazelcast 3.8,你也可以使用lite成员作为类源(参见文档),但现在我建议在类路径中获得该类。 – noctarius

+0

这是新鲜事。我会尝试课堂来源。 谢谢:) – anirudhas

0

该类需要位于所有节点的类路径上。

+0

非常感谢汤姆。我在服务器端创建了一个类。所有集群节点都需要了解该类。 – anirudhas