java - Apache Camel + RabbitMq - Camel 定义了自己的队列,并且不会从已定义的队列中读取

标签 java spring-boot rabbitmq apache-camel

我有一个问题,我想让 Camel-RabbitMq 从我自己定义的队列中消费。 通过 Camel 路由从队列中写入和读取是可行的,但只能通过 Camel 自己定义的队列。我似乎无法将 Camel 指向我在 RabbitMQ 上定义的队列。

基本信息

我正在通过Spring boot V2.3.0.RELEASE运行camel版本和camel-rabbitmq V3.3.0。 我的本地主机上运行着 2 个服务:

  • 在 localhost:5672 上有一个 RabbitMq v3.8.3 实例
  • 在 localhost:15672 上一个 RabbitMq 管理实例

我通过一个简单的 docker-compose 文件运行这些实例:

version: '3'
services:
  rabbitmq:
    image: "rabbitmq:3.8.3"
    ports:
      - "5672:5672"
  rabbitmq-management:
    image: "rabbitmq:3-management"
    ports:
      - "15672:15672"

在那里,我通过管理面板创建了 1 个交换器和 1 个队列:

  • 主交换
  • 队列中

Main_exchange 和 in_queue 通过路由键“in_queue_routing_key”路由键相互绑定(bind)。

问题

现在,当我尝试通过 Camel 路线连接以读取此 in_queue 时:

from("rabbitmq:main_exchange?addresses=localhost:5672" +
            "&passive=true"+
            "&autoDelete=false" +
            "&declare=false" +
            "&queue=in_queue" +
            "&routingKey=in_queue_routing_key")
    .log("received from queue")
.to("file:done");

当我通过主交换向 in_queue 发布消息时,没有任何反应。 Camel 路由不接收消息。

我尝试了以下可能的解决方案:

  • 将passive设置为true,这样RabbitMq本身就不会创建队列。

    Passive queues depend on the queue already to be available at RabbitMQ.

  • 将声明设置为 false,因此 RabbitMq 不会声明交换和队列本身。

    If the option is true, camel declare the exchange and queue name and bind them together. If the option is false, camel won’t declare the exchange and queue name on the server.

  • 写入队列有效,但这没有显示在通过管理控制台自定义的“队列中”中:

代码示例:

from("file:test")
    .log("add to route")
.to("rabbitmq:main_exchange?addresses=localhost:5672" +
            "&passive=true"+
            "&autoDelete=false" +
            "&declare=false" +
            "&queue=in_queue" +
            "&routingKey=in_queue_routing_key");

但是在重新启动消费者路由(此代码示例上方的路由)后,消费者路由确实恢复了。

所以看起来 Camel-RabbitMq 路由在其他地方定义了它的队列。我如何定义Camel路由在我自己定义的队列上消耗而不是在他自己的队列上消耗?

来源:

最佳答案

看来我发现了错误,Rabbitmq 有一个管理 + 实例镜像,而不是一个独立的管理镜像。这导致运行 2 个 RabbitMQ 实例,其中一个是我正在轮询和查看的实例,第二个是发生操作导致我找不到任何内容但应用程序仍在运行的实例。

现在这是我的 docker-compose 文件:

version: '3'
services:
  rabbitmq-with-management:
    image: "rabbitmq:3-management"
    ports:
      - "5672:5672"
      - "15672:15672"

现在一切都按预期进行。

关于java - Apache Camel + RabbitMq - Camel 定义了自己的队列,并且不会从已定义的队列中读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61970725/

相关文章:

java - JsonMappingException jackson getOriginalMessage 为 null

java - 如何为 spring-boot 应用程序设置 logging.path?

java - 双向 jpa hibernate 关系 @OneToMany @ManyToOne 失败,因为未存储父 ID

python - Python 的 ESB?

python - celery - errno 111 连接被拒绝

java - 如何正确请求运行时权限?

java - 如何用JSoup进行分页

java - 一对一和多对一实体关系之间是否存在实现差异?

java - 将相同的站点 header 添加到 JSESSIONID Spring Security

java - 在Java中确认来自不同线程的rabbitMq消息