我很难理解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毫无意义?
答案 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。