Springboot 定时任务注入FeignClient

news2024/11/25 17:18:11

问题引入:

在springboot 项目写了个定时任务,里面有段代码通过Feign 调用远程服务,发现通过接口调用可以程序正常执行, 通过配置定时任务发现定时任务没执行,看日志是报了NP.

问题跟踪:

写了个demo 重现以上错误:
@Api(tags = "XXX控制器")
@RestController
@RequestMapping("/tenderBid")
@Slf4j
public class TenderBidController extends JeecgController<Tender, ITenderService> {

    @Autowired
    private IdeliverRemoteService ideliverRemoteService;

    @Autowired
    private ITenderBidDetailService tenderBidDetailService;

//    final IdeliverRemoteService ideliverRemoteService;
//
//    public TenderBidController(IdeliverRemoteService ideliverRemoteService) {
//        this.ideliverRemoteService = ideliverRemoteService;
//    }

    /**
     * @return java.lang.String
     * @Title: 测试定时任务, 每6秒执行一次(注意方法不能带参数)
     * @Author: ken
     * @Description:
     * @Date: 2023/2/20  17:01
     * @Param: []
     **/
    @Scheduled(cron ="*/6 * * * * ?")
    @RequestMapping(value = "/testTask", method = RequestMethod.POST)
    public void testTask() {
        log.info("now is:{}", LocalDateTime.now().toString());
        com.alibaba.fastjson2.JSONObject vo = new com.alibaba.fastjson2.JSONObject();
        vo.put("sign", "8145e202-d8b5-f613-5e24-50bda4bbd75c");
        //IdeliverRemoteService ideliverRemoteService = (IdeliverRemoteService) SpringContextUtils.getBean("ideliver-service");
        //IdeliverRemoteService ideliverRemoteService = (IdeliverRemoteService)AppContextUtil.getBean("ideliver-service");
        //IdeliverRemoteService ideliverRemoteService = AppContextUtil.getFeignBean("ideliver-service", IdeliverRemoteService.class);
        log.info("TenderController --> ideliverRemoteService:{}", ideliverRemoteService);

        try {

            com.alibaba.fastjson2.JSONObject result = ideliverRemoteService.getSolutionKeyWord(vo);
            log.info("TenderController --> testTask result: {}", JSONObject.toJSONString(result));
        } catch (Exception e) {
            log.error("TenderController --> testTask error:{}", e.getMessage(), e);
        }

    }

注入的Feign

@Service
@FeignClient(name = "ideliver-service", url = "${service.ideliver.url:}", configuration = IdeliverFeignConfig.class)
public interface IdeliverRemoteService {
    /**
     * @Title: 查询解决方案对应的关键词
     * @Author: ken
     * @Description:
     * @Date: 2023/2/22  16:10
     * @Param: [vo]
     * @return com.alibaba.fastjson2.JSONObject
     **/
    @PostMapping(value = "${service.ideliver.api.SolutionKeyWord:/ideliver/SolutionKeyWord}")
    JSONObject getSolutionKeyWord(@RequestBody(required=false) JSONObject vo);
}

通过日志发现是获取到了 ideliverRemoteService的值:
ideliverRemoteService:HardCodedTarget(type=IdeliverRemoteService, name=ideliver-service, url=https://ideliver.xxx.ltd)

跟踪代码,在 IdeliverFeignConfig 类找到原因,其中有段代码从前端获取Cookie 未判断空,导致报错:

    @Bean
    public RequestInterceptor requestInterceptor() {
        return requestTemplate -> {
            RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
            HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();
            // 2.从request对象中获取cookie
            String cookies = request.getHeader("Cookie");
            requestTemplate.header("Cookie", cookies);
        };
    }

代码加非空判断,问题解决:

    @Bean
    public RequestInterceptor requestInterceptor() {
        return requestTemplate -> {
            RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
            if(Objects.isNull(requestAttributes)){
                return;
            }
            HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();
            // 2.从request对象中获取cookie
            String cookies = request.getHeader("Cookie");
            requestTemplate.header("Cookie", cookies);
        };
    }

问题结论:

程序报错一定要认真定位为题, 不能自以为, 开始以为是没有注入进来, 最后debug 定位解决为题. 还有一点对于一些地方,如果远程调用,异常捕获和日志打印是非常必要的,不然很难定位到问题. 可以通过如下写法轻易打印出日志:
**log.error("TenderController --> testTask error:{}", e.getMessage(), e);**

问题补充:

关于 FeignClient 的注入问题, 经测试是第一种和第四种可以注入, 第二种和第三种是无法注入的,大家有空可以试验下:
在这里插入图片描述

/**
 * @Title: 配置类,解决定时任务无法注入的问题
 * @Author: ken
 * @Description:
 * @Date: 2023/3/6  16:02
 **/
@Component
public class AppContextUtil implements ApplicationContextAware {

    private static ApplicationContext applicationContext;

    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }


    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        AppContextUtil.applicationContext = applicationContext;

    }


