Исключение сериализации Gridgain

Я впервые пробую gridgain и сталкиваюсь с некоторыми проблемами с сериализацией. При попытке использовать GridClosure для проецирования заданий на разных узлах я получаю исключение маршалинга. При отладке кажется, что сбой всегда происходит для объекта 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

person GDS    schedule 03.06.2014    source источник


Ответы (1)


Можете ли вы сделать объект Log4J статическим, чтобы он не влиял на сериализацию? Если нет, GridGain позволяет внедрить ресурс регистратора практически во что угодно, включая замыкания. Вы можете настроить GridLogger как GridLog4jLogger в GridConfiguration.

Вот пример:

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

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

        // Do some logic.
    }
}

or

// 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.
    }
}

Для получения дополнительной информации см. страницу Resource Injection в документации GridGain.

person Dmitriy    schedule 04.06.2014
comment
Спасибо Дмитрий. Я пытаюсь улучшить текущий проект с помощью распределения усиления сетки. Большинство классов в текущем проекте имеют статические регистраторы, но есть и нестатические (устаревшие) регистраторы. Когда я пытаюсь вызвать подпрограммы в этих классах из Grid Closure, я получаю эти исключения. У меня может не быть свободы изменить их все. - person GDS; 04.06.2014
comment
@GDS Обычно GridGain нормально сериализует несериализуемые классы, но в случае log4j требуется некоторая инициализация. Вы также можете рассмотреть возможность объявления регистраторов временными полями и их ленивой инициализации на удаленных узлах. Возможно, если вы разместите свой код, я мог бы быть больше помощи. - person Dmitriy; 04.06.2014
comment
сложно опубликовать весь код, и я не могу воспроизвести на меньшем примере. Тем не менее, мне удалось обойти проблему и использовать только статические регистраторы, и это работает фантастически. Спасибо. - person GDS; 04.06.2014