配置剪輯完成時(shí)的回調(diào)
在使用智能媒體服務(wù)云剪輯服務(wù)時(shí),您可通過設(shè)置回調(diào)事件及時(shí)獲取任務(wù)處理進(jìn)展和狀態(tài),以便進(jìn)行其他業(yè)務(wù)操作。通過閱讀本文,您可以了解配置剪輯完成時(shí)回調(diào)的方法。
回調(diào)方式說明
智能媒體服務(wù)支持通過HTTP請求和MNS隊(duì)列兩種回調(diào)方式獲取事件通知,詳情請參見回調(diào)方式說明。
實(shí)現(xiàn)說明
配置剪輯完成時(shí)的回調(diào)可以通過自定義單任務(wù)回調(diào)地址或配置全局回調(diào)地址來實(shí)現(xiàn):
自定義單任務(wù)回調(diào)地址:是在提交剪輯合成任務(wù)時(shí)指定的回調(diào)地址,您需要調(diào)用SubmitMediaProducingJob接口,傳入HTTP(S)回調(diào)地址或MNS回調(diào)地址。
如果選擇HTTP(S)回調(diào),您需要部署一個(gè)HTTP服務(wù)來接收回調(diào)消息,并在剪輯合成請求中配置回調(diào)URL;當(dāng)剪輯合成任務(wù)完成時(shí),IMS服務(wù)端會對該URL發(fā)起HTTP POST請求,任務(wù)完成情況內(nèi)容將通過HTTP Body送達(dá)給用戶。
如果選擇MNS回調(diào),則需要用戶在任務(wù)完成的地域(Region)配置以
ice-callback
開頭的消息隊(duì)列,IMS服務(wù)器會將消息內(nèi)容發(fā)送至您的MNS消息隊(duì)列中。
配置全局回調(diào)地址:適用于所有媒體處理任務(wù)的回調(diào)通知。您可以在智能媒體服務(wù)的全局設(shè)置中指定一個(gè)MNS消息隊(duì)列地址作為全局回調(diào)地址。當(dāng)任何任務(wù)完成時(shí),智能媒體服務(wù)會將回調(diào)通知發(fā)送到配置的全局回調(diào)地址。
說明僅支持MNS消息的配置。
回調(diào)事件的消息結(jié)構(gòu)
關(guān)于剪輯合成任務(wù)完成時(shí)的消息結(jié)構(gòu),請參見事件列表。
前提條件
如果回調(diào)方式為MNS隊(duì)列,您需要先授權(quán)MNS訪問權(quán)限。具體操作,請參見開通輕量消息隊(duì)列(原 MNS)并授權(quán)。
自定義單任務(wù)回調(diào)地址
您可以使用自定義單任務(wù)回調(diào)地址來處理剪輯任務(wù)完成時(shí)的回調(diào)通知。在調(diào)用SubmitMediaProducingJob提交剪輯合成任務(wù)時(shí),可以在請求中傳入一個(gè)包含HTTP(S)或MNS回調(diào)地址的UserData參數(shù)。示例如下所示:
HTTP(S)回調(diào)地址
{"NotifyAddress":"http(s)://**.**.***"}
MNS回調(diào)地址(必須以
ice-callback
開頭的消息隊(duì)列才可以進(jìn)行回調(diào)){"NotifyAddress":"ice-callback-****"}
配置全局回調(diào)地址
在輕量消息隊(duì)列(原MNS)控制臺創(chuàng)建回調(diào)消息隊(duì)列,隊(duì)列名稱必須以
ice-callback
開頭。具體操作,請參見創(chuàng)建隊(duì)列。調(diào)用SetEventCallback設(shè)置事件回調(diào),傳入
CallbackQueueName
,即步驟 1中的隊(duì)列名稱。監(jiān)聽步驟 1中的消息隊(duì)列,并對消息進(jìn)行處理。示例代碼如下所示:
說明以下示例代碼中引入的服務(wù)端SDK版本號僅供參考,獲取最新的版本請參見服務(wù)端SDK。
<dependencies> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.9</version> </dependency> <dependency> <groupId>com.aliyun.mns</groupId> <artifactId>aliyun-sdk-mns</artifactId> <version>1.1.9</version> </dependency> </dependencies>
import java.util.List; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.aliyun.mns.client.CloudAccount; import com.aliyun.mns.client.CloudQueue; import com.aliyun.mns.client.MNSClient; import com.aliyun.mns.common.ClientException; import com.aliyun.mns.common.ServiceException; import com.aliyun.mns.common.utils.ServiceSettings; import com.aliyun.mns.model.Message; public class IceProduceMessageConsumerDemo { public static void main(String[] args) { // 讀取 ~/.aliyun-mns.properties 文件中的mns 配置: // mns.accesskeyid, mns.accesskeysecret, mns.queue.endpoint // ak/sk 所屬子用戶擁有 MNS 的完全讀寫權(quán)限 CloudAccount account = new CloudAccount( ServiceSettings.getMNSAccessKeyId(), ServiceSettings.getMNSAccessKeySecret(), ServiceSettings.getMNSAccountEndpoint()); MNSClient client = account.getMNSClient(); //this client need only initialize once // Demo for receive message code try{ CloudQueue queue = client.getQueueRef("ice-callback-test");// replace with your queue name List<Message> messages = queue.batchPopMessage(10, 30); for(Message popMsg : messages) { if (popMsg != null){ System.out.println("message handle: " + popMsg.getReceiptHandle()); System.out.println("message body: " + popMsg.getMessageBodyAsString()); System.out.println("message id: " + popMsg.getMessageId()); System.out.println("message dequeue count:" + popMsg.getDequeueCount()); JSONObject jsonObject = JSON.parseObject(popMsg.getMessageBodyAsString()); // 只處理 ProduceMediaComplete 類型消息: if("ProduceMediaComplete".equals(jsonObject.getString("EventType"))){ JSONObject messageBody = jsonObject.getJSONObject("MessageBody"); System.out.println("ProjectId:" + messageBody.getString("ProjectId")); System.out.println("JobId:" + messageBody.getString("JobId")); System.out.println("Status:" + messageBody.getString("Status")); System.out.println("MediaId:" + messageBody.getString("MediaId")); System.out.println("MediaURL:" + messageBody.getString("MediaURL")); //<<to add your special logic.>> //remember to delete message when consume message successfully. //queue.deleteMessage(popMsg.getReceiptHandle()); System.out.println("delete message successfully.\n"); } } } } catch (ClientException ce) { System.out.println("Something wrong with the network connection between client and MNS service." + "Please check your network and DNS availability."); ce.printStackTrace(); } catch (ServiceException se) { if (se.getErrorCode().equals("QueueNotExist")) { System.out.println("Queue is not exist.Please create queue before use"); } else if (se.getErrorCode().equals("TimeExpired")) { System.out.println("The request is time expired. Please check your local machine timeclock"); } /* you can get more MNS service error code in following link. http://bestwisewords.com/document_detail/mns/api_reference/error_code/error_code.html?spm=5176.docmns/api_reference/error_code/error_response */ se.printStackTrace(); } catch (Exception e) { System.out.println("Unknown exception happened!"); e.printStackTrace(); } client.close(); } }