添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

若要瞭解事件訂閱,請參閱 事件訂閱API

篩選事件訊息

本節包含篩選的程式碼片段,您可實施這些程式碼片段來減少事件訂閱訊息的負載。 為了協助顯示各種語言語法的差異,這些片段說明了使用下列語言撰寫的相同篩選器集:

您可以在 https://github.com/workfront/workfront-event-subscription-filter-examples 檢視篩選範例,您可以在此檢視每種語言的語法差異,以及與AWS SDK互動的方式。這些範例是以AWS Lambdas撰寫的,這是使用中介篩選與處理元件的常見方法。

下列程式碼片段幾近可供部署使用,可當作協助您撰寫自己的更複雜篩選器及處理元件的起點。

下列Java範例說明如何根據專案的群組識別碼來篩選專案裝載,如 ProjectGroupFiltering.java中所完成:

Map<String, Object> newState = (Map<String, Object>) webHookPayload.get("newState"); String projectGroupId = (String) newState.get("groupID"); logger.log("String projectGroupID is - " + projectGroupId); if (DESIRED_GROUP_ID.equals(projectGroupId)) { //process the message return ""; if (DESIRED_GROUP_ID.equals(projectGroupId)) { //process the message logger.log("Processing Event Subscription message matching groupId " + DESIRED_GROUP_ID + "..."); AWSLambda client = AWSLambdaClientBuilder.standard().build(); InvokeRequest request = new InvokeRequest() .withFunctionName("MyFunction") .withInvocationType("Event") .withLogType("Tail") .withPayload(jsonParser.toJson(webHookPayload)) InvokeResult response = client.invoke(request);

AWS SDK可用來叫用另一個Lambda,後者負責將篩選後的訊息傳遞至我們想要的端點。

將傳遞訊息的責任傳遞給另一個Lambda的目的是避免來自事件訂閱服務的傳遞請求逾時。 目前,傳遞允許的逾時設定為5秒。 如果篩選所需時間超過設定,您可以處理請求,但事件訂閱服務將會逾時,並進入重試回圈,直到在逾時期間內收到200層級的回應為止。

若要進一步瞭解如何管理訊息傳遞,請參閱 在調整逾時時時改善訊息傳遞

Python

Java和Python範例的主要差異在於,在Java範例中,會收到事件訂閱訊息作為第一個引數,而在Python範例中,第一個引數是Lambda Proxy「event」,其包含事件訂閱訊息以及AWS Lambda Proxy請求的資訊。

下列在Python中的範例顯示如何根據專案的群組識別碼來篩選專案裝載,如 projectGroupFiltering.py中所完成:

if new_state['groupID'] == DESIRED_GROUP_ID:
   # Process the message
   print('matched group ID')
   process_message(event_subscription_message)
return {
'statusCode': 200
                          
def process_message(event_subscription_message):
   aws_lambda.invoke(
      FunctionName='forwardMessageOntoMyEndpoint',
      InvocationType='Event',
      LogType='None',
      Payload=event_subscription_message
                          
if (projectGroupId === DESIRED_GROUP_ID) {
   // Process the message
   console.log('Processing Event Subscription message matching groupId ' + DESIRED_GROUP_ID + '...');
   forwardMessageOntoMyEndpoint(eventSubscriptionMessage, context);
} else {
   endLambdaRequest(context);
                          
function forwardMessageOntoMyEndpoint(eventSubscriptionMessage, context) {
   let lambdaParams = {
      FunctionName: 'forwardMessageOntoMyEndpoint',
      InvocationType: 'Event',
      LogType: 'None',
      Payload: new Buffer(JSON.stringify(eventSubscriptionMessage))
   lambda.invoke(lambdaParams, function (err, data) {
      if (err) {
         console.error(err, err.stack);
      } else {
         console.log('data = ' + data);
      endLambdaRequest(context);
        

改善訊息傳送,同時容納逾時

對於所有傳遞要求,事件訂閱服務的嚴格逾時為​ 五秒。 如果訊息的傳送超過允許的時間,「事件訂閱」服務會開始該訊息的重試週期。

例如,您建置專案群組識別碼篩選器,類似於篩選事件訊息中的其中一個範例,而且您包含資料庫查詢以判斷是否需要訊息。 資料庫查詢以及所需處理和Lambda冷啟動所需的時間可能會超過五秒,導致「事件訂閱」服務重新嘗試傳遞訊息。

若要避免重試,可將程式耗時的部分與負責判斷訊息是否是要處理和傳送的邏輯分開。 如此一來,您就可以接受訊息並傳回200層級的回應給事件訂閱服務,同時以非同步方式繼續在背景處理或篩選訊息(如需範例,請參閱Java中的步驟5)。

即使您的處理或篩選未超過五秒逾時,將訊息篩選或處理的第一個接觸點與使用者端的其他處理或傳送步驟分開,仍然有好處。 如此一來,從「事件訂閱」服務將訊息移交至目的地對雙方的時間和效能的影響就會降到最低。

若要深入瞭解重試機制,請參閱事件訂閱重試

在無雲架構中實作託管篩選器

如果您無法運用雲端架構進行事件訂閱篩選,您仍可使用篩選事件訊息中的範例,作為如何實作您自己的託管篩選器或處理元件的藍圖。

調整獨立服務的篩選範例

在無雲環境中使用篩選範例之前,請先執行下列動作:

public static List<Map<String, Object>> projectGroupFilteringStartupRecoveryQuery(LambdaLogger logger) {
    HttpClient httpClient = HttpClientBuilder.create().build();
    // Produces a URL of https://<my-domain>.workfront.com/attask/api/v15.0/PROJ/search?groupID=<DESIRED_GROUP_ID>
    replacing <...> with the appropriate values
    URI projectGroupQueryUri = generateProjectRecoveryQueryURI(logger);
    HttpUriRequest projectGroupIdGetRequest = new HttpGet(projectGroupQueryUri);
    // Our preferred method of authentication
    projectGroupIdGetRequest.addHeader("apiKey", WORKFRONT_API_KEY);
    List<Map<String, Object>> projects = null;
        HttpResponse response = httpClient.execute(projectGroupIdGetRequest);
        InputStream responseBodyStream = response.getEntity().getContent();
        Reader reader = new InputStreamReader(responseBodyStream);
        Type listType = new TypeToken<List<Map<String, Object>>>(){}.getType();
        projects = new GsonBuilder().create().fromJson(reader, listType);
      } catch (IOException e) {
        logger.log("An IOException was thrown while executing a request to Workfront for projects matching the group ID " + DESIRED_GROUP_ID);
    return projects;
        

在傳遞訊息中實作非同步處理

篩選事件訊息區段中的所有範例都會傳遞傳遞篩選的訊息給其他AWS Lambda。 這麼做可避免傳送請求超過五秒逾時,這是由發出請求的事件訂閱服務所強制執行。

在無雲架構中,您可能需要實作非同步處理機制,類似AWS SDK允許對其他AWS Lambda進行非同步呼叫的方式。 大部分的現代程式設計語言都有處理非同步處理的協力廠商或核心程式庫,可讓您運用範例中實作的非同步處理風格。

recommendation-more-help