【问题标题】:Can Java interact with System V linux message queues?Java 可以与 System V linux 消息队列交互吗?
【发布时间】:2011-09-18 10:04:41
【问题描述】:

我需要将信息从 shell 脚本(从基于 linux 的应用程序调用)传递到 java 应用程序。

命名管道很麻烦,因为如果不考虑对管道读/写端的复杂影响,我就无法启动/停止任一服务。

套接字很困难,因为如果重新启动侦听进程,则没有排队机制,并且简单的实现需要不断创建新的套接字(否则 shell 脚本会因检查和重新启动而变得非常复杂-套接字和排队代码)。

我最近正在阅读这些System V/POSIX linux 消息队列。我正在运行 Fedora 12,想知道是否有配置这些消息队列并从 Java 与它们交互的好方法。

【问题讨论】:

  • Java Posix IPC Is there an API? 的可能重复项
  • 您打算如何通过 shell 脚本与它们进行交互?
  • 编写一个简单的 C 包装器将 shell 脚本绑定到 posix 消息队列比绑定到 JNI 更容易......
  • @bdonlan:你提议的 dup 是关于 POSIX,而这篇文章包括 SYSV 作为一种可能性,所以它不是真正的 dup。
  • 我同意,这是一个骗局,我没有找到 bdonlan 提到的问题,而且我的术语还不太正确。 POSIX 是我想要的,我认为该消息的答案非常有用,我也投票关闭了重复项。谢谢!

标签: java linux shell message-queue


【解决方案1】:

你不能直接使用它们,你必须做一些 JNI 魔法才能将它们连接在一起。

您在使用 Pipes 时遇到什么问题? Java 将这些视为通用文件。我没有广泛使用它们,但我对 Pipes 没有任何实际问题。唯一的细节是,如果生产者跟不上,管道读取器需要不断地重新打开管道。

但如果任何一方失败,另一方只会阻塞等待对方恢复。

您只需要小心从管道读取缓冲区。如果您从管道读取到缓冲区,然后失败,则该数据将丢失。

【讨论】:

  • 我最终与命名管道战斗,它们有点奇怪,因为整个输入/输出流类将阻塞构造函数,直到管道的另一端打开,所以你有解决这个问题,正如你提到的,仔细监控 EOF 并重新打开。花了一些时间来弄清楚正确处理所需的 3 或 4 个怪癖,但我想我现在明白了,它看起来并不优雅,而且事情有点违反直觉。试图让脚本正确是另一个大问题,当另一端打开/关闭时,cat、tee 和其他常见工具的行为非常奇怪。
猜你喜欢
  • 2013-03-29
  • 2010-12-15
  • 2020-04-18
  • 1970-01-01
  • 2011-05-05
  • 2010-09-28
  • 1970-01-01
  • 2017-05-21
  • 2016-03-04
相关资源
最近更新 更多