当前位置: 首页 > news >正文

延迟消息、Elasticsearch的安装

一、延迟消息:

        

死信交换机:

延迟消息插件:

接下来我们来配置该插件

1.输入docker ps查看容器名:

2.输入docker volume ls、dockers volume inspect mq-plugins查看数据卷及其内部信息:

3.找到这个目录就可以把我们下载好的插件放进去了:

4.接下来执行命令,安装插件:

然后就可以到idea当中使用了:

基于注解方式:

@RabbitListener(bindings = @QueueBinding(value = @Queue(name = "delay.queue", durable = "true"),exchange = @Exchange(name = "delay.direct", delayed = "true"),key = "delay"
))
public void listenDelayMessage(String msg){log.info("接收到delay.queue的延迟消息:{}", msg);
}

基于@Bean的方式:

package com.itheima.consumer.config;import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Slf4j
@Configuration
public class DelayExchangeConfig {@Beanpublic DirectExchange delayExchange(){return ExchangeBuilder.directExchange("delay.direct") // 指定交换机类型和名称.delayed() // 设置delay的属性为true.durable(true) // 持久化.build();}@Beanpublic Queue delayedQueue(){return new Queue("delay.queue");}@Beanpublic Binding delayQueueBinding(){return BindingBuilder.bind(delayedQueue()).to(delayExchange()).with("delay");}
}

发送消息时,必须通过x-delay属性设定延迟时间:

@Test
void testPublisherDelayMessage() {// 1.创建消息String message = "hello, delayed message";// 2.发送消息,利用消息后置处理器添加消息头rabbitTemplate.convertAndSend("delay.direct", "delay", message, new MessagePostProcessor() {@Overridepublic Message postProcessMessage(Message message) throws AmqpException {// 添加延迟消息属性message.getMessageProperties().setDelay(5000);return message;}});
}

注意:

延迟消息插件内部会维护一个本地数据库表,同时使用Elang Timers功能实现计时。如果消息的延迟时间设置较长,可能会导致堆积的延迟消息非常多,会带来较大的CPU开销,同时延迟消息的时间会存在误差。

因此,不建议设置延迟时间过长的延迟消息

取消超时订单:

1.定义常量:无论是消息发送还是接收都是在交易服务完成,因此我们在trade-service中定义一个常量类,用于记录交换机、队列、RoutingKey等常量:

2.在trade-service模块的pom.xml中引入amqp的依赖:

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

trade-serviceapplication.yaml中添加MQ的配置:

spring:rabbitmq:host: 192.168.150.101port: 5672virtual-host: /hmallusername: hmallpassword: 123

3.修改trade-service模块的com.hmall.trade.service.impl.OrderServiceImpl类的createOrder方法,添加消息发送的代码:

4.由于MQ消息处理时需要查询支付状态,因此我们要在pay-service模块定义一个这样的接口,并提供对应的FeignClient.

PayOrderDTO代码如下:

package com.hmall.api.dto;import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;import java.time.LocalDateTime;/*** <p>* 支付订单* </p>*/
@Data
@ApiModel(description = "支付单数据传输实体")
public class PayOrderDTO {@ApiModelProperty("id")private Long id;@ApiModelProperty("业务订单号")private Long bizOrderNo;@ApiModelProperty("支付单号")private Long payOrderNo;@ApiModelProperty("支付用户id")private Long bizUserId;@ApiModelProperty("支付渠道编码")private String payChannelCode;@ApiModelProperty("支付金额,单位分")private Integer amount;@ApiModelProperty("付类型,1:h5,2:小程序,3:公众号,4:扫码,5:余额支付")private Integer payType;@ApiModelProperty("付状态,0:待提交,1:待支付,2:支付超时或取消,3:支付成功")private Integer status;@ApiModelProperty("拓展字段,用于传递不同渠道单独处理的字段")private String expandJson;@ApiModelProperty("第三方返回业务码")private String resultCode;@ApiModelProperty("第三方返回提示信息")private String resultMsg;@ApiModelProperty("支付成功时间")private LocalDateTime paySuccessTime;@ApiModelProperty("支付超时时间")private LocalDateTime payOverTime;@ApiModelProperty("支付二维码链接")private String qrCodeUrl;@ApiModelProperty("创建时间")private LocalDateTime createTime;@ApiModelProperty("更新时间")private LocalDateTime updateTime;
}

PayClient代码如下:

package com.hmall.api.client;import com.hmall.api.client.fallback.PayClientFallback;
import com.hmall.api.dto.PayOrderDTO;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;@FeignClient(value = "pay-service", fallbackFactory = PayClientFallback.class)
public interface PayClient {/*** 根据交易订单id查询支付单* @param id 业务订单id* @return 支付单信息*/@GetMapping("/pay-orders/biz/{id}")PayOrderDTO queryPayOrderByBizOrderNo(@PathVariable("id") Long id);
}

PayClientFallback代码如下:

package com.hmall.api.client.fallback;import com.hmall.api.client.PayClient;
import com.hmall.api.dto.PayOrderDTO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.openfeign.FallbackFactory;@Slf4j
public class PayClientFallback implements FallbackFactory<PayClient> {@Overridepublic PayClient create(Throwable cause) {return new PayClient() {@Overridepublic PayOrderDTO queryPayOrderByBizOrderNo(Long id) {return null;}};}
}

最后,在pay-service模块的PayController中实现该接口:

@ApiOperation("根据id查询支付单")
@GetMapping("/biz/{id}")
public PayOrderDTO queryPayOrderByBizOrderNo(@PathVariable("id") Long id){PayOrder payOrder = payOrderService.lambdaQuery().eq(PayOrder::getBizOrderNo, id).one();return BeanUtils.copyBean(payOrder, PayOrderDTO.class);
}

5.接下来,我们在trader-service编写一个监听器,监听延迟消息,查询订单支付状态:

package com.hmall.trade.listener;import com.hmall.api.client.PayClient;
import com.hmall.api.dto.PayOrderDTO;
import com.hmall.trade.constants.MQConstants;
import com.hmall.trade.domain.po.Order;
import com.hmall.trade.service.IOrderService;
import lombok.RequiredArgsConstructor;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;@Component
@RequiredArgsConstructor
public class OrderDelayMessageListener {private final IOrderService orderService;private final PayClient payClient;@RabbitListener(bindings = @QueueBinding(value = @Queue(name = MQConstants.DELAY_ORDER_QUEUE_NAME),exchange = @Exchange(name = MQConstants.DELAY_EXCHANGE_NAME, delayed = "true"),key = MQConstants.DELAY_ORDER_KEY))public void listenOrderDelayMessage(Long orderId){// 1.查询订单Order order = orderService.getById(orderId);// 2.检测订单状态,判断是否已支付if(order == null || order.getStatus() != 1){// 订单不存在或者已经支付return;}// 3.未支付,需要查询支付流水状态PayOrderDTO payOrder = payClient.queryPayOrderByBizOrderNo(orderId);// 4.判断是否支付if(payOrder != null && payOrder.getStatus() == 3){// 4.1.已支付,标记订单状态为已支付orderService.markOrderPaySuccess(orderId);}else{// TODO 4.2.未支付,取消订单,回复库存orderService.cancelOrder(orderId);}}
}

二、Elasticsearch:

