为什么JMS中的Session接口上有createMessage方法?

时间:2011-12-12 14:29:29

标签: java jms

为什么在JMS的Session接口上定义了createMessage,createTextMessage等方法?我可以理解为什么当您发送或收到消息时,您需要会话,但不知道为什么要创建要从中发送的消息。为什么当JMS的设计者为它创建接口时,他们是否决定应该从会话创建消息而不仅仅是新建的?

4 个答案:

答案 0 :(得分:1)

(很棒的API设计问题。)

您在概念上将“JMS消息”与您的消息内容混淆。

是。通过会话来解决消息生命周期似乎有点混淆。但是如果考虑断开节点的情况,那么设计决策并不奇怪。

重点是要注意“为什么客户端想要创建消息,如果没有连接?”同时考虑“什么是'消息'的问题,如果从JMS中删除元数据“? (消息元数据的示例:消息顺序。)

所以,基本上,应该清楚的是,减去元数据(这对会话和提供者非常有约束力),你的“用户内容”实际上与JMS无关。换句话说,从概念上讲,你有元组:

{ [meta-data] : [user-content] }

所以“消息”实际上就是上面的元组。 user-content只是您的数据。即,如果为一般“创建消息”提供通用(非绑定/断开连接)接口,所有获得的是“通用”消息(非必要)创建(实际上只包装您的内容)并缺乏所有必要的“元数据”,使其成为一个合适的“JMS消息”。在某些时候,需要将该通用带外消息“转换”为适当的JMS消息,例如,添加了订购元数据,添加了时间戳等。

你从那些“通用”“JMS”消息中获得了什么? (没什么,看来。)

实际上,从会话创建消息在概念上更清晰,更有效。

答案 1 :(得分:0)

TextMessage和其他消息有一个标准接口,但不是标准实现。这意味着您有多个JMS提供程序,您将拥有这些类的不同实现。

答案 2 :(得分:0)

构建消息或多或少是factory pattern。这允许实现决定如何构造消息,它可能需要来自当前会话的大量信息,并允许预先填充该信息,并且将由实现如何实现。正如文档所说:

“每个JMS提供程序都提供一组消息工厂及其Session对象,用于创建消息实例。这允许提供程序使用根据其特定需求定制的消息实现。”

答案 3 :(得分:0)

每个JMS提供程序都有自己的特定实现,消息属性等,由消息工厂初始化。所以,无论如何你需要某种消息工厂。

他们可能将工厂方法放在Connection而不是Session上,但是他们认为同一个实体(在我们的例子中是会话)在创建和发送消息时都要更容易。

我认为这些是主要原因。