96SEO 2026-02-19 18:50 0
2.进行基本配置pom.xml、application.yml

--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-amqp/artifactId/dependency!--单元测试--dependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion4.13.2/versionscopetest/scope/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter/artifactId/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependency/dependenciesapplication.yml
消费者启动类ConsumerApplication.class
{SpringApplication.run(ConsumerApplication.class,
args);}}生产者启动类PublisherApplication.class
{org.springframework.boot.SpringApplication.run(PublisherApplication.class,
}消费者监听类SpringRabbitListerner.class
listenSimpleQueueMessage(String
msg){System.out.println(简单模式-消费者消费消息msg);}
ExtendWith(SpringExtension.class)
world;rabbitTemplate.convertAndSend(simpleQueue,message);}
ExtendWith(SpringExtension.class)
world;rabbitTemplate.convertAndSend(simpleQueue,message);}Testpublic
world..i;rabbitTemplate.convertAndSend(workQueue,message);}}Testpublic
fanout..;rabbitTemplate.convertAndSend(fanoutExchange,,message);}Testpublic
direct..;rabbitTemplate.convertAndSend(directExchange,red,message);}}
消费者监听类SpringRabbitListerner.class
listenSimpleQueueMessage(String
msg){System.out.println(简单模式-消费者消费消息msg);}RabbitListener(queues
msg){System.out.println(工作模式-消费者消费消息msg);}RabbitListener(queues
msg){System.out.println(工作模式-消费者消费消息2msg);}RabbitListener(queues
listenFanoutQueueMessage1(String
msg){System.out.println(发布订阅模式-消费者1消费消息msg);}RabbitListener(queues
listenFanoutQueueMessage2(String
msg){System.out.println(发布订阅模式-消费者2消费消息msg);}RabbitListener(queues
listenDirectQueueMessage(String
msg){System.out.println(路由模式-消费者消费消息msg);}RabbitListener(queues
listenTopicQueueMessage1(String
msg){System.out.println(路由模式-消费者1消费消息msg);}}所用到的配置类
FanoutExchange(amq.fanout);}Beanpublic
Queue(queue.fanout1);}Beanpublic
Queue(queue.fanout2);}Beanpublic
BindingBuilder.bind(queue1).to(fanoutExchange);}Beanpublic
BindingBuilder.bind(queue2).to(fanoutExchange);}}路由模式
DirectExchange(amq.direct);}Beanpublic
Queue(queue.direct1);}Beanpublic
Queue(queue.direct2);}Beanpublic
BindingBuilder.bind(queue1).to(directExchange).with(yellow);}Beanpublic
BindingBuilder.bind(queue2).to(directExchange).with(red);}}2025-6-13
生产者确认生产者发送消息---到交换机到队列---返回ack给mq生产者发送消息---没到交换机---返回nack给mq生产者发送消息---到交换机没到队列---返回ack触发回调模块剥离代码部分
HH:mm:ss.SSSlevel:com.example.demo:
同步等待confirm结果直到超时correlated异步回调定义confirmcollback,MQ返回结果时会回调ConfirmCallbackpublisher-returns:
功能同样是基于callback机制不过是定义ReturnCallbacktemplate:mandatory:
定义消息路由失败时的策略。
true则调用ReturnCallbackfalse则直接丢弃消息
org.springframework.amqp.rabbit.connection.CorrelationData;
org.springframework.amqp.rabbit.core.RabbitTemplate;
org.springframework.beans.factory.annotation.Autowired;
org.springframework.boot.test.context.SpringBootTest;
org.springframework.test.context.junit4.SpringRunner;
java.util.UUID;RunWith(SpringRunner.class)
simpleSendMessage(){//1.准备消息String
amqp;//2.准备CorrelationDate//2.1消息idCorrelationData
CorrelationData(UUID.randomUUID().toString());//2.2准备ConfirmCallbackrabbitTemplate.setConfirmCallback((correlationData1,
cause);}});rabbitTemplate.convertAndSend(amq.direct,yellow,msg,correlationData);}
org.springframework.amqp.rabbit.core.RabbitTemplate;
org.springframework.beans.BeansException;
org.springframework.context.ApplicationContext;
org.springframework.context.ApplicationContextAware;
org.springframework.context.annotation.Configuration;Slf4j
setApplicationContext(ApplicationContext
applicationContext.getBean(RabbitTemplate.class);//配置
当发送者发送消息到MQMQ返回失败会调用此方法记住是路由发送失败rabbitTemplate.setReturnsCallback(msg
路由key{},msg.getReplyCode(),msg.getReplyText(),msg.getExchange(),msg.getRoutingKey());});}
2.手动处理try-catch然后自己捕捉异常捕捉到了返回给mq服务器nack
#关闭ackMQ假定消费者获取消息后会成功处理。
因此消息投递后立即被删除acknowledge-mode:
#自动ack模式由spring检测listener代码是否出现异常没有异常则返回ack有异常则返回nack#acknowledge-mode:
#手动ack,需要在业务代码结束后调用api发送ackretry:enabled:
org.springframework.amqp.core.Binding;
org.springframework.amqp.core.DirectExchange;
org.springframework.amqp.core.Queue;
org.springframework.amqp.rabbit.core.RabbitTemplate;
org.springframework.amqp.rabbit.retry.MessageRecoverer;
org.springframework.amqp.rabbit.retry.RepublishMessageRecoverer;
org.springframework.context.annotation.Bean;
org.springframework.context.annotation.Configuration;Configuration
DirectExchange(error.direct);}Beanpublic
Binding(error.queue,Binding.DestinationType.QUEUE,error.direct,error,null);}Beanpublic
republicMessageRecoverer(RabbitTemplate
RepublishMessageRecoverer(rabbitTemplate,
初始死信交换机当一个队列中的消息满足下列情况之一时可以成为死信dead
1、消费者使用basic.reject或basic.nack声明消费失败并且消息的requeue的参数设置为false
如果该队列配置了dead-letter-exchange属性指定了一个交换机那么队列中的死信就会投递到这个交换机这个交换机称为死信交换机Dead
TTL也就是Time-To-Live。
如果一个队列中的消息TTL结束仍未消费则会变成死信ttl超时分为两种情况
msg){log.info(测试死信队列接收到了延迟消息消息内容为{}msg);}
然后建立延迟交换机和延迟队列的绑定在延迟队列上再绑定死信交换机
org.springframework.amqp.core.*;
org.springframework.context.annotation.Bean;
org.springframework.context.annotation.Configuration;Configuration
DirectExchange(ttl.direct);}Beanpublic
QueueBuilder.durable(ttl.queue).ttl(10000).deadLetterExchange(dl.direct).deadLetterRoutingKey(dl).build();}Beanpublic
BindingBuilder.bind(ttlQueue).to(ttlExchange).with(ttl);}
org.springframework.amqp.core.Message;
org.springframework.amqp.core.MessageBuilder;
org.springframework.amqp.core.MessageDeliveryMode;
org.springframework.amqp.rabbit.connection.CorrelationData;
org.springframework.amqp.rabbit.core.RabbitTemplate;
org.springframework.beans.factory.annotation.Autowired;
org.springframework.boot.test.context.SpringBootTest;
org.springframework.test.context.junit4.SpringRunner;import
java.nio.charset.StandardCharsets;
java.util.UUID;RunWith(SpringRunner.class)
testTTLMessage(){//1.准备消息Message
amqp.getBytes(StandardCharsets.UTF_8))//.setExpiration(5000)
设置延迟时间.setDeliveryMode(MessageDeliveryMode.PERSISTENT).build();//2.发送消息rabbitTemplate.convertAndSend(ttl.direct,ttl,message);}
然后再指定时间没有人消息该消息消息自动转为死信并进入指定的延迟队列
1.我发送消息的前提是我mq里面得有已经建好的队列和交换机以及它们之间的绑定关系所以我应该是先启动消费者的启动类将这些交换机和队列存到bean工厂里面去。
形成对象并且在mq里面呈现出来
3.我项目如果是就是一个单一的项目不涉及微服务不分那么多微服务模块这个时候我应该怎么写。
消息堆积问题1.当生产者发送消息的速度超过了消费者处理消息的速度就会导致队列中的消息堆积直到队列存储消息达到上限。
最早接收到的消息可能成为死信会被丢弃这就是消息堆积问题。
2.解决消息堆积有三种思路1、增加更多消费者提高消费者消费速度就是5种模式的第二种--工作者模式work2、在消费者内开启线程池加快消息处理速度3、扩大队列容积提高堆积上限3.惰性队列特征1、接收到消息后直接存入磁盘而非内存2、消费者要消费消息时才会从磁盘中读取并加载到内存3、支持数百万条的消息存储惰性队列
org.springframework.amqp.core.Queue;
org.springframework.amqp.core.QueueBuilder;
org.springframework.context.annotation.Bean;
org.springframework.context.annotation.Configuration;Configuration
QueueBuilder.durable(lazy.queue).lazy().build();}Beanpublic
QueueBuilder.durable(normal.queue).build();}}
amqp.getBytes(StandardCharsets.UTF_8)).setDeliveryMode(MessageDeliveryMode.NON_PERSISTENT).build();rabbitTemplate.convertAndSend(lazy.queue,message);}}Testpublic
testNormalMessage(){//2.发送消息for
amqp.getBytes(StandardCharsets.UTF_8)).setDeliveryMode(MessageDeliveryMode.NON_PERSISTENT).build();rabbitTemplate.convertAndSend(normal.queue,message);}}lazy队列的话他是直接发送到磁盘的不进内存
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback