Java Springboot RabbitMQ未接收匿名队列

Java Springboot RabbitMQ未接收匿名队列,java,spring,spring-boot,rabbitmq,spring-rabbit,Java,Spring,Spring Boot,Rabbitmq,Spring Rabbit,我正在尝试创建一个扇出交换,每个人都将从发布者那里接收消息。我这里的问题是,在队列中发布的消息无法被侦听器拾取。设置的队列都是随应用程序实例一起消失的匿名队列。发布服务器和订阅服务器位于同一应用程序中。非常感谢您的帮助 队列配置: @Value("${apcp.rabbitmq.refresh-exchange}") private String fanoutExchangeName; @Autowired Queue anonQueue; @Bean("amqp-admin") @Post

我正在尝试创建一个扇出交换,每个人都将从发布者那里接收消息。我这里的问题是,在队列中发布的消息无法被侦听器拾取。设置的队列都是随应用程序实例一起消失的匿名队列。发布服务器和订阅服务器位于同一应用程序中。非常感谢您的帮助

队列配置:

@Value("${apcp.rabbitmq.refresh-exchange}")
private String fanoutExchangeName;

@Autowired
Queue anonQueue; 
@Bean("amqp-admin")
@PostConstruct
public AmqpAdmin AMQPAdmin(){
    log.info(connectionFactory.toString());
    AmqpAdmin amqpAdmin = new RabbitAdmin(connectionFactory);
    return amqpAdmin;
}
@Bean
@PostConstruct
public String initRefreshAmqp(){
    setupFanOutExchange();
    return "";
}
public void setupFanOutExchange(){
    AmqpAdmin amqpAdmin =  new RabbitAdmin(connectionFactory);
    FanoutExchange exchange = new FanoutExchange(fanoutExchangeName);
    amqpAdmin.declareExchange(exchange);
    Queue queue = new Queue(anonQueue, false, true, true);
    amqpAdmin.declareQueue(queue);
    amqpAdmin.declareBinding(BindingBuilder.bind(queue).to(exchange));
}
出版者

@RequestMapping(value = "/publish")
public String publish(String message){
    rabbitTemplate.convertAndSend(exchangeName, message);
    return "";
}
订户配置

@Bean
@PostConstruct
public SimpleRabbitListenerContainerFactory listenerFactory() {
    log.info("CONNECTIONS:"+connectionFactory.toString());
    SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
    factory.setConnectionFactory(connectionFactory);
    factory.setMessageConverter(jsonMessageConverter());
    return factory;
}
订户侦听器

@RabbitListener(queues = "#{anonQueue.name}", containerFactory = "listenerFactory")
public void receiverQueue(String message){
    log.info(message);
}
1) 没有这样的方法:

rabbitTemplate.convertAndSend(exchangeName, message);
双参数方法是

public void convertAndSend(String routingKey, final Object object) throws AmqpException {
所以代理正在删除你的消息

2) 您不能在bean定义中调用管理方法(或执行任何涉及代理的操作)

3) 您的配置比需要的复杂得多

这个很好用

@SpringBootApplication
public class So49854747Application {

    public static void main(String[] args) {
        SpringApplication.run(So49854747Application.class, args).close();
    }

    @Bean
    public ApplicationRunner runner(RabbitTemplate template, FanoutExchange exchange) {
        return args -> {
            template.convertAndSend(exchange.getName(), "", "foo");
            Thread.sleep(10_000);
        };
    }

    @Bean
    public Queue anonQueue() {
        return new AnonymousQueue();
    }

    @Bean
    public FanoutExchange exchange() {
        return new FanoutExchange("so49854747");
    }

    @Bean
    public Binding binding() {
        return BindingBuilder.bind(anonQueue()).to(exchange());
    }

    @RabbitListener(queues = "#{anonQueue.name}")
    public void listen(String in) {
        System.out.println(in);
    }

}


每个侦听器有一个队列吗?对我来说,你需要的似乎更像是发布/订阅式的通信。谢谢你,这个解决方案确实有助于本地接收,但在我将应用程序部署到pcf云时,似乎无法创建匿名队列。我将在这部分工作,但非常感谢解决方案
2018-04-16 09:01:54.620  INFO 50389 --- [           main] com.example.So49854747Application        : Started So49854747Application in 1.407 seconds (JVM running for 1.909)
foo