• 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方法

  • 相关阅读:
    卡片式电脑介绍
    怎样对ListView的项进行排序
    jsp 声明类的使用
    Linux下启用Chrome/Firefox的Java插件
    strcmp函数和strcpy函数
    Python+Django+SAE系列教程9-----Django的视图和URL
    美团面试,面一次,累一次
    关于 Head First SQL 中文版
    Linux 内核的编译系统
    简单的REST的框架实现
  • 原文地址:https://www.cnblogs.com/zawier/p/7366292.html
Copyright © 2020-2023  润新知