发送到 dql 时 RabbitMQ 抛出异常(最大值 frame_size)
RabbitMQ throw exception when send to dql (max frame_size)
当我收到来自 queue 的消息时,如果抛出异常,我想再次收到消息。
所以,我用 dql queue:
创建了我的消费者
spring:
cloud:
stream:
bindings:
to-send-output:
destination: to-send-event
producer:
required-groups:
- to-send-event-group
to-send-input:
destination: to-send-event
group: to-send-event-group
consumer:
max-attempts: 1
requeueRejected: true
rabbit:
bindings:
#forever retry
to-send-input:
consumer:
autoBindDlq: true
dlqTtl: 5000
dlqDeadLetterExchange:
maxConcurrency: 300
frameMaxHeadroom: 25000 #added this as in documentation
我按照 documentation 中的说明添加了 属性 frameMaxHeadroom: 25000
,但它仍然不起作用。
我的springCloudVersion="Hoxton.RELEASE"
.
我的依赖:
dependencies {
...
implementation "org.springframework.cloud:spring-cloud-starter-stream-rabbit"
...
}
在 github 的存储库中,我在 属性 文件中看到 frameMaxHeadroom
属性。
UPD:我看到 code 将堆栈跟踪减少了我设置的值(来自变量 frameMaxHeadroom
)。我预计我不会减少堆栈跟踪,但会增加 headers 消费者的价值,如文档中所写。为什么它在我等待时不起作用?
frameMax
是amqp客户端和服务端协商的;所有 header 必须适合一帧。您可以通过代理配置来增加它。
堆栈跟踪可能很大,很容易单独超过 frameMax
;为了给其他 header 留出空间,框架为其他 header 留出至少 20,000 个字节(默认情况下),必要时通过截断堆栈跟踪 header。
如果你超过了你的 frameMax
,你必须有其他大的 headers - 你需要增加净空以允许那些 headers,所以堆栈跟踪是进一步截断。
当我收到来自 queue 的消息时,如果抛出异常,我想再次收到消息。 所以,我用 dql queue:
创建了我的消费者spring:
cloud:
stream:
bindings:
to-send-output:
destination: to-send-event
producer:
required-groups:
- to-send-event-group
to-send-input:
destination: to-send-event
group: to-send-event-group
consumer:
max-attempts: 1
requeueRejected: true
rabbit:
bindings:
#forever retry
to-send-input:
consumer:
autoBindDlq: true
dlqTtl: 5000
dlqDeadLetterExchange:
maxConcurrency: 300
frameMaxHeadroom: 25000 #added this as in documentation
我按照 documentation 中的说明添加了 属性 frameMaxHeadroom: 25000
,但它仍然不起作用。
我的springCloudVersion="Hoxton.RELEASE"
.
我的依赖:
dependencies {
...
implementation "org.springframework.cloud:spring-cloud-starter-stream-rabbit"
...
}
在 github 的存储库中,我在 属性 文件中看到 frameMaxHeadroom
属性。
UPD:我看到 code 将堆栈跟踪减少了我设置的值(来自变量 frameMaxHeadroom
)。我预计我不会减少堆栈跟踪,但会增加 headers 消费者的价值,如文档中所写。为什么它在我等待时不起作用?
frameMax
是amqp客户端和服务端协商的;所有 header 必须适合一帧。您可以通过代理配置来增加它。
堆栈跟踪可能很大,很容易单独超过 frameMax
;为了给其他 header 留出空间,框架为其他 header 留出至少 20,000 个字节(默认情况下),必要时通过截断堆栈跟踪 header。
如果你超过了你的 frameMax
,你必须有其他大的 headers - 你需要增加净空以允许那些 headers,所以堆栈跟踪是进一步截断。