【发布时间】:2011-03-15 18:10:58
【问题描述】:
我有 2 个独立的 Java 应用程序同时运行。 (两个单独的 javaw.exe) 我需要在它们运行时在它们之间共享一个对象。
在没有任何永久存储的情况下实现此目的的最简单方法是什么?
【问题讨论】:
标签: java object-sharing
我有 2 个独立的 Java 应用程序同时运行。 (两个单独的 javaw.exe) 我需要在它们运行时在它们之间共享一个对象。
在没有任何永久存储的情况下实现此目的的最简单方法是什么?
【问题讨论】:
标签: java object-sharing
对象及其实例变量可以在 Java 程序中的线程之间共享,这是非常简单的任务。
如果您需要在两个程序之间共享对象(它的实例),没有数据存储,下一个选择是使用RMI Socket Communication 或 Java 消息服务。
【讨论】:
你可以使用 TCP
示例:http://www.java-samples.com/showtutorial.php?tutorialid=1167
【讨论】:
我认为Hazelcast 适用于这种情况。它实际上不需要任何设置(除了您需要将依赖项添加到 Hazelcast jar 之外)。以下代码示例展示了如何设置共享Map。
// Code in process 1
Config cfg = new Config();
HazelcastInstance instance = Hazelcast.newHazelcastInstance(cfg);
Map<Integer, String> sharedData = instance.getMap("shared");
sharedData.put(1, "This is shared data");
// Code in process 2
Config cfg = new Config();
HazelcastInstance instance = Hazelcast.newHazelcastInstance(cfg);
Map<Integer, String> sharedData = instance.getMap("shared");
String theSharedString = sharedData.get(1);
Hazelcast 支持各种共享数据结构,包括 Map、Queue、List、AtomicLong、IdGenerator 等。The documentation is good 并且根据我的经验,实现是可靠的。
【讨论】:
您必须决定是喜欢共享和更新状态,还是只发送一次性消息对象。
在第一种情况下,您必须共享对某个对象的“远程引用”。 RMI 是个好方法。
在第二种情况下,您只需要序列化您要共享的对象并发送即可。您可以将其序列化(转换为字节)通过套接字作为Ankit said 发送,甚至可以使用:
RMI :) 发送方连接到注册了 RMI 的接收方,调用一个以消息对象为参数的方法,然后忘记了 RMI 对象
Java 消息服务 (JMS),可能有点矫枉过正......
其他一些有创意但简单的东西......
【讨论】:
如果您不能永久存储该对象,则需要以某种方式转移它。这可以通过网络或某种共享内存来完成。
对于第一种(网络)方法,使用序列化(java.io.Serializable)并通过套接字传输对象。这将需要编写套接字侦听器。
第二种方法需要使用和配置第三方库(例如EHCache)。
【讨论】:
也许是Oracle Coherence?这就像跨应用程序共享的内存映射。
【讨论】: