我正在使用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();