    public static Object getBean(String beanName) {
        return applicationContext.getBean(beanName);

    }

    public static <T> T getFeignBean(String beanName, Class<T> tClass) {
        //我这边主要在gateway用到这两行代码
        FeignContext feignContext = applicationContext.getBean("feignContext", FeignContext.class);
        return feignContext.getInstance(beanName, tClass);
    }
}

每一次的积累都有收获~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/393747.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

认识代码之前,请先认识你自己 |《编程人生》

这是我的湛庐课程《给技术人的职场突围课》 &#xff08;链接&#xff09; 的一部分。 这篇文章也是 IT 女神征文活动 的一部分。 《编程人生》是一本优秀程序员的采访集&#xff0c;里面记录了15位世界级编程大师的故事。 我在 发刊词 里面说过&#xff0c;在这个书单课里&am…

如何有效地降低软件开发风险?

1、科学分析风险 高风险自动预警 一般对风险进行科学分析&#xff0c;主要从3个维度进行划分&#xff1a;影响的严重性、发生的可能性、产生的影响性。 根据风险对项目的影响程度&#xff0c;从3个维度将其划分5个等级&#xff1a;很低、比较低、中等、比较高、很高。这样我们能…

react router零基础使用教程

安装既然学习 react router 就免不了运行 react安装 reactnpx create-react-app my-appcd my-appnpm start安装 react routernpm install react-router-dom如果一切正常&#xff0c;就让我们打开 index.js 文件。配置路由引入 react-router-dom 的 RouterProviderimport {Route…

JavaWeb--Filter

Filter1 Filter概述2 Filter快速入门2.1 开发步骤2.2 代码演示3 Filter执行流程4 Filter拦截路径配置5 过滤器链5.1 概述5.2 代码演示5.3 问题6 案例6.1 需求6.2 分析6.3 代码实现6.3.1 创建Filter6.3.2 编写逻辑代码6.3.3 测试并抛出问题6.3.4 问题分析及解决6.3.5 过滤器完整…

智慧供热|供热末端(住户)管网远程监测方案

智慧供热通过对供热相关数据的采集、分析和对热源、热网、末端&#xff08;住户&#xff09;的各个供热环节进行智能调控&#xff0c;从而进一步实现热网资源的配置优化&#xff0c;提高热网输送的能力。供热行业存在问题&#xff1a;供热企业目前面临的主要问题还是资金周转困…

MYSQL1

MySQL基本11、MySQL 中有哪几种锁&#xff1f;2、MySQL 中有哪些不同的表格&#xff1f;2、什么是存储引擎3、MySQL 中 InnoDB 支持的四种事务隔离级别名称&#xff0c;以及逐级之间的区别4、CHAR 和 VARCHAR 的区别1、固定长度 & 可变长度2、存储方式3、存储容量4、CHAR会…

cookie session Token终极理解

左边 浏览器 右边 服务器 浏览器发送请求 服务器接收请求 并生成cookie 浏览器查看保存了哪些cookie 用户名密码放在cookie是很不安全的 因为浏览器一旦被攻击泄露 是很危险的 接着诞生了session 会话 sessionID &#xff08;一段杂乱的字母标识&#xff09; 会话结束时间 …

【云原生】Istio请求路由、流量转发、超时配置等

代码继续接着前面的文章【云原生】整合K8s SpringCloudK8s gRpc RocketMQ Istio Envoy&#xff0c;本篇文章我们测试下请求路由功能。生产中我们上了个新接口或者新功能&#xff0c;一般会经过 内灰 -> 外灰5% -> 外灰10% ...... 外灰100%的过程&#xff0c;这篇文章…

计算机图形学08:中点BH算法绘制抛物线(100x = y^2)

