Java JMS 消息传递

标签 java spring jboss messaging amqp

我有一个通过 qpid 消息发送消息到服务器和服务器接收消息的工作示例。这是发送到服务器的简单 hello world :

http://pastebin.com/M7mSECJn

这是接收请求并发送响应的服务器(当前客户端没有收到响应):

http://pastebin.com/2mEeuzrV

这是我的属性文件:

http://pastebin.com/TLEFdpXG

它们都工作得很好,我可以通过 Qpid JMX 管理控制台看到 qpid 队列中的消息。这些例子是从https://svn.apache.org/repos/asf/qpid/trunk/qpid/java/client/example下载的(可能有人也需要它)。

我以前用 spring 做过 Jboss 消息传递,但我不能用 qpid 做同样的事情。在 applicationsContext 中使用 jboss,我有这样的 bean jndiTemplate、conectionFactory、destinationQueue 和 jmscontainer:

<!-- Queue configuration -->
 <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>
    <prop key="java.naming.security.principal">admin</prop>
    <prop key="java.naming.security.credentials">admin</prop>
   </props>
  </property>
 </bean>

 <bean id="connectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
  <property name="jndiTemplate" ref="jndiTemplate" />
  <property name="jndiName" value="ConnectionFactory" />
 </bean>

 <bean id="queueDestination" class="org.springframework.jndi.JndiObjectFactoryBean">
  <property name="jndiTemplate" ref="jndiTemplate" />
  <property name="jndiName">
   <value>queue/testQueue</value>
  </property>
 </bean>

  <bean id="jmsContainer"
  class="org.springframework.jms.listener.DefaultMessageListenerContainer">
  <property name="connectionFactory" ref="connectionFactory" />
  <property name="destination" ref="queueDestination" />
  <property name="messageListener" ref="listener" />
 </bean>

当然还有发送者和听众:

 <bean id="sender" class="com.practice.Sender">
  <property name="connectionFactory" ref="connectionFactory" />
  <property name="queueDestination" ref="queueDestination" />
 </bean>


 <bean id="listener" class="com.practice.MsgListener" />

现在我想使用 spring 上下文逻辑重写这个 qpid 示例。谁能帮帮我?

最佳答案

Spring 提供了 JmsTemplate 类。检查this网站有一个如何设置模板的例子(使用 activemq)

对于您的具体示例,请尝试将 jmsContainer 替换为:

<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
  <property name="connectionFactory" ref="connectionFactory" />
</bean>

您还必须更改代码以使用 spring JmsTemplate:

public class MessageSender  {

    private Destination destination;
    private JmsTemplate jmsTemplate;

    public void setJmsTemplate(JmsTemplate jmsTemplate)  {
        this.jmsTemplate = jmsTemplate;
    }

    public void setDestination(Destination destination) {
        this.destination = destination;
    }

    public void sendMessage() { 
        MessageCreator creator = new MessageCreator() {
            public Message createMessage(Session session) {
                TextMessage message = null;
                try  {
                    message = session.createTextMessage();
                    message.setStringProperty("text", "Hello, World!");
                }
                catch (JMSException e) {
                    e.printStackTrace();
                }
                return message;
            }
        };  
    jmsTemplate.send(destination, creator);
    }
}

在 springsource 站点上也有很好的文档 this

关于Java JMS 消息传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2948131/

相关文章:

java - 在 OSGi 下使用 SnakeYaml?

java - 使用 Spring Boot 应用程序作为 gradle 的依赖项

ssl - 如何为 https 配置添加多个主机名支持?就像我想使用域访问以及使用 https 访问 ip 地址

apache - Apache 错误日志中的 Mod 集群代理超时

java - 将 xml 文件中的字符串日期与今天的日期进行比较,如果日期已过期,则从 xml 中删除该节点。字符串日期的格式为 dd/MM/yy

java - 为什么我们可以通过字面量来初始化String、Integer?

java - 图片上传下载到google appengine很慢

java - spring data动态组合@query查询

java - 使用没有 ID 的实体

JBoss EAP 6 配置单一服务器以在域模式下进行远程调试