java定时器任务中获取request对象 @Scheduled 获取request 对象 quartz中获取request对象

                        java定时器任务中获取request对象 @Scheduled 获取request 对象 quartz中获取request对象

一、问题描述

        1、在java定时任务中,使用 @Scheduled 注解来实现;遇到一个需要通过 request 对象获取相对路径的问题,尝试过过 静态获取 和 使用 直接注入HttpServletRequest对象 的办法,都没有解决问题,会导致抛出异常如下:

ERROR [org.springframework.scheduling.support.TaskUtils$LoggingErrorHandler] 
 - Unexpected error occurred in scheduled task.

2、使用 @Autowired 注入 HttpServletRequest ,会抛出如下异常

ava.lang.IllegalStateException: No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually operating within a web request and still receive this message, your code is probably running outside of DispatcherServlet/DispatcherPortlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request.
	at org.springframework.web.context.request.RequestContextHolder.currentRequestAttributes(RequestContextHolder.java:131)
	at org.springframework.web.context.support.WebApplicationContextUtils.currentRequestAttributes(WebApplicationContextUtils.java:273)

二、问题解决

        1、通过 ContextLoader 获取 getCurrentWebApplicationContext 方法解决。

SSM 架构的,非 Spring Boot的 2022年9月21日22:36:03)

WebApplicationContext webApplicationContext = ContextLoader.getCurrentWebApplicationContext();
 ServletContext servletContext = webApplicationContext.getServletContext();
 String realPath = servletContext.getRealPath(File.separator);

org.springframework.web.context.ContextLoader

三、补充说明

        1、评论中,大家反馈的 空指针 情况, 获取到 WebApplicationContext  对象为空情况,经过测试,是在Spring Boot项目中,会出现这种情况,经常测试,简单解决办法是,直接 注入ServletContext 对象即可。


@Slf4j
@Component
public class Task {

    @Autowired
    private ServletContext servletContext2;

    @Autowired
    private HttpServletRequest request;

    @Scheduled(cron = "0/10 * * * * ? ")
    public void task(){
        Thread th = Thread.currentThread();
        log.warn("start==={}",th.getName());
        /**
         * spring boot 项目下: WebApplicationContext 为空。
         * 需要手动注入:servletContext2 即可
         */
//        WebApplicationContext web = ContextLoader.getCurrentWebApplicationContext();
//        ServletContext servletContext = web.getServletContext();
        String realPath = servletContext2.getRealPath(File.separator);
        log.warn("end === realPath {}",realPath);

    }
}

       

        2、原项目环境是:SSM 架构的,非 Spring Boot的, 使用的 Spring 版本为 4.3 。

        3、本文表述有一点误解, 定时任务中,无法获取到 request 对象的, 是可以获取到 servlet的上下文对象ServletContext 的。

        因未描述清楚项目环境,导致影响了大家解决问题的速度, 本人深表歉意 。

2022年9月21日22:35:43

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 27
    评论
