【问题标题】:Why does Spring JMS framework use MessageCreator?为什么 Spring JMS 框架使用 MessageCreator?
【发布时间】:2014-05-08 17:29:23
【问题描述】:

我很难理解 Spring JMS 用于发送消息的模式。 JmsTemplate 类将 MessageCreator 作为参数。像这样:

JmsTemplate.send(MessageCreator messageCreator)

没有直接传递消息对象的选项。这似乎非常反 Spring,因为 MessageCreator 不能是单例。如果它是单例,由于这种方法,它不会是线程安全的:

MessageCreator.createMessage(Session session)

createMessage 方法只接受一个会话对象。所以为了让这个对象创建一个消息,它需要用一些状态来初始化,如果它有状态那么它就不能是单例的。

那么强迫我拥有 MessageCreator 的意义何在?因为在任何真实情况下,MyMessageCreator 总是看起来像这样:

public MyMessageCreator(String message) {
    this.message = message;
}
public createMessage(Session session) throws JMSException {
    return session.createTextMessage(message);
}

因为生成消息总是需要一些 bean 或其他动态值。如果全部都做不到,为什么要在这个类中部分构建消息?

如果唯一的原因是我们有一个对 Session 对象的引用,那么我确信有更好的方法可以从 spring bean 访问这个实例(通过注入它,从模板本身获取它,或者使用一些工厂方法)。

我错过了什么吗?还是 MessageCreator 毫无意义?

【问题讨论】:

    标签: spring spring-jms


    【解决方案1】:

    Session 链接到您的发送操作,它不是单例。您需要访问此Session 才能创建javax.jms.Message

    您无法将javax.jms.Message 传递给JmsTemplate,因为您需要先创建会话,并且该会话实际上由JmsTemplate 在内部管理。

    你应该反其道而行之。您应该有一个返回 MessageCreator 而不是您想要构建的 Message 的方法。该方法可以放置在 Spring bean 中,并且可以进行任何您需要的注入。而且由于它是您的一种方法,您可以传递您想要的任何动态值。

    话虽如此,能够从 Spring 4.0 的消息传递抽象 (org.springframework.messaging.Message) 中受益是一个好主意,因为它允许您以独立于协议的方式以您想要的方式构建消息。

    我为你创建了SPR-11772

    【讨论】:

    • 当 Spring 提供 MessageConverter 抽象时,我为什么要使用 Session 对象?只是想不出这个 MessageCreator 的任何用例是其他构造无法完成的。
    • 不确定您在考虑哪个 MessageConverter 抽象,但 JMS 需要会话。并且出于一个明显的原因,JMS API 需要您在创建 javax.jms.Message 时传递会话。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-22
    • 2011-06-20
    • 1970-01-01
    • 2016-09-18
    • 2011-04-18
    • 1970-01-01
    • 2014-09-29
    相关资源
    最近更新 更多