项目挑战

一、客户端图片直传

Situation

在实现这个功能时,接连出现了两个问题,一是没有上传至七牛云服务器的权限;二是能够顺利上传,但是达不到自动刷新头像的效果。

Task

定位这两个问题

Action

针对第一个问题,处理方式

1. 核对配置文件中对应的用户认证密钥、对上传文件加密的密钥、指定空间的名称、指定空间的域名是否配置正确。

2. 核对无误后,在本地应用单独写了一个测试方法,先把头像上传至本地应用,再把头像上传至七牛云服务器,返回的数据表示上传成功,那就大致能定位到客户端利用js发生post请求时,上传凭证可能没有误或者缺失上传凭证

3. 最终重新清理逻辑流程。用户再点击个人头像时,发送一个get请求给服务端,服务端需要生成凭证返回给页面,(而之前我忘记了把生成的auth重新设置至model中,加上这条语句就可以了)。

针对第二个问题,处理方式

依旧是重新梳理逻辑,在客户端的js脚本中,当七牛云服务器返回了成功通知后,需要再发送一个post请求给服务端,服务器接收到请求后,再对应的处理业务方法中,需修改用户头像的url为七牛云服务器的地址。然后客户端需要重新刷新页面,window.location.reload(),让头像发生变化。

Result

客户端将数据提交给云服务器,并等待其响应,再将新的头像名称提交给本地应用服务器,更新地址为七牛云的地址,再刷新页面,头像变更。效果流畅地实现了。

二、服务端直传

 第一个问题

生成长图失败,但提示信息中,明确了存放生成图片的文件夹不存在。

为了增加系统的健壮性,替换实现创建好文件夹的方式,采取增加一个配置类的方式,程序启动的时候,检查路径是否存在,不存在的话需使用程序完成创建。核心就是@Configuration和@PostConstruct注解下的init()方法。

第二个问题

Situation

生成分享图片利用Java操作wkhtmltoimage实现,通过运行一条cmd命令实现,由Runtime.getRuntime().exec(cmd)调用,具体实现起来,只是把命令发送给了操作系统来执行,和主程序是并发的。也就是说 服务端生成一张图片。然后再输出给用户显示,生成图片是异步的方式,在本项目中,生成图片的请求由controller直接发送给Kafka,以事件驱动的方式编程。如何知晓图片生成完的时机,只有图片生成成功后才能上传至七牛云服务器,如果生成失败,需要放弃上传(如何判断图片生成失败?)

Task

需要监控Runtime.getRuntime().exec(cmd)是否已经完成。

Action

创建了一个任务,交给可执行定时任务的线程池ThreadPollTaskScheduler去定以固定的频率调执行,任务的主业务为判断生成的文件是否存在,存在的话就上传至七牛云服务器,否则,其他的错误都需要针对性的处理。

Task

为了能够无论出现什么极端的情况,任务最终都能停掉,一定要采取一个兜底的方案。

Action

给任务额外增加两个属性

(1)任务开始的时间:一旦任务运行时间过长(超过30s),则一定要停止任务。

(2)上传次数超过3次(上传七牛云失败),同样需要停止任务。

最终停止任务的情况有三种:

  • 任务执行时间过长结束
  • 上传次数超时结束
  • 上传成功后也结束

为了停止定时器:利用Future对象,也就是启动任务的返回值,当出现以上三种情况时,在run方法中直接调用future.cancel(true)方法就能结束任务,在消费业务方法中,在触发了任务执行后,赶紧把future设置到task中去。

Result

能够同时处理生成图片失败和上传失败的错误场景,实现功能需求。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值