为什么Spring JMS框架使用MessageCreator?

时间:2014-05-08 17:29:24

标签: spring spring-jms

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

JmsTemplate.send(MessageCreator messageCreator)

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

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毫无意义?

1 个答案:

答案 0 :(得分:3)

Session与您的发送操作相关联,它不是单身人士。您需要有权访问此Session才能创建javax.jms.Message

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

你应该反过来做事。您应该有一个返回MessageCreator而不是您想要构建的Message的方法。该方法可以放在Spring bean中,可以进行任何需要的注入。因为它是你的一种方法,你可以传递你想要的任何动态值。

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

我为你创建了SPR-11772