《Pro Spring》学习笔记之Spring+ActiveMQ实现Topic通信(发布者/订阅者)

本文介绍了一个使用Spring框架和JMS进行消息传递的例子。包括配置文件的设置、消息发送与接收的实现过程。演示了如何利用Spring简化JMS编程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spring配置文件:

 

<?xml version="1.0" encoding="UTF-8"?>
<beans
    
xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation
="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

<bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
  
<property name="brokerURL">
    
<value>tcp://localhost:61616</value>
  
</property>
 
</bean>

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

<bean id="destination" class="org.apache.activemq.command.ActiveMQTopic">
  
<constructor-arg index="0">
    
<value>HelloWorldTopic</value>
  
</constructor-arg>
</bean>
</beans>

 发布者:

 

package ch13.JMS;

import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;

public class HelloWorldSenderPS  {
   
    
public static void main(String[] args) throws Exception{
        ApplicationContext context 
= new ClassPathXmlApplicationContext(
                
new String[] {"ch13/JMS/applicationContext-PS.xml"});
        JmsTemplate jmsTemplate 
= (JmsTemplate) context.getBean("jmsTemplate");
        Destination destination 
= (Destination) context.getBean("destination");
        
for (int i = 0; i < 2; i++{
            System.out.println(
"Sending Message: Foo"+i);
            jmsTemplate.convertAndSend(destination,
"Foo "+i);
            
try {
                Thread.sleep(
10);
            }
 catch (InterruptedException e) {
                
// TODO Auto-generated catch block
                e.printStackTrace();
            }
    
        }

    }

    
    
    


}

 

这里我们使用了convertAndSend的方式进行发送,这个方法将一个String转换成一个TextMessage实例,并发送他道指定的destination---这一切完全都是自动的,如果不这样,我们就必须通过以下冗长的代码:

jmsTemplate.send(destination, new MessageCreator() {
            
public Message createMessage(Session session) throws JMSException {
                
return session.createTextMessage("11");
            }

        }
);

 

Spring使用一个MessageConvert接口的实现类来把一个java对象转换到一个可发送的消息实例,当使用receiveAndConvert()方法接受一个消息时候,Spring使用MessageConvert来进行相反地操作,转换一个消息实例到一个java对象

 

接收者:

 

package ch13.JMS;

import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.TextMessage;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jms.core.JmsTemplate;


public class HelloWorldReciverPS  {

    
   
public static void main(String args[]){
       
       ApplicationContext context
=new ClassPathXmlApplicationContext(
                
new String[]{"ch13/JMS/applicationContext-PS.xml"});
        JmsTemplate jmsTemplate
=(JmsTemplate)context.getBean("jmsTemplate");
        Destination destination
=(Destination)context.getBean("destination");
       
       
while(true){    
         TextMessage msg
=(TextMessage)jmsTemplate.receive(destination);
         
try {
            System.out.println(
"Recieved:"+msg.getText());
        }
 catch (JMSException e) {
            System.out.println(e.getMessage());
        }

       }

            
   }


    
      
   
}

 

测试:

运行两个接收者实例,如果你使用ecliose,可以启动两个eclipse分别指向两个工作空间,部署两套代码,运行发布者后,终端出现:

waiting...

 

在另一个eclipse上运行发送者,出现:

Sending Message: Foo0

Sending Message: Foo1

 

这时候,两个接收端可以看到如下结果:

waiting...
Recieved:Foo 0
Recieved:Foo 1

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值