3

我有一个使用 ZeroMQ 套接字进行进程间通信的 Java 程序。我有线程工作者做一些昂贵的工作,当他们完成他们的工作时,我想通过 inproc 套接字将该结果对象传递给“发送者”线程,以便它可以将对象发送给客户端。我见过一些例子,在 C++ 中这通常是使用指针来完成的,但在 Java 中没有指针,我不想序列化对象只是为了能够将对象传递给另一个线程。

我有哪些可能性?我只能有效地将“轻量级”值传递给套接字,例如字符串或原始类型。

谢谢!

4

3 回答 3

3

无论您传递引用还是指针,它都是一样的。您可以通过数据结构在同一进程中的线程之间传递它,但不能通过套接字传递它并期望它在不同的进程中工作。

即在同一进程中的线程之间传递引用(或指针)不要使用 ZeroMQ,而是使用类似于 BlockingQueue 的东西。

于 2013-01-31T17:23:48.727 回答
0

我有类似的情况,但我确实序列化了对象,因为客户端和服务器是在不同平台上用不同语言编写的。它还允许我使用打印它们的简单代理来调试消息。

我使用XStream将对象序列化/反序列化为 JSON 或 XML 字符串,它非常易于使用。

另一个解决方案是GSon,但我发现它会序列化 JVM 时区中的日期,我需要向/从在不同时区运行的计算机发送/接收消息。XStream 使用 GMT 作为默认时区。

于 2013-02-01T17:10:55.730 回答
0

我也有同样的疑问。这不是关于通过 zeromq 对另一个进程的 sendig 引用。那永远行不通。问题是对于 inproc 工作线程,发送消息意味着序列化和反序列化。对于字符串和原始类型,这是微不足道的,但对于大型业务对象,它没有意义(除非我错过了一个技巧)。

另一种解决方法是让工作线程将业务对象(或在您的情况下为结果)存储在缓存中,并将索引传递给“发送者”线程。这个“发送者”线程将从缓存中获取结果并将其发送给“客户端”。

但是我不确定这是否是预期目的。我在同一个论坛上提出了同样的问题。

于 2013-02-04T03:43:37.057 回答