        Elasticsearch是由elastic公司开发的一套搜索引擎技术,适合大规模项目的搜索(大规模商城、百度搜索、全github搜索代码等)

接下来我们就来安装一下:

1.首先将下载好的两个tar包丢进虚拟机并加载成镜像:

2.然后输入以下指令进行配置:

docker run -d \--name es \-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \-e "discovery.type=single-node" \-v es-data:/usr/share/elasticsearch/data \-v es-plugins:/usr/share/elasticsearch/plugins \--privileged \--network hm-net \-p 9200:9200 \-p 9300:9300 \elasticsearch:7.12.1
docker run -d \
--name kibana \
-e ELASTICSEARCH_HOSTS=http://es:9200 \
--network=hm-net \
-p 5601:5601  \
kibana:7.12.1

3.访问以下地址进行测试:

192.168.150.101:9200

效果展示:

192.168.150.101:5601

效果展示:

http://www.dtcms.com/a/517604.html

相关文章:

  • 搭建网站难吗wordpress 多域名绑定域名
  • 珠宝类企业网站(手机端)科技作品
  • [算法导论] 1≤n≤15,n个整数组成的数组,输出所有不重复且满足条件的排列组合
  • 阿里巴巴怎么建设网站wordpress+百度云图安装
  • siteservercms做的网站在后台进行修改教程服务器打不开网站
  • php网站里放asp极酷wordpress
  • Spring Cloud - Spring Cloud 声明式接口调用(Fiegn 声明式接口调用概述、Fiegn 使用)
  • 宝塔设置加速wordpress站点重庆网站建设 重庆网站制作
  • 游戏是怎么做的视频网站怎么把网站源码
  • 快印店网站建设84wzjs吉林新农村建设网站
  • 给公司做网站需要华多少钱产品设计需要学的软件
  • 如何用纯C++和Linux系统调用从零实现一个自己的Docker
  • 公司网站建设原则公众号怎么制作左右滑动图片
  • Embedding与词表示技术:从OneHot到FastText的演进
  • 网站推广网络营销方案西城区网站建设
  • 长春网站制作软件网站怎么做图片动态图片不显示了
  • 深圳工程造价建设信息网站wordpress综合检测工具
  • 北京做的比较好的网站公司网站建设企业建站要求
  • 公司网站企业文化怎么做销售管理软件哪个好用
  • 有哪些做设计交易网站招商银行和建设银行网站功能对比
  • 数据结构系列之二叉树
  • 【数据结构】反射、枚举、lambda表达式以及补充知识
  • 网站开发费计入什么科目自己做微信电影网站怎么做
  • 23.C++11(三)
  • 梅州市五华县建设银行网站景观设计公司起名
  • 刚做淘客没有网站奥门网站建设
  • 专业做网站机构哪些ppt网站是免费的
  • 爱情动做网站推荐wordpress去除更新
  • 深圳技术支持 骏域网站建设wordpress 导出pdf文件
  • 深圳公明网站建设问题不大工作室 网站