Spring 中使用 ActiveMQ 笔记

  1. 首先需要在 pom.xml 中添加如下两个 jar 包:spring-jms 与 activemq-core,其依赖的 jar 包会自动下载

  2. 接着进行相关配置

@Configuration
public class JMSConfig {
    @Bean
    public ConnectionFactory connectionFactory() {
        ConnectionFactory cf = new ActiveMQConnectionFactory("tcp://localhost:61616");
        return cf;
    }
​
    /**
     * 消息转换器,有如下四种可供选择
     * MappingJacksonMessageConverter      转换json
     * MappingJackson2MessageConverter     转换json
     * MarshallingMessageConverter         转换xml
     * SimpleMessageConverter   如果是字符串转换为字节,如果是类进行序列化(需实现 Serializable)
     */
    @Bean
    public MessageConverter messageConverter() {
        MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
        /* 使用 MappingJackson2MessageConverter 必须配置,否则无法反序列化
           如果存储类型有多种,可以使用 converter.setTypeIdMappings(); 方法
           为每种类设置对应的 TypeId
        */
        converter.setTypeIdPropertyName("<内容随意,保证一致即可>");
      
        // 如下三行配置的是当类为空时仍进行转换,如果不配置类为空时会报异常
        // ObjectMapper mapper = new ObjectMapper();
        // mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
        // converter.setObjectMapper(mapper);
        return converter;
    }
​
    // 配置 Spring 提供的 JmsTemplate Bean
    @Bean
    public JmsTemplate jmsTemplate(ConnectionFactory connectionFactory, MessageConverter messageConverter) {
        JmsTemplate jmsTemplate = new JmsTemplate(connectionFactory);
        // 此处可以选择是否配置,如果不配默认是使用 SimpleMessageConverter
        jmsTemplate.setMessageConverter(messageConverter);
        // 可以设置默认的 Destination (Queue)
        // 如果需要 Topic,可以使用 setDefaultDestination 方法,添加默认 Destination
        jmsTemplate.setDefaultDestinationName("<XXXX>");
        return jmsTemplate;
    }
​
}

 

  1. 使用示例

public class Service {
​
    // JmsTemplate 实现了 JmsOperations 接口,可以注入
    @Autowired
    private JmsOperations jmsOperations;
​
    // 方法中注释部分为另一个发送接收方式    
    @Override
    public void sendSpittleAlert(User user) {
        jmsOperations.convertAndSend("testqueue", user);
//        jmsOperations.send("testqueue", new MessageCreator() {
//            @Override
//            public Message createMessage(Session session) throws JMSException {
//                return session.createObjectMessage(user);
//            }
//        });
    }
​
    @Override
    public User receiveSpitterAlert() {
        User user = (User) jmsOperations.receiveAndConvert("testqueue");
        return user;
//        try {
//            ObjectMessage receive = (ObjectMessage) jmsOperations.receive("testqueue");
//            return (User) receive.getObject();
//        } catch (JMSException e) {
//            throw JmsUtils.convertJmsAccessException(e);
//        }
    }
​
}

 

 

如果要异步接收 MQ 的消息,可以进行如下配置:

@Configuration
@EnableJms  // 开启 JMS 注解
public class JMSConfig {
    @Bean
    public ConnectionFactory connectionFactory() {
        ConnectionFactory cf = new ActiveMQConnectionFactory("tcp://localhost:61616");
        return cf;
    }
​
    // 创建消息监听容器
    @Bean
    public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() {
        DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
        factory.setConnectionFactory(connectionFactory());
        factory.setDestinationResolver(jmsTemplate().getDestinationResolver());
        factory.setConcurrency("3-10");
        return factory;
    }
​
    @Bean
    public JmsTemplate jmsTemplate() {
        JmsTemplate jmsTemplate = new JmsTemplate(connectionFactory());
        return jmsTemplate;
    }
}

 

之后就可以在其他 Bean 中使用 @JmsListener 注解监听

@Component
public class MyService {
    @JmsListener(destination = "myDestination")
    public void processOrder(String data) { ... }
}

当 MQ 有消息时,就会调用processOrder方法

 

posted on 2017-08-15 17:27  _路上  阅读(245)  评论(0编辑  收藏  举报

导航