如何使用Spring3.05和JBoss5.1(JBossMQ)实现JMS本地队列?
How to implement JMS local queue using Spring 3.05 and JBoss 5.1 (JBossMQ)?
JBoss 5.1 server[=] 上有一个基于 Spring 3.0.5 框架 运行 的应用程序40=].
我试图遵循这个 tutorial,但它使用 ActiveMQ 代理而不是 JBossMQ (默认 JBoss 5.1 代理)。
我已经在 JBoss 配置中设置了一个名为 MyQueue 的队列 (destinations-service.xml):
<mbean code="org.jboss.jms.server.destination.QueueService"
name="jboss.messaging.destination:service=Queue,name=MyQueue"
xmbean-dd="xmdesc/Queue-xmbean.xml">
<depends optional-attribute-name="ServerPeer">jboss.messaging:service=ServerPeer</depends>
<depends>jboss.messaging:service=PostOffice</depends>
您可以在下面看到我的其余配置。我错过了什么?如何指定队列和连接工厂的 JNDI 名称?服务器地址([ConnectionFactory] Connector bisocket://localhost:4457)呢?
我在applicationContext.xml中的配置如下:
<bean id="connectionFactory" class="org.jboss.jms.server.connectionfactory.ConnectionFactory" />
<bean id="messageDestination" class="javax.jms.Queue" />
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="connectionFactory" />
<property name="receiveTimeout" value="10000" />
</bean>
<bean id="springJmsProducer" class="myPackage.QueueProducer">
<property name="destination" ref="messageDestination" />
<property name="jmsTemplate" ref="jmsTemplate" />
</bean>
<bean id="messageListener" class="myPackage.QueueConsumer" />
我的制作人:
public class QueueProducer {
private JmsTemplate jmsTemplate;
private Queue queue;
public void setConnectionFactory(ConnectionFactory cf) {
this.jmsTemplate = new JmsTemplate(cf);
}
public void setQueue(Queue queue) {
this.queue = queue;
}
public void send(Object object) {
this.jmsTemplate.send(this.queue, new MessageCreator() {
public Message createMessage(Session session) throws JMSException {
return session.createTextMessage("my text to send");
}
});
}
}
我的消费者:
public class QueueConsumer implements MessageListener {
@Override
public void onMessage(Message message) {
if (message instanceof TextMessage) {
try {
System.out.println(((TextMessage) message).getText());
}catch (JMSException ex) {
throw new RuntimeException(ex);
}
}
else {
throw new IllegalArgumentException("Message must be of type TextMessage");
}
}
}
你想要的很有可能jndiTemplate
。此外,您没有将 jmsTemplate
beans 正确连接在一起。这是对 Spring applicationContext.
所需内容的逐条解释
您需要设置一个 jndiTemplate 来注入 JBoss JNDI 实现:
<bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate">
<property name="environment">
<props>
<prop key="java.naming.factory.initial">
org.jnp.interfaces.NamingContextFactory
</prop>
<prop key="java.naming.provider.url">
jnp://localhost:1099
</prop>
<prop key="java.naming.factory.url.pkgs">
org.jboss.naming:org.jnp.interfaces
</prop>
</props>
</property>
</bean>
然后,配置 ConnectionFactory 指向上面的 JNDI 配置:
<!-- spring JMS definition -->
<bean name="jmsConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiTemplate" ref="jndiTemplate"/>
<property name="jndiName" value="ConnectionFactory" />
</bean>
使用上面的 ConnectionFactory 配置事务管理器:
<bean id="jmsTransactionManager" class="org.springframework.jms.connection.JmsTransactionManager">
<property name="connectionFactory" ref="jmsConnectionFactory" />
</bean>
将目标与 jndiTemplate 和 jndiName 相关联:
<!-- jms destination already defined in jboss -->
<bean name="myQueue" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiTemplate" ref="jndiTemplate"/>
<property name="jndiName" value="queue/MyQueue" />
</bean>
最后,将 jmsTemplate 本身配置为指向 ConnectionFactory,您就可以在代码中使用 JmsTemplate 了:
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="connectionFactory" />
</bean>
您还需要 运行 您的消费者的消息侦听器容器配置。将 "jmsexample.ExampleListener" 替换为包含您的 MessageListener 的 class 的名称:
<!-- this is the Message Driven POJO (MDP) -->
<bean id="messageListener" class="jmsexample.ExampleListener" />
<!-- and this is the message listener container -->
<bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="connectionFactory"/>
<property name="destination" ref="myQueue"/>
<property name="messageListener" ref="messageListener" />
</bean>
JBoss 5.1 server[=] 上有一个基于 Spring 3.0.5 框架 运行 的应用程序40=].
我试图遵循这个 tutorial,但它使用 ActiveMQ 代理而不是 JBossMQ (默认 JBoss 5.1 代理)。
我已经在 JBoss 配置中设置了一个名为 MyQueue 的队列 (destinations-service.xml):
<mbean code="org.jboss.jms.server.destination.QueueService"
name="jboss.messaging.destination:service=Queue,name=MyQueue"
xmbean-dd="xmdesc/Queue-xmbean.xml">
<depends optional-attribute-name="ServerPeer">jboss.messaging:service=ServerPeer</depends>
<depends>jboss.messaging:service=PostOffice</depends>
您可以在下面看到我的其余配置。我错过了什么?如何指定队列和连接工厂的 JNDI 名称?服务器地址([ConnectionFactory] Connector bisocket://localhost:4457)呢?
我在applicationContext.xml中的配置如下:
<bean id="connectionFactory" class="org.jboss.jms.server.connectionfactory.ConnectionFactory" />
<bean id="messageDestination" class="javax.jms.Queue" />
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="connectionFactory" />
<property name="receiveTimeout" value="10000" />
</bean>
<bean id="springJmsProducer" class="myPackage.QueueProducer">
<property name="destination" ref="messageDestination" />
<property name="jmsTemplate" ref="jmsTemplate" />
</bean>
<bean id="messageListener" class="myPackage.QueueConsumer" />
我的制作人:
public class QueueProducer {
private JmsTemplate jmsTemplate;
private Queue queue;
public void setConnectionFactory(ConnectionFactory cf) {
this.jmsTemplate = new JmsTemplate(cf);
}
public void setQueue(Queue queue) {
this.queue = queue;
}
public void send(Object object) {
this.jmsTemplate.send(this.queue, new MessageCreator() {
public Message createMessage(Session session) throws JMSException {
return session.createTextMessage("my text to send");
}
});
}
}
我的消费者:
public class QueueConsumer implements MessageListener {
@Override
public void onMessage(Message message) {
if (message instanceof TextMessage) {
try {
System.out.println(((TextMessage) message).getText());
}catch (JMSException ex) {
throw new RuntimeException(ex);
}
}
else {
throw new IllegalArgumentException("Message must be of type TextMessage");
}
}
}
你想要的很有可能jndiTemplate
。此外,您没有将 jmsTemplate
beans 正确连接在一起。这是对 Spring applicationContext.
您需要设置一个 jndiTemplate 来注入 JBoss JNDI 实现:
<bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate">
<property name="environment">
<props>
<prop key="java.naming.factory.initial">
org.jnp.interfaces.NamingContextFactory
</prop>
<prop key="java.naming.provider.url">
jnp://localhost:1099
</prop>
<prop key="java.naming.factory.url.pkgs">
org.jboss.naming:org.jnp.interfaces
</prop>
</props>
</property>
</bean>
然后,配置 ConnectionFactory 指向上面的 JNDI 配置:
<!-- spring JMS definition -->
<bean name="jmsConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiTemplate" ref="jndiTemplate"/>
<property name="jndiName" value="ConnectionFactory" />
</bean>
使用上面的 ConnectionFactory 配置事务管理器:
<bean id="jmsTransactionManager" class="org.springframework.jms.connection.JmsTransactionManager">
<property name="connectionFactory" ref="jmsConnectionFactory" />
</bean>
将目标与 jndiTemplate 和 jndiName 相关联:
<!-- jms destination already defined in jboss -->
<bean name="myQueue" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiTemplate" ref="jndiTemplate"/>
<property name="jndiName" value="queue/MyQueue" />
</bean>
最后,将 jmsTemplate 本身配置为指向 ConnectionFactory,您就可以在代码中使用 JmsTemplate 了:
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="connectionFactory" />
</bean>
您还需要 运行 您的消费者的消息侦听器容器配置。将 "jmsexample.ExampleListener" 替换为包含您的 MessageListener 的 class 的名称:
<!-- this is the Message Driven POJO (MDP) -->
<bean id="messageListener" class="jmsexample.ExampleListener" />
<!-- and this is the message listener container -->
<bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="connectionFactory"/>
<property name="destination" ref="myQueue"/>
<property name="messageListener" ref="messageListener" />
</bean>