Java能够与System V Linux消息队列进行交互吗?

6
我需要将从Linux应用程序中调用的shell脚本中的信息传递给Java应用程序。
命名管道很麻烦,因为我无法启动/停止任何一个服务而不考虑管道的读/写端的复杂影响。
套接字很难处理,因为如果监听进程重新启动,则没有排队机制,并且简单的实现需要不断创建新的套接字(否则shell脚本将变得非常复杂,需要检查和重启套接字以及排队代码)。
我最近了解到这些System V/POSIX Linux消息队列。我正在运行Fedora 12,并想知道是否有一种良好的方法来配置这些消息队列并从Java与它们交互。

1
可能是Java Posix IPC Is there an API?的重复问题。 - bdonlan
你打算如何从一个shell脚本中与它们交互? - Gabe
1
编写一个简单的C包装器来将Shell脚本绑定到POSIX消息队列比绑定到JNI更容易。 - bdonlan
1
@bdonlanпјҡжӮЁжҸҗеҮәзҡ„dupжҳҜе…ідәҺPOSIXзҡ„пјҢиҖҢиҝҷзҜҮж–Үз« еҢ…жӢ¬SYSVдҪңдёәеҸҜиғҪжҖ§пјҢжүҖд»Ҙе®ғ并дёҚжҳҜзңҹжӯЈзҡ„dupгҖӮ - Gabe
啊,说得好。希望对楼主有所帮助。 - bdonlan
1
我同意,这是一个重复的问题,我没有找到bdonlan提到的那个问题,而且我的术语还不太正确。我想我需要POSIX,那个帖子上的答案非常有用,我也投票将其关闭为重复问题。谢谢! - David Parks
1个回答

3

你不能直接使用它们,你需要进行一些JNI技巧来将它们连接在一起。

你在使用管道时有什么问题吗?Java将其视为普通文件。虽然我并没有广泛地使用过它们,但我没有遇到任何真正的管道问题。唯一需要注意的细节是,如果生产者无法跟上,管道读取器需要不断重新打开管道。

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

你只需要小心从管道中缓冲区读取数据。如果你从管道中读取到一个缓冲区,然后发生故障,那么这些数据就会丢失。


我最终与命名管道打了起来,它们有些奇怪,因为整个输入/输出流类将在构造函数上阻塞,直到管道的另一端开放,所以您必须围绕此进行工作,并且如您所提到的,仔细监视EOF并重新打开。需要做出一些调整才能弄清楚实现正确所需的3或4个怪癖,但我认为现在已经解决了,只是看起来不够优雅,事情有些违反直觉。尝试使脚本正确也是另一个重要问题,当另一端打开/关闭时,cat、tee和其他常见工具的行为非常奇怪。 - David Parks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接