城市天气预报免费获取源码 主要用途: 1.获取城市天气预报 2.在线给好友或自己发送飞信 3.调用飞信api接口 4.定时发送天气预报[可群发] 包含主要文件有 index.php    获取城市天气预报 f.php        飞信api接口及在线发飞信 weather.php  每日执行文件 data.txt     城市数据 lib/PHPFetion.php       php飞信类 lib/function.php        函数库 lib/config.php          配置文件 主要文件说是 index.php [主要目的配合定时发送天所预报,测试是否能够获取当时天气预报] 说明 1.在查询后面的文本框输入您要查询的城市名称[不要带市/县等][不支持省] 2.点击查询将可以获取今日天气.[今日缓存数据] 3.获取最新点击下面 [获取最新天气预报] 4.可以通过下面的飞信接口发送到手机上 f.php 可直接添写相应选项后点发送也可利用API发送 API调用:f.php?phone=xxxxxx&pwd=xxx&to=xxxx&msg=xxxx 以上接口参数详细说明 phone  手机号 pwd  飞信密码 to  发送给谁(手机号或飞信号) msg  飞信内容 u  备用参数:当发送内容为乱码时 在最后加上&u=1 weather.php / config.php [每日天气配置] 需要自行配置 配置方法 1.用Dreamweaver或其它编辑软件打开weather.php文件 2.找到第12行 $phone="150********|唐山;134********|唐山;151********|石家庄;150********|石家庄"; 按照以上规则进行配置.双引号规则为:手机号|城市名;手机号|城市名 标题不能错全为英文状态下标点 3.打开inc/config.php 修改第8行和第9行 define("PHONE_NUMBER","150********");将双引号的手机号改成你的手机号 define("PHONE_PWD","******");将双引号的*改成您的飞信密码 4.修改什么时候发天气预报和自动发布配置 windows 下设置方法 启动服务: Event Log Task Scheduler 新建计划任务 1.首先添加一个带密码的用户可以在管理本地用户里面添加。我添加的组有Power Users 和Users 2.新建计划任务,选择的时候选择.bat文件就ok了 3.修改w.bat文件第二行 前面为php所在目录,后面为要执行的文件 linux下设置方法 crontab -e 添加下面一行 00 07 * * * links http://www.***.com/weather.php 前面是时间后面是网址,我这个设定的时间为每天早上七点,您可以根据您的需要设置。网址为您上传的文件的访问地址.
【资源说明】 基于C++实现的HTTP服务器改进版源码+项目使用说明+详细注释.zip 1、技术架构 **本项目实现了基于Epoll管理连接、基于定时器处理非活动连接、基于线程池实现Reactor模式、基于cgi脚本处理http请求结果的HTTP服务器。主要框架如下:**\ ![](./image/newhttpd.jpg) 2、模块介绍 **1)主线程实现eventLoop**:主线程基于Reactor并通过Epoll管理,采用ET工作模式进行事件触发,事件注册包括监听、管道监控、读信息监控;\ **2)定时器处理非活动连接**:\ **①基于升序链表的定时器**:将每个需要监控的连接注册为一个时间结点,每个结点包括双向指针以及期待的时间和回调函数指针;包含添加、删除以及调整结点;回调函数主要实现对当前连接的close;\ **②基于信号和管道的定时事件处理**:建立监听数据集(新连接会加入一个数据集和时间结点,新信息读入会读取数据集并修改时间结点),基于sigaction形式实现对信号和信号处理函数的绑定,信号处理函数向管道发送信号消息,主线程监听到管道消息读入后判断信号类别,并进行关闭连接操作。\ **3)Http响应处理**:基于tinyhttpd进行修改,捕获GET、POST方法,基于cgi脚本(python撰写)实现post请求响应,基于多进程机制并通过双通道实现进程间通信,并用waitpid进行子进程管控。具体结构如下图所示:\ ![](./image/httpd.jpg) \ **4)线程池**:基于C++的生产者消费者模式的并发开发,具体技术运用如下:\ **①线程池底层结构**:线程池创建相当于消费者,队列添加相当于生产者,通过vector维护线程池,通过queue<function<>>维护任务队列;构造函数实现线程池创建并开始运行,enqueue函数实现消息队列,通过future实现异步工作的lambda函数的传递;\ **②同步机制实现**:基于unique_lock以及condition_variable实现同步和互斥,符合RAII原则;\ **5)简单客户端**:(可以通过浏览器进行服务端访问,也可以通过该客户端实现交互以及非活动连接处理的测试)\ **①基于POLL的IO复用**:对管道和连接进行事件监听和处理;\ **②基于双管道的简易CGI实现**:修改stdin的定向为管道写端,实现终端对客户端的直接输入和对服务端的发送;\ **6)改进方向**:待进行压力测试并提高抗压性能、可处理的HTTP请求较为简单(数据体的处理还待增加以及CGI功能的完善)、内存池。 3、编译使用 **服务端**:进入linux系统后,进入当前文件夹,首先修改可执行权限,然后通过CMake编译执行即可: ~~~c cd minghttp chmod 600 test.html chmod 600 post.html chmod +X post.cgi cd .. cmake . make ./httpserver ~~~ **客户端**:一方面可以通过浏览器直接进行服务器访问,一方面可以使用自己创建的客户端进行连接和消息互传(使用方案如下): ~~~c g++ simclient.cpp ./a.out ip port ~~~ ![](./image/out.jpg) 4、呈现效果 上一部分的图片已经展现定时器处理非活动连接的效果;\ 1)项目默认端口号为8000,ip地址需要通过ifconfig进行查看;\ 2)将ip和端口号进行替换输入,如下输入后可以得到如下界面:\ ![](./image/test.jpg)\ 3)POST的界面信息:\ ![](./image/jie.jpg)\ 4)POST的CGI脚本回显,基于python进行撰写,内容传输为html语言:\ ![](./image/cgi.jpg)\ 5)定时器的相关讯息也可以得到:可以看到5秒信号的定时器信息输出:\ ![](./image/jie1.jpg) 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值