alibaba/spring-ai-alibaba · error · RuntimeException

Failed to send delayed message

Error message

Failed to send delayed message

What it means

MqProducerManager.sendDelay wraps failures from the synchronous send of a delayed message whose deliveryTimestamp was set to now + delaySeconds. Fires on broker/network errors or if the delay timestamp violates broker constraints.

Solutions

  1. Ensure delaySeconds keeps deliveryTimestamp within broker-allowed range
  2. Retry the send with backoff
  3. Check MQ broker availability and delayed-message support/quotas
Defensive patterns

Strategy: retry

When it happens

Trigger: Thrown at spring-ai-alibaba-admin/spring-ai-alibaba-admin-server-core/src/main/java/com/alibaba/cloud/ai/studio/core/base/mq/MqProducerManager.java:88 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of alibaba/spring-ai-alibaba@f82da0b50f (2026-09-09). Data as JSON: /api/errors/b8e8198af4247591. Report an issue: GitHub.

Appendix: source

Thrown at spring-ai-alibaba-admin/spring-ai-alibaba-admin-server-core/src/main/java/com/alibaba/cloud/ai/studio/core/base/mq/MqProducerManager.java:88

	/**
	 * Sends a delayed message synchronously
	 * @param producer MQ producer instance
	 * @param message Message to be sent
	 * @param delaySeconds Delay time in seconds
	 * @return Send result containing message ID
	 */
	public SendResult sendDelay(Producer producer, MqMessage message, int delaySeconds) {
		try {
			// 计算延迟时间戳
			long deliveryTimestamp = System.currentTimeMillis() + (delaySeconds * 1000L);
			message.setDeliveryTimestamp(deliveryTimestamp);

			SendReceipt sendReceipt = producer.send(buildMessage(message));
			return SendResult.builder().messageId(sendReceipt.getMessageId().toString()).build();
		}
		catch (Exception e) {
			log.error("Failed to send delayed message, topic: {}, delay: {}s", message.getTopic(), delaySeconds, e);
			throw new RuntimeException("Failed to send delayed message", e);
		}
	}

	/**
	 * Sends messages asynchronously with callback
	 * @param producer MQ producer instance
	 * @param messages List of messages to be sent
	 * @param callback Callback to handle send results
	 */
	public void sendAsync(Producer producer, List<MqMessage> messages, SendCallback callback) {
		try {
			List<CompletableFuture<SendReceipt>> futures = new ArrayList<>();
			for (MqMessage message : messages) {
				CompletableFuture<SendReceipt> future = producer.sendAsync(buildMessage(message));
				futures.add(future);
			}

			for (CompletableFuture<SendReceipt> future : futures) {

View on GitHub (pinned to f82da0b50f)