MessageListenerAdapter

       消息监听适配器:具体消息的消费逻辑,适配成 MessageListenerAdapter 定义的格式

  默认的方法签名为:void handleMessage(byte[] messageBody)

/**
 * 自定义的消费监听
 */
public class MessageDelegate {

    /**
     *这个handleMessage方法名要根据org.springframework.amqp.rabbit.listener.adapter包下的
     * MessageListenerAdapter.ORIGINAL_DEFAULT_LISTENER_METHOD的默认值来确定
    */
    
 public void handleMessage(byte[] messageBody) {
        System.err.println("默认方法, 消息内容:" + new String(messageBody));
    }

}

  handleMessage 方法名要根据 org.springframework.amqp.rabbit.listener.adapter 包下 MessageListenerAdapter.ORIGINAL_DEFAULT_LISTENER_METHOD 的默认值来确定

    @Bean
    public SimpleMessageListenerContainer messageListenerContainer(ConnectionFactory connectionFactory) {
        SimpleMessageListenerContainer messageListenerContainer = new SimpleMessageListenerContainer(connectionFactory);
        messageListenerContainer.setQueues(topicQueue(), topicQueueAgain());
        messageListenerContainer.setConcurrentConsumers(1);
        messageListenerContainer.setMaxConcurrentConsumers(5);
        messageListenerContainer.setAcknowledgeMode(AcknowledgeMode.AUTO);
        messageListenerContainer.setConsumerTagStrategy(queue -> queue + "_" + UUID.randomUUID().toString());

        MessageListenerAdapter listenerAdapter = new MessageListenerAdapter(new MessageDelegate());
        messageListenerContainer.setMessageListener(listenerAdapter);
        return messageListenerContainer;
}

  测试

    @Test
    public void sendMessage(){
        MessageProperties messageProperties = new MessageProperties();
        messageProperties.getHeaders().put("desc","自定义描述");
        messageProperties.getHeaders().put("type","自定义类型");
        Message message = new Message("hello message".getBytes(), messageProperties);

        rabbitTemplate.convertAndSend("topic.exchange","user.abc",message);
    }

  自定义消费方法

@Slf4j
public class MessageDelegate {

    public void handleMessage(byte[] messageBody) {
        log.info("默认方法 消息内容:" + new String(messageBody));
    }

