Java RabbitMQ交换和队列不是自动创建的
我创建了一个新的spring应用程序,它将消息推送到rabbitmq服务器。 我的rabbitMQConfig java文件如下所示:Java RabbitMQ交换和队列不是自动创建的,java,rabbitmq,spring-amqp,spring-rabbit,Java,Rabbitmq,Spring Amqp,Spring Rabbit,我创建了一个新的spring应用程序,它将消息推送到rabbitmq服务器。 我的rabbitMQConfig java文件如下所示: @Configuration public class RabbitMQConfig { private static final Logger LOGGER = LoggerFactory.getLogger(RabbitMQConfig.class); @Value("${spring.rabbitmq.host}") priva
@Configuration
public class RabbitMQConfig {
private static final Logger LOGGER = LoggerFactory.getLogger(RabbitMQConfig.class);
@Value("${spring.rabbitmq.host}")
private String SPRING_RABBITMQ_HOST;
@Value("${spring.rabbitmq.port}")
private int SPRING_RABBITMQ_PORT;
@Value("${spring.rabbitmq.username}")
private String SPRING_RABBITMQ_USERNAME;
@Value("${spring.rabbitmq.password}")
private String SPRING_RABBITMQ_PASSWORD;
@Bean
public RabbitTemplate rabbitTemplate(){
CachingConnectionFactory connectionFactory = new CachingConnectionFactory(SPRING_RABBITMQ_HOST,SPRING_RABBITMQ_PORT);
connectionFactory.setUsername(SPRING_RABBITMQ_USERNAME);
connectionFactory.setPassword(SPRING_RABBITMQ_PASSWORD);
RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
rabbitTemplate.setExchange("my.controller.exchange");
rabbitTemplate.setRoutingKey("my.controller.key");
return rabbitTemplate;
}
@Bean
DirectExchange exchange() {
return new DirectExchange("my.controller.exchange", true, false);
}
@Bean
public Queue queue() {
return new Queue("my.controller", true);
}
@Bean
Binding exchangeBinding(DirectExchange exchange, Queue queue) {
return BindingBuilder.bind(queue).to(exchange).with("my.controller.key");
}
}
以下是我将消息推送到队列的方式:
@Service
public class RabbitPublisher {
@Autowired
private RabbitTemplate rabbitTemplate;
private static Logger LOGGER = Logger.getLogger(RabbitPublisher.class);
public Boolean pushToMyQueue(HashMap<String, Object> message) {
try {
rabbitTemplate.convertAndSend("my.controller.exchange","my.controller.key",message);
return true;
} catch (Exception e) {
e.printStackTrace();
LOGGER.error("Error in pushing to my queue", e);
}
return false;
}
}
@服务
公共类兔子出版商{
@自动连线
私人兔样板兔样板;
私有静态记录器=Logger.getLogger(RabbitPublisher.class);
公共布尔pushToMyQueue(HashMap消息){
试一试{
rabbitTemplate.convertAndSend(“my.controller.exchange”、“my.controller.key”、消息);
返回true;
}捕获(例外e){
e、 printStackTrace();
LOGGER.error(“推到我的队列时出错”,e);
}
返回false;
}
}
因为交换和队列在rabbitmq服务器上不存在,所以我希望自动创建它们并推送消息。但它会导致以下错误:
ERROR 18198 --- [168.201.18:5672] o.s.a.r.c.CachingConnectionFactory :
Channel shutdown: channel error; protocol method: #method<channel.close>
(reply-code=404, reply-text=NOT_FOUND - no exchange
'my.controller.exchange' in vhost '/', class-id=60, method-id=40)
错误18198---[168.201.18:5672]o.s.a.r.c.CachingConnectionFactory:
通道关闭:通道错误;协议方法:#方法
(回复代码=404,回复文本=未找到-无交换)
vhost“/”中的“my.controller.exchange”,类id=60,方法id=40)
当我创建exchange和队列并在服务器上手动绑定它们时,一条消息被成功推送。
如果我遗漏了什么,请告诉我。谢谢。您需要添加一个RabbitAdmin@Bean。管理员将在第一次打开连接时声明元素。您必须使用所需的连接工厂添加AmqpAdmin管理bean,如下所示:
@Bean(name = "pimAmqpAdmin")
public AmqpAdmin pimAmqpAdmin(@Qualifier("defaultConnectionFactory") ConnectionFactory connectionFactory) {
return new RabbitAdmin(connectionFactory);
}