问题标签 [dead-letter]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
3969 浏览

jms - Spring JMS 和 ActiveMQ 在哪里查看死信队列中的消息

这是我的配置:

这是我的消费者:

因此,我将有效负载 =“启动”的消息放入队列中。

我想测试事务,如果有效负载等于“启动”,它会抛出异常。

所以感谢 redeliverypolicy,消费者尝试消费消息 5 次。在 ActiveMq 队列列表中的第五个之后,我没有看到我发送的消息。

消息放在哪里?在死信队列中?在哪里可以看到带有“启动”消息的死信队列?

谢谢。

0 投票
1 回答
3105 浏览

scala - Akka log-dead-letters 和 log-dead-letters-during-shutdown 不起作用

这是一个简单的问题,但它一直困扰着我和我的日志。

我有一个配置:

我的程序以akkaSystem.terminate()

我很确定配置已加载到系统中。我尝试了不同的组合,用falseor0代替off. 没有任何帮助,当计划的工作人员每 10 分钟停止一次时,我的日志中就会充满死信。

这适用于开发和生产环境。

0 投票
1 回答
1640 浏览

scala - 使用 Akka HTTP 客户端和 Akka Streams 的死信

我正在尝试使用 Akka HTTP 和 Akka Streams 来运行刮板。我从一堆索引页面开始,从中解析链接,然后获取每个链接并解析该页面,以返回一堆单独的链接。所以,像这样:

我的问题是我什至无法获取单个页面。我尝试获取的每个顶级 URL 都会导致一个死信,并且没有任何东西可以让它更进一步。

在这个示例代码中,我要做的就是发送HttpRequest到池中以转换为HttpResponse,并通过将内容打印到屏幕来证明它有效。

这是我得到的:

我是 Akka 的新手,显然犯了一些基本错误,因为这似乎是 Akka、Akka Streams 和 Akka HTTP 构建的确切用例。

有任何想法吗?

0 投票
2 回答
4762 浏览

amazon-web-services - 有没有办法在特定条件下从 AWS lambda 函数内部将事件消息显式发送到死信队列?

我正在尝试通过调用 AWS lambda 函数向 rabbitmq 发送 s3event 消息。我已将 SQS 配置为我的死信队列 (DLQ)。我知道当调用 lambda 失败或超时或资源限制等情况时,消息会发送到 DLQ。我的问题是,我想在特定条件下从 lambda 函数内部向 DLQ 发送事件消息,例如 rabbitmq 是否关闭或我感兴趣的其他一些条件。有没有相同的可能性?我应该抛出异常还是有其他更好的方法可以将事件消息发送到 DLQ。

我正在使用 java 进行开发并从我的 lambda 函数连接到 rabbitmq。

0 投票
1 回答
25345 浏览

java - 带有 spring-kafka 的 Kafka 死信队列 (DLQ)

使用 spring-kafka 2.1.x 在 Spring Boot 2.0 应用程序中实现死信队列 (DLQ)概念的最佳方法是什么,以便将某些 bean 的@KafkaListener方法未能处理的所有消息发送到某个预定义的 Kafka DLQ 主题并且不会丢失单个消息?

所以消耗的 Kafka 记录是:

  1. 成功处理,
  2. 处理失败,发送到DLQ主题,
  3. 处理失败,未发送到DLQ主题(由于意外问题),因此将再次被侦听器消费。

我尝试使用 KafkaTemplate 将ErrorHandler发送记录的自定义实现创建为无法处理到 DLQ 主题的侦听器容器。使用禁用的自动提交和RECORD AckMode。

似乎这个实现并不能保证 item #3。如果在 DlqErrorHandler 中抛出异常,则监听器不会再次消费该记录。

使用事务性侦听器容器会有帮助吗?

有没有使用 Spring Kafka 实现 DLQ 概念的便捷方法?

更新 2018/03/28

感谢 Gary Russell 的回答,我能够通过如下实现 DlqErrorHandler 来实现所需的行为

这样,如果消费者轮询返回 3 条记录(1、2、3)并且无法处理第二条记录:

  • 1 将被处理
  • 2 将无法处理并发送到DLQ
  • 3 感谢消费者 seek to record.offset() + 1,它将被传递给监听器

如果发送到 DLQ 失败,消费者会寻找 record.offset() 并且记录将被重新传递给侦听器(并且发送到 DLQ 可能会被停用)。

更新 2021/04/30

由于 Spring Kafka 2.7.0原生支持非阻塞重试和死信主题

查看示例:https ://github.com/evgeniy-khist/spring-kafka-non-blocking-retries-and-dlt

重试通常应该是非阻塞的(在单独的主题中完成)并延迟:

  • 不扰乱实时流量;
  • 不增加呼叫次数,本质上是垃圾请求;
  • 可观察性(获取重试次数和其他元数据)。使用 Kafka 实现非阻塞重试和 DLT 功能通常需要设置额外的主题并创建和配置相应的侦听器。 Kafka 非阻塞重试和 DLT
0 投票
1 回答
274 浏览

rabbitmq - 让 RabbitMq 按我的意愿行事(死信和错误重新排队)

