如何在java应用程序之间共享对象?
我一次运行2个单独的Java应用程序。 (两个单独的javaw.exe)我需要在它们运行时共享它们之间的对象。
没有永久存储的最简单方法是什么?
对象及其实例变量可以在Java程序中的线程之间共享,这是非常简单的任务。
如果您需要在两个程序之间共享对象(它的实例),而没有数据存储,则下一个选择将使用RMI套接字通信或Java消息传递服务。
您可以使用TCP
- 使用本地软件端口,例如localhost:999。
- 将一个应用程序设置为服务器(侦听此端口),将其他应用程序设置为客户端(将连接到localhost:999上的服务器,但将使用不同的端口供自己使用)。
- 客户端会将您的对象序列化为流。
- 服务器确实反序列化!
示例: http : //www.java-samples.com/showtutorial.php?tutorials = 1167
您必须决定是否更喜欢共享和更新状态,或者只是发送一次性消息对象。
在第一种情况下,您必须与某个对象共享“远程引用”。 RMI是一种很好的方法。
在第二种情况下,您只需要序列化要共享的对象并将其发送。 您可以像Ankit所说的那样通过套接字将其序列化(转换为byes),甚至可以使用:
-
RMI :)发件人连接到RMI注册的接收器,调用一个方法,将mesasge对象作为参数并忘记RMI对象
-
Java Messaging Service(JMS),也许是一种矫枉过正的行为……
-
一些其他创意但简单的事情……
我认为Hazelcast适用于这种情况。 它实际上不需要设置(超过你需要将依赖项添加到Hazelcastjar子)。 以下代码示例演示如何设置共享Map
。
// Code in process 1 Config cfg = new Config(); HazelcastInstance instance = Hazelcast.newHazelcastInstance(cfg); Map 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 sharedData = instance.getMap("shared"); String theSharedString = sharedData.get(1);
Hazelcast支持各种共享数据结构,包括Map
, Queue
, List
, AtomicLong
, IdGenerator
等。文档很好 ,根据我的经验,实现是可靠的。
如果您无法永久存储对象,则需要以某种方式进行传输。 这可以通过网络或某种共享内存来完成。
对于第一种(网络)方法,使用序列化(java.io.Serializable)并通过套接字传输对象。 这将需要编写套接字侦听器。
第二种方法将需要使用和配置第三方库(例如EHCache )。
也许Oracle Coherence ? 这类似于跨应用程序共享的内存映射。