我正在使用RabbitMQ 3.7和插件rabbitmq_message_timestamp,该插件在消息首次进入RabbitMQ时添加了时间戳(用于监视)。

timestamp是可访问的,例如通过RabbitMQ Management HTTP API

如何将其转换为Java LocalDateTime以查找等待时间过长的消息?

编辑

使用@ nicolae-natea技巧的示例看门狗代码:

public class QueueState {
    private static final int ALARMING_PROCESSING_TIME_IN_SECONDS = 5 * 60;
    private static final int ALARMING_MESSAGE_TRAFFIC_JAM_LENGTH = 20;
    private final QueueId qid;
    private int messagesCount = 0;
    private Long headMessageTimestamp = null;

    @JsonCreator
    public QueueState(
            @JsonProperty("vhost") String vhost,
            @JsonProperty("name") String name,
            @JsonProperty("messages") Integer messagesCount,
            @JsonProperty("head_message_timestamp") Long headMessageTimestamp
    ) {
        this.qid = new QueueId(vhost, name);
        this.messagesCount = messagesCount == null ? 0 : messagesCount;
        this.headMessageTimestamp = headMessageTimestamp;
    }

    public boolean isAlarmingState() {
        return (messagesCount == -1)
               || (messagesCount > ALARMING_MESSAGE_TRAFFIC_JAM_LENGTH)
               || isHeadMessageWaitingTooLong();
    }

    private boolean isHeadMessageWaitingTooLong() {
        if ((messagesCount > 0) && (headMessageTimestamp != null)) {
            long nowTs = ZonedDateTime.now(ZoneOffset.UTC).toEpochSecond();
            long thresholdTs = headMessageTimestamp + ALARMING_PROCESSING_TIME_IN_SECONDS;
            return nowTs > thresholdTs;
        }
        return false;
    }
}

最佳答案

时间戳以秒(或ms:https://github.com/rabbitmq/rabbitmq-message-timestamp/issues/16)提供,因此您可以使用:

LocalDateTime dateTime = LocalDateTime.ofEpochSecond(seconds, 0, ZoneOffset.UTC)


另一方面,您可以获取当前纪元并进行检查,而不是转换rabbitmq提供的时间戳,该时间戳应类似于:

long epoch = whateverThresholdDateTime.toEpochSecond();

10-02 00:07
查看更多