我正在尝试创建一个系统,在每次RMI调用时都会
1)收集一些有关当前本地系统状态的数据(假设系统时间)
2)将其序列化并透明地将其添加到通过调用通过线路发送的数据(即,不更改被调用的存根方法的签名)
3)在另一端反序列化并采取一些行动(假设将其记录到文件中)
4)当方法返回时,反向做同样的事情
我首先尝试用AspectJ做这个,在java.rmi.server.RemoteRef的invoke方法中添加一个切入点,允许我将元数据添加到params对象数组,但我现在发现了AspectJ无法建议已编译的代码,这很有意义。
那么,这样做的正确方法是什么?
答案 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();
}
}
唯一的问题是,您将被迫为与服务器交换的每个可序列化对象执行此操作。