Java 杂谈springboot

spring-boot-starter-amqp 那些文档里没告

2018-09-13  本文已影响46人  黄大海

spring-boot 非常简便,但是文档不全、背后隐藏了大量配置细节、门槛比较高。这就需要阅读源码才能随心所欲得使用。下面配合源码来解释下官方文档中配置背后的原理。

启动配置路径:一个入口拉出一串螃蟹。配置都在这几个类里,之后还会提到。

首先是AMQP三大件的申明,这段代码有啥用?

@SpringBootApplication
public class Application {
    @Bean
    Queue queue() {
        return new Queue(queueName, false);
    }

    @Bean
    TopicExchange exchange() {
        return new TopicExchange(topicExchangeName);
    }

    @Bean
    Binding binding(Queue queue, TopicExchange exchange) {
        return BindingBuilder.bind(queue).to(exchange).with("foo.bar.#");
    }
    ...
}

    @Override
    public void afterPropertiesSet() {
        ...
        this.connectionFactory.addConnectionListener(new ConnectionListener() {
            @Override
            public void onCreate(Connection connection) {
                initialize();
            }
        })
        ...
    }
public void initialize() {
    ...
    this.rabbitTemplate.execute(new ChannelCallback<Object>() {
        @Override
        public Object doInRabbit(Channel channel) throws Exception {
            declareExchanges(channel, exchanges.toArray(new Exchange[exchanges.size()]));
            declareQueues(channel, queues.toArray(new Queue[queues.size()]));
            declareBindings(channel, bindings.toArray(new Binding[bindings.size()]));
            return null;
        }
    });
    ...
}
   @Bean
    SimpleMessageListenerContainer container(ConnectionFactory connectionFactory,
            MessageListenerAdapter listenerAdapter) {
        SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        container.setQueueNames(queueName);
        container.setMessageListener(listenerAdapter);
        return container;
    }

    @Bean
    MessageListenerAdapter listenerAdapter(Receiver receiver) {
        return new MessageListenerAdapter(receiver, "receiveMessage");
    }
@Component
@RabbitListener(queues = "${queue.name}")
public class Receiver {
    @RabbitHandler
    public void process(@Payload String body, @Header(AmqpHeaders.RECEIVED_ROUTING_KEY) String routingKey) {
        
    }
}
@Component
@RabbitListener(queues = "${queue.name}")
public class Receiver {
    @RabbitHandler
    public void process(@Payload String stringBody, @Header(AmqpHeaders.RECEIVED_ROUTING_KEY) String routingKey) {
        
    }
    
    @RabbitHandler
    public void process(@Payload Integer intBody) {
        
    }
    
    @RabbitHandler
    public void process(@Payload Long longBody) {
        
    }
}
上一篇 下一篇

猜你喜欢

热点阅读