OSSPostObject未發生回撥的問題排查
今天排查一個問題,走了一些彎路,總結一下,希望可以為後來者提供參考建議。
問題:
XX反饋,使用OSS PostObject的callback沒有發生回撥。但是通過putobject用同樣的callback是有回撥發生的。客戶懷疑我們的PostObject有問題。
排查:
OSS回撥流程為 客戶端->OSS->應用伺服器->客戶端
建立一臺ECS用於當測試應用伺服器
建立一個asp.net 的ashx,程式碼自行實現,用於獲取OSS callback引數。
寫了兩個上傳demo
- Putobject (SDK上有示例https://help.aliyun.com/document_detail/32013.html)
PutObjectRequest putObjectRequest=new PutObjectRequest(bucketName, key, new ByteArrayInputStream(content.getBytes()), meta);
Callback callback = new Callback();
callback.setCallbackUrl("http://接收端IP/Revice.ashx");
callback.setCallbackBody("{\"mimeType\":${mimeType},\"size\":${size}}");
putObjectRequest.setCallback(callback);
ossClient.putObject(putObjectRequest)
- postobject(post demo,參考https://github.com/aliyun/aliyun-oss-java-sdk/blob/master/src/samples/PostObjectSample.java?spm=a2c4g.11186623.2.11.3bMYXb&file=PostObjectSample.java)
關鍵程式碼:
File file = new File(localFile);
String filename = file.getName();
String contentType = new MimetypesFileTypeMap().getContentType(file);
if (contentType == null || contentType.equals("")) {
contentType = "application/octet-stream";
}
StringBuffer strBuf = new StringBuffer();
strBuf.append("
").append("--").append(boundary).append("
");
strBuf.append("Content-Disposition: form-data; name="file"; "+ "filename="" + filename + ""
");
strBuf.append("Content-Type: " + contentType + "
");
out.write(strBuf.toString().getBytes());
//callback部分
StringBuffer strBuf1 = new StringBuffer();
String callback="{"callbackUrl":"http://應用接收端IP/Revice.ashx","callbackBody":"{\"bucket\"=${bucket},\"size\"=${size}}"}";
byte[] textByte = callback.getBytes("UTF-8");
strBuf1.append("
").append("--").append(boundary).append("
");
String callbackstr=new String(Base64.encodeBase64(textByte));
strBuf1.append("Content-Disposition: form-data; name="callback"
" + callbackstr + "
");
out.write(strBuf1.toString().getBytes());
//callback部分
DataInputStream in = new DataInputStream(new FileInputStream(file));
int bytes = 0;
byte[] bufferOut = new byte[1024];
while ((bytes = in.read(bufferOut)) != -1) {
out.write(bufferOut, 0, bytes);
}
in.close();
byte[] endData = ("
--" + boundary + "--
").getBytes();
out.write(endData);
out.flush();
out.close();
測試:
Put方式,應用伺服器上有OSS的回撥請求。
Post方式,應用伺服器無任何回撥請求
按理說,如果json格式有錯誤或者回撥失敗,都應該會返回對應的msg,而上傳後一切成功但為什麼沒有發生回撥呢,難道是bug?不太可能,如果是線上bug,工單早就爆了。
檢查程式碼和OSS後端同學溝通。檢查到在傳送請求時callback的引數是在file下面。
這樣就會作為file的一部分。調整一下位置
業務伺服器上也如願的抓到了請求
總結一下就是細心,還是細心。不要急躁多除錯,最終會得到想得到的。
附件附上完整的postobject callback java版程式碼
相關文章
- go-zero之支付回撥問題Go
- 伺服器收不到支付寶notify_url非同步回撥請求的問題排查伺服器非同步
- 關於生產系統鎖問題的排查
- TabLayout 踩坑之 onTabSelected 沒有被回撥的問題TabLayout
- 併發插入引起的死鎖問題排查
- 介面與回撥(相關話題:特定事件發生應該採取動作、監聽)事件
- Activity生命週期回撥是如何被回撥的?
- java問題排查Java
- JVM 問題排查JVM
- 框架問題排查框架
- [JS]回撥函式和回撥地獄JS函式
- 生產環境部署springcloud微服務啟動慢的問題排查SpringGCCloud微服務
- 記一次SparkStreaming不產生新的batchJob的問題排查SparkBAT
- Arthas 實踐——生產環境排查 CPU 飈高問題
- Android 微信分享後留在微信,沒有回撥的問題解決方案Android
- ajax回撥中使用window.open彈窗被chrome攔截的問題Chrome
- ajax回撥函式執行順序帶來的同步非同步問題函式非同步
- Java開發必須掌握的線上問題排查命令Java
- 一次線上問題排查所引發的思考
- 用Promise建構函式來解決地獄回撥問題Promise函式
- 支付寶PC端單筆支付同步回撥session失效問題Session
- 線上併發事務死鎖問題排查
- SDK與問題排查
- 回撥函式的作用函式
- 線上FullGC問題排查實踐——手把手教你排查線上問題GC
- 解決ajax回撥window.open瀏覽器阻止彈窗問題瀏覽器
- 回撥函式函式
- 微博回撥介面
- java介面回撥Java
- 非同步/回撥非同步
- JS 回撥模式JS模式
- C++回撥C++
- js 回撥 callbackJS
- 如何排查網路問題-開發眼裡的網路
- Data-Mediator專題之屬性回撥
- C++屌屌的觀察者模式-同步回撥和非同步回撥C++模式非同步
- 排查Java的記憶體問題Java記憶體
- sqlldr載入效能問題的排查SQL