mcpField
S
spring-amqp

spring-amqp

github.com/claude-dev-suite开发4643 次安装2 天前更新
代码仓库

关于 spring-amqp

介绍如何在 Spring 应用中使用 Spring AMQP 与 RabbitMQ 的速查技能,帮助开发者配置代理、生产和消费消息,并处理可靠性实践与故障排查。

主要功能

  1. 01Spring AMQP 依赖与配置
  2. 02交换机、队列和绑定设置
  3. 03消息生产者与消费者示例
  4. 04确认与死信队列建议
  5. 05重试与故障排查指导

适用场景

  1. 01为 Spring 应用接入 RabbitMQ 消息
  2. 02配置订单事件的生产者和消费者
  3. 03排查消息投递或序列化故障

MCP 相关

该技能引用 `mcp__documentation__fetch_docs` 获取完整的 RabbitMQ 文档。

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/claude-dev-suite/claude-dev-suite --skill spring-amqp

安装后在 Claude Code 中输入/spring-amqp确认已加载。

附带文件advanced.md

详细介绍

Spring AMQP(RabbitMQ)- 快速参考

完整参考:有关交换机类型(topic、fanout)、消费者模式(多方法、请求-回复)、错误处理、DLQ 处理和测试,请参阅 advanced.md。

深入了解:使用 mcp__documentation__fetch_docs,并将 technology 设为 rabbitmq,获取全面的文档。

依赖项

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

配置

spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest
    listener:
      simple:
        acknowledge-mode: manual
        concurrency: 3
        max-concurrency: 10
        prefetch: 10

交换机、队列和绑定设置

@Configuration
public class RabbitMQConfig {

    public static final String EXCHANGE = "orders.exchange";
    public static final String QUEUE = "orders.queue";
    public static final String ROUTING_KEY = "orders.created";

    @Bean
    public DirectExchange ordersExchange() {
        return new DirectExchange(EXCHANGE);
    }

    @Bean
    public Queue ordersQueue() {
        return QueueBuilder.durable(QUEUE)
            .withArgument("x-dead-letter-exchange", "orders.dlx")
            .withArgument("x-dead-letter-routing-key", "dead")
            .build();
    }

    @Bean
    public Binding ordersBinding() {
        return BindingBuilder.bind(ordersQueue()).to(ordersExchange()).with(ROUTING_KEY);
    }

    @Bean
    public Jackson2JsonMessageConverter messageConverter() {
        return new Jackson2JsonMessageConverter();
    }
}

生产者

@Service
@RequiredArgsConstructor
public class OrderProducer {

    private final RabbitTemplate rabbitTemplate;

    public void sendOrder(OrderEvent event) {
        rabbitTemplate.convertAndSend(EXCHANGE, ROUTING_KEY, event);
    }

    public void sendWithHeaders(OrderEvent event, String correlationId) {
        rabbitTemplate.convertAndSend(EXCHANGE, ROUTING_KEY, event, message -> {
            message.getMessageProperties().setCorrelationId(correlationId);
            message.getMessageProperties().setDeliveryMode(MessageDeliveryMode.PERSISTENT);
            return message;
        });
    }
}

消费者

@Service
public class OrderConsumer {

    @RabbitListener(queues = "orders.queue")
    public void consume(
            @Payload OrderEvent event,
            @Header(AmqpHeaders.DELIVERY_TAG) long deliveryTag,
            @Header(AmqpHeaders.CORRELATION_ID) String correlationId,
            Channel channel) throws IOException {

        try {
            processOrder(event);
            channel.basicAck(deliveryTag, false);
        } catch (Exception e) {
            channel.basicNack(deliveryTag, false, false); // Send to DLQ
        }
    }
}

最佳实践

应做不应做
使用手动确认未处理消息就自动确认
配置 DLX/DLQ静默丢弃失败的消息
设置消息 TTL永久保留消息
使用持久化投递对重要消息使用临时投递
配置预取使用不受限制的预取

不应使用此技能的情况

  • 原生 RabbitMQ - 使用 rabbitmq 技能进行服务配置
  • Kafka 集成 - 使用 spring-kafka 技能
  • 通用消息传递模式 - 请咨询 messaging-expert

反模式

反模式问题解决方案
未处理消息就自动确认消息丢失使用手动确认
未配置 DLQ失败的消息丢失配置死信交换机
预取不受限制内存问题设置合适的预取数量
在监听器中阻塞线程耗尽使用异步处理
未设置重试策略临时故障导致消息丢失配置带退避的重试

快速故障排查

问题诊断修复
连接被拒绝检查 RabbitMQ 是否正在运行验证主机/端口
消息未被消费检查队列绑定验证路由键
消息位于 DLQ 中检查 x-death 标头修复处理错误
消费者未启动检查 @RabbitListener验证队列是否存在
序列化错误检查消息类型配置 Jackson 转换器

生产环境检查清单

  • 已配置连接工厂
  • 使用手动确认模式
  • 已配置 DLX/DLQ
  • 已设置重试策略
  • 已配置消息转换器
  • 已启用发布者确认
  • 已优化预取数量
  • 已实现错误处理器
  • 已设置消息 TTL
  • 已启用监控

参考文档

评论

支持 Markdown