0

我第一次尝试 gridgain 并面临一些序列化问题。在尝试使用 GridClosure 在不同节点上投影作业时,我得到了 marshaling exception 。在调试时,似乎失败总是针对 Apache log4j Logger 对象。我很难避免使用记录器,并且想了解这是否是一个已知问题,或者我可以通过某种方式解决这个问题。我的网格配置的 requireSerializable 设置为 false。

Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at org.gridgain.grid.marshaller.optimized.GridOptimizedObjectOutputStream.writeSerializable(GridOptimizedObjectOutputStream.java:292)
    ... 45 more
Caused by: java.io.IOException: java.lang.reflect.InvocationTargetException
    at org.gridgain.grid.marshaller.optimized.GridOptimizedObjectOutputStream.writeSerializable(GridOptimizedObjectOutputStream.java:295)
    at org.gridgain.grid.marshaller.optimized.GridOptimizedClassDescriptor.write(GridOptimizedClassDescriptor.java:849)
    at org.gridgain.grid.marshaller.optimized.GridOptimizedObjectOutputStream.writeObject0(GridOptimizedObjectOutputStream.java:198)
    at org.gridgain.grid.marshaller.optimized.GridOptimizedObjectOutputStream.writeObjectOverride(GridOptimizedObjectOutputStream.java:129)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:342)
    at java.util.Hashtable.writeObject(Hashtable.java:988)
    ... 50 more
Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at org.gridgain.grid.marshaller.optimized.GridOptimizedObjectOutputStream.writeSerializable(GridOptimizedObjectOutputStream.java:292)
    ... 55 more
Caused by: java.lang.NullPointerException
    at org.gridgain.grid.marshaller.optimized.GridOptimizedObjectOutputStream$PutFieldImpl.value(GridOptimizedObjectOutputStream.java:1003)
    at org.gridgain.grid.marshaller.optimized.GridOptimizedObjectOutputStream$PutFieldImpl.put(GridOptimizedObjectOutputStream.java:965)
    at java.util.Vector.writeObject(Vector.java:1068)
    ... 60 more
4

1 回答 1

0

您可以将 Log4J 对象设为静态,这样它就不会影响序列化吗?如果没有,GridGain 允许您将记录器资源注入几乎任何东西,包括闭包。您可以在 GridConfiguration 中将 GridLogger 配置为 GridLog4jLogger。

这是一个例子:

GridRunnable run = new GridRunnable() {
    // Can be any logger, including GridLog4jLogger.
    @GridLoggerResource
    GridLogger log;

    @Override public void run() {
        log.info("Hello");

        // Do some logic.
    }
}

或者

// Can be any logger, including GridLog4jLogger
final GridLogger log = grid.log();

GridRunnable run = new GridRunnable() {
    @Override public void run() {
        log.info("Hello");

        // Do some logic.
    }
}

有关更多信息,请参阅 GridGain 文档中的资源注入页面。

于 2014-06-04T00:36:48.590 回答