将元数据添加到Java RMI

时间:2011-06-28 00:21:04

标签: java rmi

我正在尝试创建一个系统,在每次RMI调用时都会

1)收集一些有关当前本地系统状态的数据(假设系统时间)

2)将其序列化并透明地将其添加到通过调用通过线路发送的数据(即,不更改被调用的存根方法的签名)

3)在另一端反序列化并采取一些行动(假设将其记录到文件中)

4)当方法返回时,反向做同样的事情

我首先尝试用AspectJ做这个,在java.rmi.server.RemoteRef的invoke方法中添加一个切入点,允许我将元数据添加到params对象数组,但我现在发现了AspectJ无法建议已编译的代码,这很有意义。

那么,这样做的正确方法是什么?

2 个答案:

答案 0 :(得分:0)

您还可以在Jini 2项目中调查RMI / JERI。 JERI代表Java可扩展远程调用协议,即您可以通过多种方式对其进行自定义。

答案 1 :(得分:0)

好吧,我不确定我是否从你所说的内容中得到足够的上下文,但我认为你可以在传递给服务器和从服务器接收的对象的序列化/反序列化时编写元数据。

例如,假设您的服务器正在返回Jedi实例。而Jedi是一个Serializable类。然后,您可以使用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();
    }
}

唯一的问题是,您将被迫为与服务器交换的每个可序列化对象执行此操作。