首页 > 其他分享 >使用HttpServletResponse实现curl接口时控制台输出(续)

使用HttpServletResponse实现curl接口时控制台输出(续)

时间:2023-09-26 23:36:54浏览次数:60  
标签:webUtil Service Component HttpServletResponse output curl 控制台

上一篇文章的问题

在上一篇文章 Spring Boot RestController接口如何输出到终端 中讨论了如何使用 HttpSerlvetResponse 写入输出流,使应急接口通过 curl 调用时可以在控制台输出信息,使运维人员知道命令执行情况。

但是上一篇文章的问题是,HttpServletResponse 是 Controller 的参数,这就使得如果要在其调用的 Service 方法中也要实现控制台输出,就必须让所有涉及到的 Service 方法都带上 HttpServletResponse 参数,这对业务的侵入实在太大,对于实际业务可能包含多个 Service、Component 之间的相互引用,改造成本是不可容忍的。

本文的解决思路

那么笔者就在想,如何构造一个全局的 HttpServletResponse 对象,使它能够在各个 Controller、Service、Component 之前传递呢?经过查阅资料发现,HttpServletResponse 对象本身是可以被 @Autowired@Resource 注解注入的!那么我们就可以构造一个带有自动注入的 HttpServletResponse 对象的 Component,然后在其他所有需要使用的地方去自动注入这个 Component 即可。

代码

代码实现如下:

@Component
public class WebUtil {
    @Resource
    private HttpServletResponse httpServletResponse;

    public void output(String message) {
        if (httpServletResponse == null) {
            return;
        }
        try {
            httpServletResponse.setContentType("text/plain;charset=utf-8");
            httpServletResponse.setCharacterEncoding("UTF-8");
            PrintWriter writer = httpServletResponse.getWriter();
            writer.println(message);
            writer.flush();
        } catch (Exception e) {
            return;
        }
    }
}

由于我们的目的只是为了实现控制台输出,所以如果该方法抛出异常(主要是 IOExceptionIllegalStatesException),那么直接返回即可。这个问题主要出在定时任务中,因为定时任务是不含 HttpServletResponse 对象的,如果在定时任务中调用该方法的时候会抛出 IllegalStatesException

在要使用该方法的类中使用自动注入,注入 WebUtil 类,然后使用它的对象(而不是这个类本身)的output方法即可。

@Service
@Slf4j
public class TestServiceImpl implements TestService {
    @Resource
    private WebUtil webUtil;

    @Override
    public boolean emergencyOperation() throws IOException {
        log.info("开始执行应急操作任务");
        webUtil.output( "开始执行应急操作任务");
        for (int i = 0; i < 20; i++) {
            webUtil.output( "完成第" + (i+1) + "批次");
            log.info("完成第 {} 批次", i+1);
            try {
                Thread.sleep(500L);
            } catch (InterruptedException e) {
                log.warn("应急操作任务失败");
                webUtil.output( "应急操作任务失败");
                return false;
            }
        }
        log.info("完成应急操作任务");
        webUtil.output( "应急操作任务完成");
        return true;
    }
}

经过测试发现,curl调用接口可以实现控制台输出,定时任务也执行正常,没有预期外的异常产生。

标签:webUtil,Service,Component,HttpServletResponse,output,curl,控制台
From: https://www.cnblogs.com/ryuasuka/p/17731558.html

相关文章

  • 爱数anybackup——控制台建立对应的ofs卷、重删卷、自备份卷、元数据卷
    以admin登录系统,点击【存储】>【节点管理】>【配置】>【卷管理】  选择对应的【卷类型】 点击【+新建】 输入【卷名称】,选择【挂载路径】,输入【容量】,然后点击创建即可 ......
  • win下编译libcurl x86静态库 (附带ssl)
     VisualStudio版本: 克隆libcurl项目:gitclonehttps://github.com/curl/curl.git添加依赖(ssl):在拷贝的项目下添加deps目录: 在deps下创建lib和include目录: 关于编译openssl参考:https://www.cnblogs.com/laremehpe/p/17712109.html将openssl下的include下的open......
  • poython文件运行模式和python控制台运行模式和Juputer运行模式
    今天学pytorch,我知道了python文件是整个代码运行,,而python控制台是一行一行的运行。而Juputer是任意代码块运行的。 ......
  • 在idea的控制台使用命令报错XXX无法识别为命令或改变了环境变量后idea环境未同步更新
    报错XXX无法识别为命令是当前环境中不存在XXX配置,当前环境不是说电脑的系统环境,比如使用的idea那当前环境就是idea的配置环境:打开设置(ctrl+alt+s) 在Value中添加XXX对应的路径,记得加分号(;)。 ......
  • curl 命令
    curl是一种用于发送HTTP请求的命令行工具。它支持众多协议(包括HTTP、HTTPS、FTP、SMTP、POP3等),以及不同的方式(GET、POST、PUT、DELETE等)进行数据传输。以下是一些常见的用法:1.发送GET请求并获取响应:curlhttp://example.com2.发送POST请求并附带参数:curl-d"param......
  • Curl 常用参数
    (1)-X为请求方法,如curl-XPUT即接口为PUT方法,curl-XPOST即为POST方法,curl-XGET为GET方法,如不带-X直接请求,则默认为GET请求,比如核心运管登录的接口测试使用口令curl-XGEThttp://10.19.185.216:17150/asab-web/visual/getAllCameracurl-XPOSThttp://10.19.185.216:1715......
  • 从0到1,实现Java控制台版本的ATM管理系统
    从0到1,实现Java控制台版本的ATM管理系统​ 其实作为一名Java的程序猿,无论你是初学也好,大神也罢,管理系统一直都是一个非常好的例子,初学者主要是用数组、List等等来写出一个简易的管理系统.牛逼一点的大神则用数据库+swing来做一个有界面的管理系统,其实都并不会太难。​ 今天我......
  • Windows 删除 curl 别名
    D:/github/deno_core_live>cargocheckwarning:versionrequirement`0.12.3+zstd.1.5.2`fordependency`zstd`includessemvermetadatawhichwillbeignored,removingthemetadataisrecommendedtoavoidconfusionwarning:versionrequirement`0.12.3+zs......
  • unity3d 清空控制台
    unity3d清空控制台usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;usingUnityEngine.UI;usingAssemblyCSharp;usingSystem;#ifUNITY_EDITORusingUnityEditor;#endifpublicclassVCClearConsole:MonoBehaviour{//......
  • php通过curl获取数据
    <?phpheader("Content-Type:text/html;charset=UTF-8");$url='https://www.baidu.com';print_r(curlContent($url));functioncurlContent($url,$method='get',$dataArr=array(),$headerArr=array()){$method=strtolower($......