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
- Ensure delaySeconds keeps deliveryTimestamp within broker-allowed range
- Retry the send with backoff
- 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)