作者&#xff1a;非妃是公主 专栏&#xff1a;《计算机图形学》 博客地址&#xff1a;https://blog.csdn.net/myf_666 个性签&#xff1a;顺境不惰&#xff0c;逆境不馁&#xff0c;以心制境&#xff0c;万事可成。——曾国藩 文章目录专栏推荐专栏系列文章序一、算法原理二、…

springboot整合mybatis框架,简单实现CRUD

如果大家实在不知道怎么搞可以去看看官网:mybatis-plus官网MyBatis-Plus (opens new window)&#xff08;简称 MP&#xff09;是一个 MyBatis (opens new window)的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。其实也就是在…

5. 驱动开发

文章目录一、驱动开发1.1 前言1.2 何谓驱动框架1.3 内核驱动框架中LED的基本情况1.3.1 相关文件1.3.2 九鼎移植的内核中led驱动1.3.3 案例分析驱动框架的使用1.3.4 典型的驱动开发行业现状1.4 初步分析led驱动框架源码1.4.1 涉及到的文件1.4.2 subsys_initcall1.4.3 led_class_…

windows应用(vc++2022)MFC基础到实战(1)

目录vc概述MFC 框架概述MFC 框架SDI 和 MDI文档、视图和框架窗口对象文档/视图体系结构第一个应用自动生成的主框架类源码vc概述 Microsoft Visual C&#xff08;简称Visual C、MSVC、VS或VC&#xff09;是微软公司的免费C开发工具&#xff0c;具有集成开发环境&#xff0c;可…

Spring Security OAuth2实现多用户类型认证、刷新Token

原本的OAuth2登录支持用户名密码登录&#xff0c;现在还想支持另外用id号码和密码登录。但是OAuth2默认提供的UserDetailsService只允许传入一个参数&#xff1a;想要实现多种用户登录&#xff0c;是不是可以考虑loadUserByUsername方法携带多个参数呢&#xff1f;接下来记录一…

Docker安装和Docker安装Nginx及其他常用操作

一、Docker简介 Docker 是一个开源的应用容器引擎&#xff0c;基于Go 语言并遵从 Apache2.0 协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚拟化。 容器是完全…

机器学习与目标检测作业:连通块算法

机器学习与目标检测作业&#xff1a;连通块算法一、连通块算法题目描述二、连通块算法文件结构三、连通块算法程序编写3.1、连通块算法conBlock.h头文件内容3.2、conBlock.cpp源文件内容3.3.3、mian.h头文件内容3.3.4、main.cpp源文件内容如下四、连通块算法程序运行结果一、连…

【JS知识点】——原型和原型链

文章目录原型和原型链构造函数原型显式原型&#xff08;prototype&#xff09;隐式原型&#xff08;\_\_proto\_\_&#xff09;原型链总结原型和原型链 在js中&#xff0c;原型和原型链是一个非常重要的知识点&#xff0c;只有理解原型和原型链&#xff0c;才能深刻理解JS。在…

云上办公系统项目

云上办公系统项目1、云上办公系统1.1、介绍1.2、核心技术1.3、开发环境说明1.4、产品展示后台前台1.5、 个人总结2、后端环境搭建2.1、建库建表2.2、创建Maven项目pom文件guigu-oa-parentcommoncommon-utilservice-utilmodelservice-oa配置数据源、服务器端口号application.yml…

D2-Net: A Trainable CNN for Joint Description and Detection of Local Features精读

开源代码&#xff1a;D2-Net 1 摘要 在这项工作中&#xff0c;我们解决了在困难的成像条件下寻找可靠的像素级对应的问题。我们提出了一种由单一卷积神经网络发挥双重作用的方法&#xff1a;它同时是一个密集的特征描述符和一个特征检测器。通过将检测推迟到后期阶段&#xf…

统计代码量

一 windows 在 Windows 系统上&#xff0c;您可以使用 PowerShell 命令行工具来统计项目的代码量。下面是使用 PowerShell 统计项目代码量的步骤&#xff1a; 打开 PowerShell 终端&#xff1a;按下 Win X 键&#xff0c;选择「Windows PowerShell&#xff08;管理员&#xf…

SQL分库分表

什么是分库分表&#xff1f; 分库分表是两种操作&#xff0c;一种是分库&#xff0c;一种是分表。 分库分表又分为垂直拆分和水平拆分两种。 &#xff08;1&#xff09;分库&#xff1a;将原来存放在单个数据库中的数据&#xff0c;拆分到多个数据库中存放。 &#xff08;2&…