Добавление метаданных в Java RMI - PullRequest
1 голос
/ 28 июня 2011

Я пытаюсь создать систему, которая при каждом вызове RMI

1) собирает некоторые данные о текущем состоянии локальной системы (скажем, системное время)

2) сериализовать его и прозрачно добавить к данным, передаваемым по проводам с вызовом (т. е. без изменения сигнатуры вызываемого метода-заглушки)

3) десериализовать его на другой стороне и предпринять некоторые действияскажем, записав его в файл)

4) сделать то же самое в обратном порядке, когда метод возвращает

Сначала я пытался сделать это с AspectJ, добавив pointcut в javaМетод вызова .rmi.server.RemoteRef, который позволил бы мне добавить метаданные в массив объекта params, но теперь я обнаружил, что AspectJ не может посоветовать уже скомпилированный код, что имеет большой смысл.

Итак, как правильно это сделать?

Ответы [ 2 ]

0 голосов
/ 29 июня 2011

Ну, я не уверен, что получаю достаточно контекста из того, что вы говорите, но я думаю, что вы могли бы написать метаданные после сериализации / десериализации объектов, переданных и полученных от сервера.

Например, допустим, ваш сервер возвращает экземпляры джедаев. И джедай - это Сериализуемый класс. Затем вы можете использовать методы writeObject () и readObject () (как описано в спецификации сериализации Java) для записи любой специальной дополнительной информации, которая может вам понадобиться на стороне клиент / сервер.

Например:

public class Jedi {
  ....
        private void writeObject(ObjectOutputStream stream) throws IOException {
        stream.writeObject(new Date());
        stream.defaultWriteObject();
    }

    private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException {
        Date sysDate = (Date) stream.readObject();
        System.out.println(sysDate);
        stream.defaultReadObject();
    }
}

Единственная проблема в том, что вы будете вынуждены делать это для каждого сериализуемого объекта, который вы обмениваетесь с вашим сервером.

0 голосов
/ 28 июня 2011

Вы также можете исследовать RMI / JERI в проекте Jini 2. JERI расшифровывается как протокол Java Extensible Remote Invocation, то есть вы можете настроить его множеством способов.

...