package com.alatus.mall.order.config; import feign.RequestInterceptor; import feign.RequestTemplate; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; @Configuration public class OrderFeignConfig { @Bean("requestInterceptor") public RequestInterceptor requestInterceptor(){ return new RequestInterceptor() { @Override public void apply(RequestTemplate requestTemplate) { // 使用RequestContextHolder拿到当前请求所用的请求信息 ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); // 同步请求头的Cookie信息,放到Feign的新请求中 requestTemplate.header(attributes.getRequest().getHeader("Cookie")); } }; } }
package com.alatus.mall.order.config; import feign.RequestInterceptor; import feign.RequestTemplate; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; @Configuration public class OrderFeignConfig { @Bean("requestInterceptor") public RequestInterceptor requestInterceptor(){ return new RequestInterceptor() { @Override public void apply(RequestTemplate requestTemplate) { // 使用RequestContextHolder拿到当前请求所用的请求信息 ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); // 同步请求头的Cookie信息,放到Feign的新请求中 requestTemplate.header(attributes.getRequest().getHeader("Cookie")); } }; } }
package com.alatus.mall.order.service.impl; import com.alatus.common.vo.MemberRespVo; import com.alatus.mall.order.feign.CartFeignService; import com.alatus.mall.order.feign.MemberFeignService; import com.alatus.mall.order.interceptor.LoginUserInterceptor; import com.alatus.mall.order.to.MemberAddressTo; import com.alatus.mall.order.vo.OrderConfirmVo; import com.alatus.mall.order.vo.OrderItemVo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; import java.util.Map; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.ThreadPoolExecutor; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.alatus.common.utils.PageUtils; import com.alatus.common.utils.Query; import com.alatus.mall.order.dao.OrderDao; import com.alatus.mall.order.entity.OrderEntity; import com.alatus.mall.order.service.OrderService; @Service("orderService") public class OrderServiceImpl extends ServiceImpl<OrderDao, OrderEntity> implements OrderService { @Autowired private MemberFeignService memberFeignService; @Autowired private CartFeignService cartFeignService; @Autowired private ThreadPoolExecutor threadPoolExecutor; @Override public PageUtils queryPage(Map<String, Object> params) { IPage<OrderEntity> page = this.page( new Query<OrderEntity>().getPage(params), new QueryWrapper<OrderEntity>() ); return new PageUtils(page); } @Override public OrderConfirmVo confirmOrder() throws ExecutionException, InterruptedException { OrderConfirmVo confirmVo = new OrderConfirmVo(); CompletableFuture<MemberRespVo> memberTask = CompletableFuture.supplyAsync(() -> { MemberRespVo memberRespVo = LoginUserInterceptor.loginUser.get(); return memberRespVo; }, threadPoolExecutor); // 远程查询所有的用户地址列表 CompletableFuture<Void> addressTask = memberTask.thenAcceptAsync((memberRespVo) -> { confirmVo.setAddress(memberFeignService.getAddress(memberRespVo.getId())); }, threadPoolExecutor); // 远程查询购物车所有选中的购物项 CompletableFuture<Void> itemVoList = CompletableFuture.runAsync(() -> { confirmVo.setItemVoList(cartFeignService.getCurrentCartItem()); }, threadPoolExecutor); // 用户积分 CompletableFuture<Void> integrationTask = memberTask.thenAcceptAsync((memberRespVo) -> { confirmVo.setIntegration(memberRespVo.getIntegration()); }, threadPoolExecutor); CompletableFuture.allOf(memberTask,addressTask,itemVoList,integrationTask).get(); // TODO 订单令牌 return confirmVo; } }
package com.alatus.mall.order.service.impl; import com.alatus.common.vo.MemberRespVo; import com.alatus.mall.order.feign.CartFeignService; import com.alatus.mall.order.feign.MemberFeignService; import com.alatus.mall.order.interceptor.LoginUserInterceptor; import com.alatus.mall.order.to.MemberAddressTo; import com.alatus.mall.order.vo.OrderConfirmVo; import com.alatus.mall.order.vo.OrderItemVo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; import java.util.Map; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.ThreadPoolExecutor; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.alatus.common.utils.PageUtils; import com.alatus.common.utils.Query; import com.alatus.mall.order.dao.OrderDao; import com.alatus.mall.order.entity.OrderEntity; import com.alatus.mall.order.service.OrderService; @Service("orderService") public class OrderServiceImpl extends ServiceImpl<OrderDao, OrderEntity> implements OrderService { @Autowired private MemberFeignService memberFeignService; @Autowired private CartFeignService cartFeignService; @Autowired private ThreadPoolExecutor threadPoolExecutor; @Override public PageUtils queryPage(Map<String, Object> params) { IPage<OrderEntity> page = this.page( new Query<OrderEntity>().getPage(params), new QueryWrapper<OrderEntity>() ); return new PageUtils(page); } @Override public OrderConfirmVo confirmOrder() throws ExecutionException, InterruptedException { OrderConfirmVo confirmVo = new OrderConfirmVo(); CompletableFuture<MemberRespVo> memberTask = CompletableFuture.supplyAsync(() -> { MemberRespVo memberRespVo = LoginUserInterceptor.loginUser.get(); return memberRespVo; }, threadPoolExecutor); // 远程查询所有的用户地址列表 CompletableFuture<Void> addressTask = memberTask.thenAcceptAsync((memberRespVo) -> { confirmVo.setAddress(memberFeignService.getAddress(memberRespVo.getId())); }, threadPoolExecutor); // 远程查询购物车所有选中的购物项 CompletableFuture<Void> itemVoList = CompletableFuture.runAsync(() -> { confirmVo.setItemVoList(cartFeignService.getCurrentCartItem()); }, threadPoolExecutor); // 用户积分 CompletableFuture<Void> integrationTask = memberTask.thenAcceptAsync((memberRespVo) -> { confirmVo.setIntegration(memberRespVo.getIntegration()); }, threadPoolExecutor); CompletableFuture.allOf(memberTask,addressTask,itemVoList,integrationTask).get(); // TODO 订单令牌 return confirmVo; } }
package com.alatus.mall.order.feign; import com.alatus.mall.order.to.MemberAddressTo; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import java.util.List; @FeignClient("Mall-member") public interface MemberFeignService { @GetMapping("/member/memberreceiveaddress/{memberId}/addresses") List<MemberAddressTo> getAddress(@PathVariable("memberId") Long memberId); }
package com.alatus.mall.order.feign; import com.alatus.mall.order.to.MemberAddressTo; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import java.util.List; @FeignClient("Mall-member") public interface MemberFeignService { @GetMapping("/member/memberreceiveaddress/{memberId}/addresses") List<MemberAddressTo> getAddress(@PathVariable("memberId") Long memberId); }
package com.alatus.mall.order.web; import com.alatus.mall.order.service.OrderService; import com.alatus.mall.order.vo.OrderConfirmVo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import java.util.concurrent.ExecutionException; @Controller public class OrderWebController { @Autowired private OrderService orderService; @GetMapping("/toTrade") public String toTrade(Model model) throws ExecutionException, InterruptedException { OrderConfirmVo confirmVo = orderService.confirmOrder(); model.addAttribute("orderConfirmData",confirmVo); return "confirm"; } }
package com.alatus.mall.order.web; import com.alatus.mall.order.service.OrderService; import com.alatus.mall.order.vo.OrderConfirmVo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import java.util.concurrent.ExecutionException; @Controller public class OrderWebController { @Autowired private OrderService orderService; @GetMapping("/toTrade") public String toTrade(Model model) throws ExecutionException, InterruptedException { OrderConfirmVo confirmVo = orderService.confirmOrder(); model.addAttribute("orderConfirmData",confirmVo); return "confirm"; } }