我有一个简单的兔子设置,目前正在做我想做的事......

它根据消息的类型发布消息。每种类型都有自己的队列。
当消息发布时,即使没有消费者消费它们,它们也会坐在队列中(如果没有消费者到达,则永远坐在那里)。
当消费者在那里(只有一个!)时,它会吃掉消息。
如果由于某种原因它无法处理消息(例如,它在父消息到达之前获得子消息)它会将nack消息返回到队列中。

如果它看到相同的消息六次,它nack就是该消息。

这一切都有效,但目前在六次尝试后它会丢弃消息。

我想要的是将消息传递到“死信队列”,并在一段时间后(比如 5 分钟)将该消息重新排队到它来自的特定队列的末尾。

我绝对是货物崇拜程序,我不太了解所有的交换/队列/绑定/路由键和其他涉及的奥秘......感谢手持!

ISendable只需确保消息具有一些属性,用于在Data.MarkAsSent(message);我们拥有的数据库中进行标记。

接收器有一个类似的代码块来处理每种类型。正如我所说,这是有效的。

我需要做什么来添加死信队列的东西?

我这样的尝试创建了死信队列,但没有任何东西移动到它们。

在我的接收器中,我有这个魔力

呼...很多代码。谢谢,如果你已经做到了这一步......

我在问我的代码中有哪些明显的问题使事情落入死信队列。

以及我需要添加什么额外内容,以便 dlq 中的内容在一段时间后反弹回主队列。此外,这为每种类型的队列设置了一个 dlq……这是必需的还是应该有一个队列来保存错误消息?

0 投票
2 回答
866 浏览

java - 从一个队列推到另一个队列后如何拒绝消息?

使用 Spring 和 RabbitMQ,我设置了两个主题交换xdlx两个队列qdlq. q绑定到x并且dlqdlxdlx被配置为死信交换q

当一条消息q被拒绝(取消队列)时,它会成功发送到dlx,然后发送到dlq

现在我使用 shovel-plugin 将死信消息dlq移回q. 只要这次成功处理了消息(ack),这就会成功。

但是,如果这些铲入的消息之一q再次被拒绝,它就会被静默丢弃。我希望它会再次发送到 DLX dlx。是我配置错误还是误解了 DLX 或铲子的概念?

0 投票
1 回答
1170 浏览

amazon-web-services - AWS SQS Boto3 手动将消息发送到死信

所以我正在构建一个使用 SQS 的小型应用程序。我有一个简单的处理程序进程,它确定给定消息是否被视为已处理、标记为重试(重新排队)或无法处理(应发送到死信)。

然而,根据文档,似乎真正向 DL 发送消息的唯一方法是使用重新驱动策略,该策略在接收到消息的次数上运行。由于我的应用程序的性质,如果我的进程还没有准备好处理给定的消息,我可以进行几次有效的重试,但有时我可能想要对我刚刚收到的消息进行 DL。AWS/Boto3 是否不提供为 DL 标记特定消息的方法?

我知道我可以自己将消息发送到另一个我认为是我自己的 DL 的队列,我宁愿为此使用 AWS 的内置工具。

0 投票
0 回答
625 浏览

spring - MQ 消息在目标、回退和死信队列之间不断循环

我有一个队列 Q1,它的回退队列为 QB,回退阈值为 3。我正在研究处理有害消息的各种可能性,所以每当我从队列中读取消息并继续轮询队列时,我都会让我的应用程序抛出异常。Q1 的深度为 15,QB 为 5,DLQ 为 5。对于第一个场景,我在 Q1 中输入了 7 条消息并启动了应用程序。正如预期的那样,当回退计数为 3 时,每条消息都回滚到队列并移动到回退队列。在第六条消息期间,由于 QB 已满,消息移动到 DLQ,第七条消息也是如此。迷人地工作。

对于第二种情况,我需要知道当回退队列和 DLQ 都已满时会发生什么,我输入了 12 条消息并启动了应用程序,对于前 10 条消息,一切都按预期工作,5 条在回退中,5 条在 DLQ 中。接下来,它会抛出 DLQ is full 这很明显。

但是我在 MQ 资源管理器中可以观察到,这 12 条消息只是在 Q1、QB 和 DLQ 之间无限循环,当我自己停止应用程序时,所有消息都像我启动应用程序之前一样在 Q1 中结束。

完全困惑,谷歌搜索了很多,但没有找到类似的东西。

谁能指出我做错了什么或这个难题中缺少什么。

提前致谢。

0 投票
1 回答
1791 浏览

java - 无法在类 org.apache.camel.builder.DeadLetterChannelBuilder 上找到属性描述符 useOriginalBody

我正在尝试使用 deadLetterChannelBuilder 但找不到正确的属性。有谁知道它们是什么或在哪里可以找到它们?文档中的那个似乎不起作用。?

无法在类 org.apache.camel.builder.DeadLetterChannelBuilder 上找到属性描述符 useOriginalBody

我也尝试过 allowUseOriginalMessage 但正如预期的那样,它不是 deadLetterChannelBuilder 属性。