-
-
接着进行相关配置
@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; } }
-
使用示例
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); // } } }
@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
方法