8

我一次运行 2 个单独的 Java 应用程序。(两个单独的 javaw.exe) 我需要在它们运行时在它们之间共享一个对象。

在没有任何永久存储的情况下实现这一目标的最简单方法是什么?

4

6 回答 6

8

对象及其实例变量可以在 Java 程序中的线程之间共享,这是非常简单的任务。
如果您需要在两个程序之间共享对象(它的实例),而没有数据存储,那么下一个选择是使用RMI 套接字通信或 Java 消息传递服务。

于 2010-07-14T09:35:38.977 回答
4

你可以使用 TCP

  1. 使用本地软件端口,例如 localhost:999。
  2. 使一个应用程序作为服务器(侦听此端口)和另一个作为客户端(将连接到 localhost:999 的服务器,但将使用不同的端口供自己使用)。
  3. 客户端将序列化您的对象以进行流式传输。
  4. 服务器确实反序列化!

示例:http ://www.java-samples.com/showtutorial.php?tutorialid=1167

于 2010-07-14T09:22:43.060 回答
4

我认为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 支持各种共享数据结构,包括, , ,MapQueueList文档很好根据我的经验,实现是可靠的。AtomicLongIdGenerator

于 2015-01-01T23:23:04.300 回答
3

您必须决定是否更喜欢共享和更新状态,或者只是发送一次性消息对象。

在第一种情况下,您必须共享某个对象的“远程引用”。RMI是一个很好的方法。

在第二种情况下,您只需要将要共享的对象序列化并发送即可。正如Ankit 所说,您可以通过套接字将其序列化(转换为字节)发送,甚至可以使用:

  • RMI :) 发送者连接到一个 RMI 注册的接收者,调用一个以消息对象作为参数的方法,然后忘记了 RMI 对象

  • Java 消息服务 (JMS),可能有点矫枉过正......

  • 其他一些有创意但简单的事情......

于 2010-07-14T09:48:19.253 回答
2

如果您不能永久存储该对象,则需要以某种方式转移它。这可以通过网络或某种共享内存来完成。

对于第一种(网络)方法,使用序列化(java.io.Serializable)并通过套接字传输对象。这将需要编写套接字侦听器。

第二种方法需要使用和配置第三方库(例如EHCache)。

于 2010-07-14T09:23:38.720 回答
0

也许是甲骨文连贯性?这就像跨应用程序共享的内存映射。

于 2010-07-14T09:21:12.830 回答