    public void consumerMessage(byte[] messageBody){
        log.info("字节数据方法 消息的内容 "+new String(messageBody));
    }
}
    @Bean
    public SimpleMessageListenerContainer messageListenerContainer(ConnectionFactory connectionFactory) {
        SimpleMessageListenerContainer messageListenerContainer = new SimpleMessageListenerContainer(connectionFactory);
        messageListenerContainer.setQueues(topicQueue(), topicQueueAgain());
        messageListenerContainer.setConcurrentConsumers(1);
        messageListenerContainer.setMaxConcurrentConsumers(5);
        messageListenerContainer.setAcknowledgeMode(AcknowledgeMode.AUTO);
        messageListenerContainer.setConsumerTagStrategy(queue -> queue + "_" + UUID.randomUUID().toString());


        MessageListenerAdapter listenerAdapter = new MessageListenerAdapter(new MessageDelegate());
        listenerAdapter.setDefaultListenerMethod("consumerMessage");

        messageListenerContainer.setMessageListener(listenerAdapter);
        return messageListenerContainer;

byte[] 和 String 间的转换器

public class TextMessageConverter implements MessageConverter {

    @Override
    public Message toMessage(Object obj, MessageProperties messageProperties) throws MessageConversionException {
        return new Message(obj.toString().getBytes(), messageProperties);
    }

    @Override
    public Object fromMessage(Message message) throws MessageConversionException {
        String contentType = message.getMessageProperties().getContentType();
        if(contentType !=null && contentType.contains("text")){
            return new String(message.getBody());
        }
        return message.getBody();
    }
}

  添加String接受方法

    public void consumerMessage(String messageBody) {
        log.info("字符串方法 消息内容:" + messageBody);
    }
    @Bean
    public SimpleMessageListenerContainer messageListenerContainer(ConnectionFactory connectionFactory) {
        SimpleMessageListenerContainer messageListenerContainer = new SimpleMessageListenerContainer(connectionFactory);
        messageListenerContainer.setQueues(topicQueue(), topicQueueAgain());
        messageListenerContainer.setConcurrentConsumers(1);
        messageListenerContainer.setMaxConcurrentConsumers(5);
        messageListenerContainer.setAcknowledgeMode(AcknowledgeMode.AUTO);
        messageListenerContainer.setConsumerTagStrategy(queue -> queue + "_" + UUID.randomUUID().toString());

        MessageListenerAdapter listenerAdapter = new MessageListenerAdapter(new MessageDelegate());
        listenerAdapter.setDefaultListenerMethod("consumerMessage");
        listenerAdapter.setMessageConverter(new TextMessageConverter());
        messageListenerContainer.setMessageListener(listenerAdapter);
        return messageListenerContainer;
}

  测试

    @Test
    public void sendMessage(){
        MessageProperties messageProperties = new MessageProperties();
        messageProperties.getHeaders().put("desc","自定义描述");
        messageProperties.getHeaders().put("type","自定义类型");
        messageProperties.setContentType("text/plain");
        Message message = new Message("hello message".getBytes(), messageProperties);

        rabbitTemplate.convertAndSend("topic.exchange","user.abc",message);
    }

  不同队列由不同方法消费

@Slf4j
public class MessageDelegate {

    public void method1(String messageBody) {
        log.info("method1收到的消息:" + messageBody);
    }

    public void method2(String messageBody) {
        log.info("method2收到的消息:" + messageBody);
    }
}
    @Bean
    public SimpleMessageListenerContainer messageListenerContainer(ConnectionFactory connectionFactory) {
        SimpleMessageListenerContainer messageListenerContainer = new SimpleMessageListenerContainer(connectionFactory);
        messageListenerContainer.setQueues(topicQueue(), topicQueueAgain());
        messageListenerContainer.setConcurrentConsumers(1);
        messageListenerContainer.setMaxConcurrentConsumers(5);
        messageListenerContainer.setAcknowledgeMode(AcknowledgeMode.AUTO);
        messageListenerContainer.setConsumerTagStrategy(queue -> queue + "_" + UUID.randomUUID().toString());

        MessageListenerAdapter listenerAdapter = new MessageListenerAdapter(new MessageDelegate());
        listenerAdapter.setMessageConverter(new TextMessageConverter());
        Map<String,String> queueOrTagToMethod=new HashMap<>();
        queueOrTagToMethod.put("topic.queue","method1");
        queueOrTagToMethod.put("topic.again","method2");

        listenerAdapter.setQueueOrTagToMethodName(queueOrTagToMethod);
        messageListenerContainer.setMessageListener(listenerAdapter);
        return messageListenerContainer;
}

  发送JSON使用Map接受消息

@Slf4j
public class MessageDelegate {

    public void consumerMessage(Map messageBody) {
        log.info("消息的内容:" + messageBody);
    }
}

  添加消息转换器

    @Bean
    public SimpleMessageListenerContainer messageListenerContainer(ConnectionFactory connectionFactory) {
        SimpleMessageListenerContainer messageListenerContainer = new SimpleMessageListenerContainer(connectionFactory);
        messageListenerContainer.setQueues(topicQueue(), topicQueueAgain());
        messageListenerContainer.setConcurrentConsumers(1);
        messageListenerContainer.setMaxConcurrentConsumers(5);
        messageListenerContainer.setAcknowledgeMode(AcknowledgeMode.AUTO);
        messageListenerContainer.setConsumerTagStrategy(queue -> queue + "_" + UUID.randomUUID().toString());

        MessageListenerAdapter listenerAdapter = new MessageListenerAdapter(new MessageDelegate());
        listenerAdapter.setDefaultListenerMethod("consumerMessage");
        Jackson2JsonMessageConverter jackson2JsonMessageConverter = new Jackson2JsonMessageConverter();
        listenerAdapter.setMessageConverter(jackson2JsonMessageConverter);
        messageListenerContainer.setMessageListener(listenerAdapter);
        return messageListenerContainer;
}

  测试

    @Test
    public void sendJSONMessage(){
        Order order = new Order();
        order.setId("0001");
        order.setName("放飞梦想");
        order.setContent("不服就干");
        String str = JSON.toJSONString(order);
        MessageProperties messageProperties = new MessageProperties();
        messageProperties.setContentType("application/json");
        Message message = new Message(str.getBytes(), messageProperties);

        rabbitTemplate.convertAndSend("topic.exchange","user.abc",message);
    }

  JSON转换成JAVA对象

  处理方法

    public void consumerMessage(Order order) {
        log.info("order对象,消息的内容,id:" + order.getId() + "name:" + order.getName() + " content:" + order.getContent());
    }

  配置DefaultJackson2JavaTypeMapper将JSON转为JAVA对象

    @Bean
    public SimpleMessageListenerContainer messageListenerContainer(ConnectionFactory connectionFactory) {
        SimpleMessageListenerContainer messageListenerContainer = new SimpleMessageListenerContainer(connectionFactory);
        messageListenerContainer.setQueues(topicQueue(), topicQueueAgain());
        messageListenerContainer.setConcurrentConsumers(1);
        messageListenerContainer.setMaxConcurrentConsumers(5);
        messageListenerContainer.setAcknowledgeMode(AcknowledgeMode.AUTO);
        messageListenerContainer.setConsumerTagStrategy(queue -> queue + "_" + UUID.randomUUID().toString());

        MessageListenerAdapter listenerAdapter = new MessageListenerAdapter(new MessageDelegate());
        listenerAdapter.setDefaultListenerMethod("consumerMessage");
        Jackson2JsonMessageConverter jackson2JsonMessageConverter = new Jackson2JsonMessageConverter();
        DefaultJackson2JavaTypeMapper javaTypeMapper = new DefaultJackson2JavaTypeMapper();
        javaTypeMapper.setTrustedPackages("com.smart.domain");
        jackson2JsonMessageConverter.setJavaTypeMapper(javaTypeMapper);
        listenerAdapter.setMessageConverter(jackson2JsonMessageConverter);
        messageListenerContainer.setMessageListener(listenerAdapter);
        return messageListenerContainer;
}

  pdf转换器

@Slf4j
public class PDFMessageConverter implements MessageConverter {
    @Override
    public Message toMessage(Object o, MessageProperties messageProperties) throws MessageConversionException {
        throw new MessageConversionException(" convert error ! ");
    }

    @Override
    public Object fromMessage(Message message) throws MessageConversionException {
        log.info("-----------pdfMessageConverter---------------");
        byte[] body = message.getBody();
        String fileName = UUID.randomUUID().toString();
        String path = "d:/test/" + fileName + ".pdf";
        File file = new File(path);

        try {
            Files.copy(new ByteArrayInputStream(body), file.toPath());
        } catch (IOException e) {
            e.printStackTrace();
        }
        return file;
    }
}

  图片转换器

@Slf4j
public class ImageMessageConverter implements MessageConverter {
    @Override
    public Message toMessage(Object o, MessageProperties messageProperties) throws MessageConversionException {
        throw new MessageConversionException(" convert error ! ");
    }

    @Override
    public Object fromMessage(Message message) throws MessageConversionException {
        log.info("------------imageMessageConverter-------------------");

        Object _extName = message.getMessageProperties().getHeaders().get("extName");
        String extName = _extName == null ? "png" : _extName.toString();
        byte[] messageBody = message.getBody();
        String fileName = UUID.randomUUID().toString();
        String filePrefix = "d:/test/";
        File fileDir = new File(filePrefix);
        if (!fileDir.exists()) {
            fileDir.mkdirs();
        }
        String path = filePrefix + fileName + "." + extName;
        File file = new File(path);
        try {
            Files.copy(new ByteArrayInputStream(messageBody), file.toPath());
        } catch (IOException e) {
            e.printStackTrace();
        }
        return file;
    }
}

  整合多个转化器

    @Bean
    public SimpleMessageListenerContainer messageListenerContainer(ConnectionFactory connectionFactory) {
        SimpleMessageListenerContainer messageListenerContainer = new SimpleMessageListenerContainer(connectionFactory);
        messageListenerContainer.setQueues(topicQueue(), topicQueueAgain());
        messageListenerContainer.setConcurrentConsumers(1);
        messageListenerContainer.setMaxConcurrentConsumers(5);
        messageListenerContainer.setAcknowledgeMode(AcknowledgeMode.AUTO);
        messageListenerContainer.setConsumerTagStrategy(queue -> queue + "_" + UUID.randomUUID().toString());

        MessageListenerAdapter listenerAdapter = new MessageListenerAdapter(new MessageDelegate());
        listenerAdapter.setDefaultListenerMethod("consumerMessage");
        ContentTypeDelegatingMessageConverter messageConverter = new ContentTypeDelegatingMessageConverter();

        ImageMessageConverter imageMessageConverter = new ImageMessageConverter();
        messageConverter.addDelegate("image/png", imageMessageConverter);
        messageConverter.addDelegate("image", imageMessageConverter);

        PDFMessageConverter pdfMessageConverter = new PDFMessageConverter();
        messageConverter.addDelegate("application/pdf", pdfMessageConverter);

        listenerAdapter.setMessageConverter(messageConverter);
        messageListenerContainer.setMessageListener(listenerAdapter);
        return messageListenerContainer;
    }

}

  定义文件的消费方法

public class MessageDelegate {

    public void consumeMessage(File file) {
        System.err.println("文件对象 方法, 消息内容:" + file.getName());
    }

}

  测试

    @Test
    public void sendExtMessage() throws IOException {
        byte[] body = Files.readAllBytes(Paths.get("d:/", "cc.jpg"));
        MessageProperties messageProperties = new MessageProperties();
        messageProperties.setContentType("image/png");
        messageProperties.getHeaders().put("extName","png");
        Message message = new Message(body, messageProperties);
        rabbitTemplate.send("topic.exchange","user.ddd",message);
    }

 

 

 

 
posted on 2020-01-05 20:52  溪水静幽  阅读(2058)  评论(0)    收藏  举报