我有两个Java Web服务,在同一台服务器上托管在Tomcat中。
有没有办法在它们之间共享内存(对象)?
我可以将共享转换为某种Web方法调用,但是
答案 0 :(得分:5)
不是我知道的。听起来像是充满了危险。在一个应用程序中同步对象很困难;你对两个人没有希望。这有什么用呢?
如果这是您需要的常用方法,请将它们放入可以调用的服务中。如果是常见数据,请将其放入数据库中。
答案 1 :(得分:2)
有没有办法在它们之间共享内存(对象)?
您可以创建由两个JVM共享的共享内存区域。您可以使用本机代码执行此操作,或者(理论上)将文件映射到两个应用程序的地址空间。
但是你不能把Java对象放在那个区域。 JVM不支持Java代码或本机代码。 (即使你可以,同步也是一个大问题。)
所以可以使用共享内存在两个JVM之间共享数据吗?
也许。但是您需要将共享内存段视为一种数据库,并实现一种在段和每个JVM堆之间复制对象状态的方案。而且您需要实现一个强大的同步方案,可能使用信号量。
简而言之,实现它将是一项重要的工作,并且它不会“感觉”像JVM共享对象一样。使用现有数据库或分布式缓存解决方案会更容易。
答案 2 :(得分:1)
答案 3 :(得分:0)
关于进程间通信,Java说:
促进流程,大多数操作系统之间的通信 支持进程间通信(IPC)资源,例如管道和 插座即可。 IPC不仅用于进程之间的通信 相同的系统,但不同系统的过程。
我宁愿去找管道或插座。这将使您的生活变得更轻松,您的Web服务更加灵活,因为它们可以在两台独立的机器上运行,但仍然可以相互交谈,就像它们并排设置一样。
据说这是回到实践中。比如说,您有一组要在服务之间共享的对象{a,b,c}
。创建一个包含{a,b,c}
个对象的数据存储类,每当有更新时,在数据存储dataStore.setA(A new_a)
中执行此操作。在场景后面,对于每次更新,本地数据存储将通知位于其他应用程序中的远程数据存储,并传输刚刚进行的所有更新。以下DTO可用于将所有更改从一个数据存储传输到另一个数据存储:
public class ObjectUpdateEvent<Source> implements Serializable {
private String fieldName;
private Object previousValue;
private Object newValue;
private Source source;
// Constructor...
}
更新对象“a”可以通过以下方式完成
public class DataStore{
// .....
public setA(A new_a){
ObjectUpdateEvent<DataStore> updateDto = new ObjectUpdateEvent<DataStore>();
updateDto.setPreviousValue(a);
updateDto.setNewValue(new_a);
sendUpdateDto();
a = new_a;
}
}
编辑:这正是@duffymo上面提到的。
答案 4 :(得分:0)
如何使用共享库。
您可以重构逻辑,将它们移动到单独的库中,并构建为单独的jar。
jar应放在tomcat_home / lib 目录中。 在您的网络应用中,库依赖关系应设置为提供(在maven中)
您存储创建并存储您需要在共享内存中共享的对象,并从任何Web访问它们