2014-05-08 117 views
1

我很难理解Spring JMS用来发送消息的模式。 JmsTemplate类将MessageCreator作为参数。像这样:为什么Spring JMS框架使用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); 
} 

由于生成消息总是需要一些豆类或其他动态值。为什么一些这个类的消息构造如果都是都不能做?

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

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

回答

2

Session链接到您的发送操作,它不是一个单身人士。而且您需要访问此Session才能创建javax.jms.Message

您无法通过javax.jms.MessageJmsTemplate,因为您需要首先创建会话并且该会话实际上由JmsTemplate在内部管理。

你应该以相反的方式做事。您应该有一个返回MessageCreator而不是您想要构建的Message的方法。该方法可以放在Spring bean中,并且可以拥有任何你需要的注入。因为这是你的一种方法,你可以传递你想要的任何动态值。这就是说,能够受益于Spring 4.0的消息抽象(org.springframework.messaging.Message)是一个好主意,因为它可以让你以独立于协议的方式按照你想要的方式构建消息。我们为您创建了SPR-11772

+0

当Spring提供MessageConverter抽象时,为什么要使用Session对象?只是不能想到这个MessageCreator的任何用例都无法用其他结构来完成。 – luboskrnac

+0

不知道你在想什么'MessageConverter'抽象,但是JMS需要这个会话。出于一个明显的原因,当您创建一个'javax.jms.Message'时,JMS API需要您传递会话。 –