使用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 ...
随机推荐
- C#对字符串进行加密解密
首先上效果图 加解密接口 internal string ToEncrypt(string encryptKey, string str) { try { byte[] P_byte_key = // ...
- 小白学标准库之 http
1. 前言 标准库是工具,是手段,是拿来用的.一味的学标准库就忽视了语言的内核,关键.语言层面的特性,内存管理,垃圾回收.数据结构,设计模式.这些是程序的内核,要熟练,乃至精通它们,而不是精通标准库. ...
- RLHF · PbRL | QPA:选择 near on-policy query,加速 policy learning 收敛速度
论文题目:Query-Policy Misalignment in Preference-Based Reinforcement Learning,ICLR 2023 Spotlight(8 6 6) ...
- 百度网盘(百度云)SVIP超级会员共享账号每日更新(2023.12.1)
一.百度网盘SVIP超级会员共享账号 可能很多人不懂这个共享账号是什么意思,小编在这里给大家做一下解答. 我们多知道百度网盘很大的用处就是类似U盘,不同的人把文件上传到百度网盘,别人可以直接下载,避免 ...
- 快速定位Java应用卡顿的原因
快速定位Java应用卡顿的原因 背景 同事的环境说出现了一周的卡顿现象. 元旦加班期间告诉我时已经是2024.1.1下午五点了. 当时没有来得及去查看. 上班之后发现问题很简单. 不过为了能够指导一下 ...
- [转帖]TiDB系统调参实战经验
https://tidb.net/blog/c9466c40#TiDB%E7%B3%BB%E7%BB%9F%E8%B0%83%E5%8F%82%E5%AE%9E%E6%88%98%E7%BB%8F%E ...
- overcommit_memory的简单学习
overcommit_memory的简单学习 背景 前几天一个测试环境启动失败. 总是有如下的提示: Native memory allocation (mmap) failed to map 122 ...
- 基于华为fusionstorage的块存储CSI
承接上文,块存储的CSI要比对象存储复杂一些,但总的处理逻辑还是一致的.下面以华为fusionstorage的CSI为例进行介绍,该插件支持了多个后端存储,如fusionstorage和oceanst ...
- Spring Boot Admin极简教程
一.简介 Spring Boot Admin是一个完整的应用程序,用于监控和管理Spring Boot应用.原理是通过调用Spring Boot Actuator提供的http接口来实现的监控和管理, ...
- flutter项目目录介绍
1 flutter项目目录介绍 android 安卓平台的的相关代理 build 编译后的 ios ios 平台的的相关代理 lib 自己写代码的目录 包好自己的代码 资源 test 放测试文件的 p ...