Spring整合ActiveMQ实现多个消费者配置(Queue与Topic模式)

需要依赖的jar包,包括但不限于

    
        org.springframework
        spring-core
        ${spring.version}
    
    
        org.springframework
        spring-web
        ${spring.version}
    
    
        org.springframework
        spring-oxm
        ${spring.version}
    
    
        org.springframework
        spring-tx
        ${spring.version}
    
    
        org.springframework
        spring-jdbc
        ${spring.version}
    
    
        org.springframework
        spring-webmvc
        ${spring.version}
    
    
        org.springframework
        spring-aop
        ${spring.version}
    
    
        org.springframework
        spring-context-support
        ${spring.version}
    
    
        org.springframework
        spring-test
        ${spring.version}
    


    
        org.apache.activemq
        activemq-all
        5.11.0
    
    
        org.springframework
        spring-jms
        ${spring.version}
    
    
        org.apache.xbean
	xbean-spring
	4.5
    

其中最后一个xbean-spring,如果没有依赖,则会在tomcat启动时报错。

spring配置相信大家都已经很熟悉了,在这里就不贴代码了,注意要加上下图代码,因为我把spring和activemq分开配置了。


activemq.xml

这个配置文件主要配置ActiveMQ的连接




      
      
      
       
          
          
          
    
    
    
	
	
	
	
	
    
    
    
	
	
	
	
	
	
    
      
      
          
            queue  
          
      
      
      
          
            topic  
          
      

activemq-listener

该配置文件主要配置消费者



      
      
      
      
      
      
      
          
          
      
      
      
          
          
      
点对点生产者代码
@Service
public class QueueProducerService {
    @Resource(name="jmsQueueTemplate")
    private JmsTemplate jmsQueueTemplate;

    public void sendMessage(Destination destination,final String msg){
        System.out.println(Thread.currentThread().getName()+" 向"+destination.toString()+"发送消息:"+msg);
        jmsQueueTemplate.send(destination, new MessageCreator() {
            public Message createMessage(Session session) throws JMSException {
                return session.createTextMessage(msg);
            }
        });
    }

    public void sendMessage(final String msg){
        String destination = jmsQueueTemplate.getDefaultDestinationName();
        System.out.println(Thread.currentThread().getName()+" 向"+destination+"发送消息:"+msg);
        jmsQueueTemplate.send(new MessageCreator() {
            public Message createMessage(Session session) throws JMSException {
                return session.createTextMessage(msg);
            }
        });
    }
}
发布订阅生产者代码
@Service
public class TopicProducerService {
    @Resource(name = "jmsTopicTemplate")
    private JmsTemplate jmsTopicTemplate;

    public void sendMessage(Destination destination, final String message) {
        System.out.println(Thread.currentThread().getName() + " 向" + destination.toString()
                + "发送主题:" + message);
        jmsTopicTemplate.send(destination, new MessageCreator() {
            public Message createMessage(Session session) throws JMSException {
                return session.createTextMessage(message);
            }
        });
    }

    public void sendMessage(final String msg) {
        String destination = jmsTopicTemplate.getDefaultDestinationName();
        System.out.println(Thread.currentThread().getName() + " 向" + destination + "发送主题:" + msg);
        jmsTopicTemplate.send(new MessageCreator() {
            public Message createMessage(Session session) throws JMSException {
                return session.createTextMessage(msg);
            }
        });
    }
}
消费者代码
public class QueueMessageListener1 implements MessageListener{
    @Override
    public void onMessage(Message message) {
    TextMessage tm = (TextMessage) message;
    try {
        System.out.println("QueueMessageListener1监听到了文本消息:\t"+ tm.getText());
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }
}

将上述代码复制四份,两个点对点,两个发布订阅,对应activemq-listener中配置的四个消费者。

单元测试代码

@RunWith(SpringJUnit4ClassRunner.class) // 表示继承了SpringJUnit4ClassRunner类
@ContextConfiguration(locations = { "classpath:spring-context.xml" })
@WebAppConfiguration
public class TestMQ {
    @Resource  
    private QueueProducerService queueSender;  
    @Resource  
    private TopicProducerService topicSender;  
    @Resource(name = "queueDestination")
	private Destination queueDestination;
	@Resource(name = "topicDestination")
	private Destination topicDestination;
  
    @Test  
    public void testSend() {  
        for (int i = 1; i < 6; i++) {  
            queueSender.sendMessage(queueDestination, "queue产生消息:" + i);  
        }  
          
        for (int i = 1; i < 6; i++) {  
            topicSender.sendMessage(topicDestination, "topic产生消息:" + i);  
        }  
    }
}

运行结果如下:

Spring整合ActiveMQ实现多个消费者配置(Queue与Topic模式)_第1张图片

由运行结果可知,点对点模式的消息,只能被一个消费者接收;但是发布订阅模式的消息,可以被多个订阅者同时接收。

你可能感兴趣的:(操作使用)