使用HttpServletResponse实现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;
}
}
}
由于我们的目的只是为了实现控制台输出,所以如果该方法抛出异常(主要是 IOException 和 IllegalStatesException),那么直接返回即可。这个问题主要出在定时任务中,因为定时任务是不含 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调用接口可以实现控制台输出,定时任务也执行正常,没有预期外的异常产生。
使用HttpServletResponse实现curl接口时控制台输出(续)的更多相关文章
- Maven 执行Javadoc时控制台输出乱码问题
1.0 Maven 执行Javadoc时控制台输出乱码问题 问题描述 最近项目中使用maven-javadoc-plugin生成javadoc时,myEclipse控制台乱码. 插件配置 问题分析 ...
- 使用WebLogic时控制台输出中文乱码解决方法
使用WebLogic时控制台输出中文乱码解决方法 1.找到weblogic安装目录,当前项目配置的domain 2.找到bin下的setDomainEnv.cmd文件 3.打开文件,从文件最后搜索第一 ...
- pytest文档41-参数化 ids 用例描述为中文时控制台输出unicode编码问题(pytest_collection_modifyitems)
前言 使用 pytest.mark.parametrize 参数化的时候,加 ids 参数用例描述有中文时,在控制台输出会显示unicode编码,中文不能正常显示. 使用 pytest_collect ...
- Eclipse中执行Maven命令时控制台输出乱码
Maven 默认编码为 GBK: 在 Eclipse 控制台输出乱码: 解决方法:将以下代码添加到 pom.xml 的 <project> 节点下: <project> …… ...
- 执行Maven install或Maven test命令时控制台输出乱码的解决办法
[解决方案一] 在Maven的pom.xml文件中增加如下代码: <properties> <argLine>-Dfile.encoding=UTF-8</argLine ...
- 在使用hibernate的getHibernateTemplate()时怎么让控制台输出封装好的SQL? 怎么用日志打印出来?
我们在使用 Hibernate 时一般只会关注是否显示生成的 SQL 语句,不过有些时候还不够.默认时 Hibernate 执行的 SQL 语句是打印在控制台上的,它也可以配置为输出给 Log4J 或 ...
- Python控制台输出时刷新当前行内容而不是输出新行
需求目标 执行Python程序的时候在控制台输出内容的时候固定一刷新内容,如下: Downloading File FooFile.txt [%] 而不是 Downloading File FooFi ...
- Python 控制台输出时刷新当前行内容而不是输出新行
需求目标 执行Python程序的时候在控制台输出内容的时候只显示一行,然后自动刷新内容,像这样: Downloading File FooFile.txt [%] 而不是这样: Downloading ...
- ssh下:系统初始化实现ServletContextListener接口时,获取spring中数据层对象无效的问题
想要实现的功能:SSH环境下,数据层都交由Spring管理:在服务启动时,将数据库中的一些数据加载到ServletContext中缓存起来. 系统初始化类需要实现两个接口: ServletContex ...
- Web运行控制台输出乱码解决总结
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
随机推荐
- Redis 也支持全文搜索 了?这也太强了
在 2021 年我就了解到 RediSearch 这个项目,并已经把它用于我的开源项目 newbee-mall-pro 中. 就我的使用体验来说,简单场景下,用来平替 Elasticsearch 的使 ...
- 使用 Docker 安装 MongoDB 数据库
by emanjusaka from https://www.emanjusaka.top/2024/01/docker-create-mongo-db 彼岸花开可奈何 本文欢迎分享与聚合,全文转载请 ...
- Ubuntu解决Github无法访问的问题
技术背景 由于IP设置的问题,有时候会出现Github无法访问的问题,经过一番的资料检索之后,发现如下的方案可以成功解决在Ubuntu下无法正常访问Github的问题(有时候可以打开,有时候又不行). ...
- Mybatis @Insert插入数据返回自增的主键id
mapper层 @Insert("insert into t_user (username,password,valid,create_time) values (#{username},# ...
- JavaScript : 获取文件名后缀
/** 获取文件后缀 * * indexOf 和 lastIndexOf 都是索引文件 indexO ...
- Go-用本地时间解析时间字符串
Go-用本地时间解析时间字符串 1. 指定本地时区 const ( gLocalTimeZone = "Asia/Shanghai" ) 2. 加载本地时区 var ( gLoca ...
- [转帖]TiDB 使用 dumpling 导出数据,并使用 lightning 导入到另一个 TiDB 库
本文介绍从 TiDB-A 库导出数据到 TiDB-B 库: 导出 Dumpling 包含在 tidb-toolkit 安装包中,可在此下载. 从 TiDB/MySQL 导出数据 需要的权限 SELEC ...
- ext4 扩容磁盘的方式方法
ext4 扩容磁盘的方式方法 背景 前期一直处理xfs,lvm磁盘的扩容 很少处理ext4的磁盘扩容 今天发现自己竟然对这一块有盲区. 晚上回家自己学习研究了会儿, 发现知识点还挺多 所以总结一下. ...
- [转帖]SQL Server超过了每行的最大字节数(8060)的原因和解决办法
一.现象 出现这种错误都发生在SQL语句建表时,错误提示: "警告: 已创建表 'XXXX,但其最大行大小(10438)超过了每行的最大字节数(8060).如果结果行长度超过 806 ...
- [转帖]修改vcenter数据库账号密码
1.修改sqlserver sa账号密码 2.停止vcenter服务 cd C:\Program Files\VMware\vCenter Server\bin service-control --l ...