如何将 JMS 队列视为临时存储?

Posted

技术标签:

【中文标题】如何将 JMS 队列视为临时存储?【英文标题】:How do I treat JMS queue as a temporary storage? 【发布时间】:2013-04-18 15:39:07 【问题描述】:

我希望能够从队列中提取和插入消息。是否可以为此利用 JMS 功能,或者我是否需要为此创建自定义数据结构?

如果有任何其他特定的临时存储设计模式,请告诉我。

更新: 由于许多人要求更多细节,所以在这里。我的要求是将消息存储在一个队列中,多个客户端可以从中推送数据,并在需要时从其中拉回数据。该队列应该可供多个客户端使用。一条消息应该只处理一次,如果客户端无法处理数据,那么消息应该返回到队列中。

【问题讨论】:

JMS API 足以完成您的任务。但是,队列不应该用作临时存储,而是异步传递消息。 @Indoknight 感谢您的回复,但我的要求是临时存储。是否有任何其他设计模式或组件可用? 如果取决于您的存储范围。在 Java 中,您可以将静态变量用于应用程序范围,将实例变量用于对象级范围。 @gurvinder372 如果你能多描述一下你所拥有的场景可能会更好 @jbx 我在我的问题中添加了更多细节。请看一下 【参考方案1】:

您似乎在一个问题中提出了多个问题,因此澄清一下您需要回答的各个点可能会对您有所帮助。

是的,可以将 JMS 用作“临时”存储,但这取决于您的意思以及您需要什么。大多数 JMS 提供程序(例如 ActiveMQ)允许您在队列上执行以下操作:

将队列设置为持久(即存储在磁盘上,如果队列重新启动,所有消息都在那里)或非持久(即不存储在磁盘上,如果队列重新启动,则不会有任何消息)。李> 您可以为消息设置过期时间,这样如果未按时提取,它们就会被丢弃。

这取决于您所说的“临时存储”。 JMS 队列不是数据库,它是一个消息传递系统。

关于数据结构,您既可以序列化ObjectMessage 中的普通Java 对象,也可以使用TextMessage 序列化文本消息。因此,您可以通过 XML、JSON、CSV 或任何您想要的方式。您还可以包含可用于路由或与消息关联的其他元信息的特殊标头。再次取决于“自定义数据结构”的含义。您还可以一个接一个地发送原始的BytesMessageMapMessage(键值对)或StreamMessage,其中包含不同的数据类型。

如果您需要字面意义上的临时存储,也许您应该考虑嵌入式数据库,例如 Derby 或 HSQLDB。我认为他们也有配置来说明数据应该留在内存中还是在数据变得太大后进入磁盘。

【讨论】:

您能否为您上面给出的评论分享一个指针或工作示例?谢谢 @gurvinder372 对于哪个评论?我提到了很多东西 :) 你真正需要知道什么? 是的,但这也太长而且太抽象了。你到底想达到什么目的?异步接收?同步接收?您选择了哪种 JMS 实现?你在使用 Spring 之类的框架吗? 好吧,Oracle 规范只是一个规范,它没有为您提供实现。您需要选择一个可用的 JMS 提供程序,例如 Apache ActiveMQ(除非您使用的是 JEE 应用程序服务器)。如果您在线搜索JMS synchronous receive,您将获得大量示例。我刚试了一下,这个在顶部 effectivemessaging.blogspot.co.uk/2009/01/… 。至少自己努力寻找东西!

以上是关于如何将 JMS 队列视为临时存储?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Artemis JMS 管理 API 创建持久队列

如何使用 Apache Camel 从 Java 类访问 JMS 队列?

如果在消费消息后出现任何错误,如何将消息保存在 JMS 消息队列中?

如何使用 vfs JMS Sender 在 wso2 esb 代理中返回响应?

如何使用 spring 集成 dsl 从 JMS 队列中解组 XML

没有消息存储库的JMS队列的消息处理器