PublishMessage 政策

本頁適用於 ApigeeApigee Hybrid

查看 Apigee Edge 說明文件。

政策圖示

總覽

您可以使用 PublishMessage 政策,將 API 代理程式流程資訊發布至 Google Cloud Pub/Sub 主題。Google Pub/Sub 可讓服務以非同步方式通訊,且延遲時間大幅縮短。如要進一步瞭解 Pub/Sub,請參閱「什麼是 Pub/Sub?」。您要發布至 Pub/Sub 主題的資訊可以是文字值或流程變數。您也可以使用訊息範本,指定文字文字和流程變數的組合。

如果發布要求成功,Apigee 會將 publishmessage.message.id 流程變數設為 Pub/Sub 伺服器傳回的值。詳情請參閱「流程變數」。

這項政策是標準政策,可部署至任何環境類型。如要瞭解政策類型和各環境類型的可用性,請參閱「政策類型」。

驗證和 Proxy 部署

如要執行「PublishMessage」政策,您需要提供驗證權杖。不過,政策定義中並未明確提供 <Authentication> 元素。您必須部署 API 代理才能使用 Google 驗證,這會在幕後將驗證權杖新增至要求。如要瞭解如何部署使用 Google 驗證機制的 API Proxy,請參閱「部署步驟」。除了在 API 代理程式中使用 Google 驗證機制外,您必須使用具有 pubsub.topics.publish 權限的角色,透過服務帳戶部署 API 代理程式。如要進一步瞭解 Pub/Sub 的 Identity and Access Management (IAM) 角色,請參閱「權限和角色」一文。

<PublishMessage>

指定 PublishMessage 政策。

預設值 不適用
是否必要? 必填
類型 複雜類型
上層元素 N/A
子元素 <Attributes>
<CloudPubSub>
<DisplayName>
<IgnoreUnresolvedVariables>
<Source>
<UseMessageAsSource>

下表概略說明 <PublishMessage> 的子元素:

子元素 是否必要 說明
<Attributes> 選用 一組要附加至 Pub/Sub 訊息的屬性。
<CloudPubSub> 必填 <Topic> 的父元素。<Topic> 元素會指定您要發布訊息的 Pub/Sub 主題。
<DisplayName> 選用 政策的自訂名稱。
<IgnoreUnresolvedVariables> 選用 指定如果 Apigee 遇到未解析的變數,是否要停止處理。
<Source> 選用 指定要發布至 Pub/Sub 主題的訊息。這個元素是選用元素,但您必須使用 <Source><UseMessageAsSource>
<UseMessageAsSource> 選用 指定要發布至 Pub/Sub 主題的訊息。這個元素是選用元素,但您必須使用 <Source><UseMessageAsSource>
其他子元素
<Topic> 必填 <CloudPubSub> 的子元素。指定要發布訊息的 Pub/Sub 主題。

<PublishMessage> 元素使用以下語法:

語法

<PublishMessage continueOnError="[true|false]" enabled="[true|false]" name="Publish-Message-1">
    <DisplayName>DISPLAY_NAME</DisplayName>
    <Source>SOURCE_VALUE</Source>
    <CloudPubSub>
        <Topic>TOPIC_NAME</Topic>
    </CloudPubSub>
    <IgnoreUnresolvedVariables>[true|false]</IgnoreUnresolvedVariables>
</PublishMessage>

範例 - 來源

以下範例顯示 <PublishMessage> 政策定義:

<PublishMessage continueOnError="false" enabled="true" name="Publish-Message-1">
    <DisplayName>Publish Message-1</DisplayName>
    <Source>this is a message template {flow-variable1}</Source>
    <CloudPubSub>
        <Topic>projects/{flow-variable-project-id}/topics/{flow-variable-topic-name}</Topic>
    </CloudPubSub>
    <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
</PublishMessage>

範例 - UseMessageAsSource

這項 <PublishMessage> 政策會指定 UseMessageAsSource 元素:

<PublishMessage continueOnError="false" enabled="true" name="Publish-Message-2">
    <UseMessageAsSource>request</UseMessageAsSource>
    <CloudPubSub>
        <Topic>projects/{flow-variable-project-id}/topics/{flow-variable-topic-name}</Topic>
    </CloudPubSub>
    <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
</PublishMessage>

範例 - 屬性

這項 <PublishMessage> 政策會指定 Attributes 元素:

<PublishMessage name="Publish-Message-3">
  <Source>this is a message template {flow-variable1}</Source>
  <Attributes>
    <Attribute name='attr-name-0'>fixed-value</Attribute>
    <Attribute name='another-attribute-name'>{request.queryparam.attr1}</Attribute>
    <Attribute name='a-third-attribute-name'>{request.queryparam.attr2:default-value}</Attribute>
  </Attributes>
  <CloudPubSub>
    <Topic>projects/{flow-variable-project-id}/topics/{flow-variable-topic-name}</Topic>
  </CloudPubSub>
  <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
</PublishMessage>

這個元素包含下列所有政策都適用的屬性:

屬性 預設 是否必要? 說明
name 不適用 必要

政策的內部名稱。name 屬性的值可以包含英文字母、數字、空格、連字號、底線和句號。這個值不得超過 255 個半形字元。

您可以選擇使用 <DisplayName> 元素,在管理 UI 代理程式編輯器中為政策加上不同、自然語言的名稱。

continueOnError false 選用 將其設為 false,即可在政策失敗時傳回錯誤。這是大多數政策的預期行為。將其設為 true,即使政策失敗,流程執行作業仍會繼續進行。另請參閱:
enabled 選用 設為 true 即可強制執行政策。設為 false 即可關閉政策。即使政策仍附加至流程,系統也不會強制執行這項政策。
async   false 已淘汰 此屬性已淘汰。

子元素參照

本節將說明 <PublishMessage> 的子元素。

<Attributes>

指定要附加至 Pub/Sub 訊息的屬性。

每個屬性都是鍵/值組合。與屬性相關聯的名稱不得重複。每個值的值會在執行階段透過訊息範本動態決定。

預設值 不適用
是否必要? 必填
類型 字串
上層元素 <PublishMessage>
子元素

<Attributes> 元素使用以下語法:

語法

  <Attributes>
    <Attribute name='NAME-1'>fixed-value</Attribute>
    <Attribute name='NAME-2'>{flow-variable}</Attribute>
    ...
    <Attribute name='NAME-N'>message template here {flow-variable:default-value}</Attribute>
  </Attributes>

範例 1

以下範例會在發布訊息時,設定具有固定值的單一屬性:

<PublishMessage name="PM-with-one-attribute">
  <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
  <Source>{request.queryparam.message}</Source>
  <Attributes>
    <Attribute name='my-attribute-1'>fixed-value</Attribute>
  </Attributes>
  <CloudPubSub>
    <Topic>projects/{request.queryparam.project}/topics/{request.queryparam.topic}</Topic>
  </CloudPubSub>
</PublishMessage>

範例 2

以下範例會在發布訊息時設定多個屬性,其中部分屬性的值會在執行階段動態決定:

<PublishMessage name="PM-with-multiple-attributes">
  <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
  <Source>{my-assembled-message}</Source>
  <Attributes>
    <Attribute name='attr-0'>fixed-value</Attribute>
    <Attribute name='attr-1'>{flow-variable1}</Attribute>
    <Attribute name='attr-2'>fixed portion {flow-variable2:default-value}</Attribute>
  </Attributes>
  <CloudPubSub>
    <Topic>projects/{propertyset.settings.project}/topics/{propertyset.settings.topic}</Topic>
  </CloudPubSub>
</PublishMessage>

<DisplayName>

除了 name 屬性之外,您也可以在管理 UI 代理程式編輯器中使用其他更自然的名稱標記政策。

<DisplayName> 元素適用於所有政策。

預設值 不適用
是否必要? (非必要) 如果省略 <DisplayName>,系統會使用政策的 name 屬性值。
類型 字串
上層元素 <PolicyElement>
子元素

<DisplayName> 元素使用以下語法:

語法

<PolicyElement>
  <DisplayName>POLICY_DISPLAY_NAME</DisplayName>
  ...
</PolicyElement>

範例

<PolicyElement>
  <DisplayName>My Validation Policy</DisplayName>
</PolicyElement>

<DisplayName> 元素沒有屬性或子項元素。

<Source>

指定要發布的訊息。

訊息可以是文字值、流程變數,或兩者的組合,格式為訊息範本

預設值 不適用
是否必要? 選用
類型 字串
上層元素 <PublishMessage>
子元素

<Source> 元素使用以下語法:

語法

 <Source>SOURCE</Source>

Example-1

以下範例會將來源訊息設為 flow-var-1 流程變數的值:

<Source>{flow-var-1}</Source>

Example-2

以下範例使用訊息範本,發布含有動態內容的 JSON 訊息:

<PublishMessage name="PM-with-source-template">
  <Source>{
    "name": "value-1",
    "count": "{flow-variable1}",
    "action": "{flow-variable2}"
  }</Source>
  <Attributes>
    <Attribute name='content-type'>application/json</Attribute>
  </Attributes>
  <CloudPubSub>
    <Topic>projects/{propertyset.settings.project}/topics/{propertyset.settings.topic}</Topic>
  </CloudPubSub>
</PublishMessage>

<CloudPubSub>

<Topic> 的父元素。

您只能發布至一個 Pub/Sub 主題。因此,<CloudPubSub> 元素中只能包含一個 <Topic> 元素。

預設值 不適用
是否必要? 必填
類型 複雜類型
上層元素 <PublishMessage>
子元素 <Topic>

<CloudPubSub> 元素使用以下語法:

語法

<CloudPubSub>
  <Topic>TOPIC_NAME</Topic>
</CloudPubSub>

範例

以下範例顯示 <CloudPubSub> 元素的宣告:

<CloudPubSub>
  <Topic>projects/{my-project}/topics/{my-topic}</Topic>
</CloudPubSub>

<Topic>

指定要發布 <Source> 訊息的 Pub/Sub 主題。

您必須以 projects/project-id/topics/topic-name 格式指定主題名稱。

預設值 不適用
是否必要? 必填
類型 字串
上層元素 <CloudPubSub>
子元素

<Topic> 元素使用以下語法:

語法
<Topic>TOPIC_NAME</Topic>
範例

以下範例會指定要發布至的 Pub/Sub 主題:

<Topic>projects/project-id-marketing/topics/topic-name-test1</Topic>

在這個範例中,project-id-marketing 是您的 Google Cloud 專案 ID,topic-name-test1 則是訊息應發布的主題。

<UseMessageAsSource>

指定要發布的訊息。

請改用這個元素,取代 <Source> 元素。這個值應為參照訊息的流程變數名稱,例如 requestresponsemessage。指定這個元素時,政策會使用訊息內容做為要發布的訊息。如果訊息內容是無法以字串表示的八位元組串流 (例如二進位檔案的內容),請使用這個元素,而非 <Source>

預設值 不適用
是否必要? 選用
類型 字串
上層元素 <PublishMessage>
子元素

<UseMessageAsSource> 元素使用以下語法:

語法

<PublishMessage name="PM-with-use-message-as-source">
  <UseMessageAsSource>MESSAGE_NAME</UseMessageAsSource>
  <Attributes>
    <Attribute name='attr-1'>{flowvar1}</Attribute>
  </Attributes>
  <CloudPubSub>
    <Topic>projects/{flowvar1}/topics/{flowvar-topic}</Topic>
  </CloudPubSub>
</PublishMessage>

Example-1

以下範例會告知政策使用要求訊息的內容,做為 Pub/Sub 訊息的酬載:

<PublishMessage name="PM-with-use-message-as-source">
  <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
  <UseMessageAsSource>request</UseMessageAsSource>
  <Attributes>
    <Attribute name='attr-1'>{flowvar1}</Attribute>
  </Attributes>
  <CloudPubSub>
    <Topic>projects/{propertyset.settings.project}/topics/{propertyset.settings.topic}</Topic>
  </CloudPubSub>
</PublishMessage>

<IgnoreUnresolvedVariables>

指定如果 Apigee 遇到未解析的變數,是否要停止處理。

預設值
是否必要? 選用
類型 布林值
上層元素 <PublishMessage>
子元素

將值設為 true 可略過未解析的變數並繼續處理;否則為 false。預設值為 false

<IgnoreUnresolvedVariables> 設為 true 與將 <PublishMessage>continueOnError 設為 true 不同。如果將 continueOnError 設為 true,Apigee 會忽略所有錯誤,而非只忽略變數中的錯誤。

<IgnoreUnresolvedVariables> 元素使用以下語法:

語法

<IgnoreUnresolvedVariables>[true|false]</IgnoreUnresolvedVariables>

範例

以下範例將 <IgnoreUnresolvedVariables> 設為 true

<IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>

流程變數

Flow 變數是用於儲存特定資料的物件,可在 API Proxy 流程中使用。這些變數會儲存酬載資訊、網址路徑、IP 位址,以及政策執行結果的資料。如要進一步瞭解流程變數,請參閱「使用流程變數」。

如果 PublishMessage 政策成功發布至 Pub/Sub 主題,Apigee 會將 publishmessage.message.id 流程變數設為 Pub/Sub 伺服器傳回的 messageId。流程變數的類型為字串,且您可以在 Proxy 要求流程之後使用該變數。您可以根據需求,在其他下游政策中使用流程變數。不過,如果發布失敗,Apigee 就不會設定 publishmessage.message.id 變數,因此存取這個變數會導致錯誤。

如要進一步瞭解各種類型的流程變數,請參閱「流程變數參考資料」。

錯誤代碼

本節說明這項政策觸發錯誤時,Apigee 傳回的錯誤代碼和錯誤訊息,以及 Apigee 設定的錯誤變數。如果您要開發錯誤處理規則,就必須瞭解這項資訊。如需更多資訊,請參閱「關於政策錯誤的相關資訊」和「處理錯誤」。

執行階段錯誤

政策執行時可能會發生這些錯誤。

錯誤代碼 HTTP 狀態 原因
steps.publishmessage.PermissionDeniedError 500 如果執行階段服務帳戶無法模擬 Proxy 服務帳戶,或是 Proxy 服務帳戶沒有發布至主題的權限,就會發生這項錯誤。
steps.publishmessage.ExecutionError 500 如果在將訊息發布至 Pub/Sub 時發生非預期錯誤,就會發生這個錯誤。您可以在錯誤訊息中查看錯誤詳細資料。
steps.publishmessage.MessageVariableNotMessageType 500 如果您在 UseMessageAsSource 中指定的變數名稱無法解析,或不是訊息類型,就會發生這個錯誤。

錯誤變數

每當政策發生執行錯誤時,Apigee 就會產生錯誤訊息。您可以在錯誤回應中查看這些錯誤訊息。很多時候,系統產生的錯誤訊息在產品情境中可能不相關。您可能會根據錯誤類型自訂錯誤訊息,讓訊息更有意義。

如要自訂錯誤訊息,您可以使用錯誤規則或 RaiseFault 政策。如要瞭解錯誤規則與 RaiseFault 政策的差異,請參閱「FaultRules 與 RaiseFault 政策」。您必須在錯誤規則和 RaiseFault 政策中,使用 Condition 元素檢查條件。Apigee 會提供每項政策專屬的錯誤變數,而錯誤變數的值會在政策觸發執行階段錯誤時設定。您可以使用這些變數,檢查特定錯誤情況並採取適當行動。如要進一步瞭解如何檢查錯誤條件,請參閱「建構條件」。

變數 地點 範例
fault.name fault.name 可與「執行階段錯誤」表格中列出的任何錯誤相符。 錯誤名稱是錯誤代碼的最後一個部分。 fault.name Matches "UnresolvedVariable"
publishmessage.POLICY_NAME.failed POLICY_NAME 是擲回錯誤的政策的使用者指定名稱。 publishmessage.publish-message-1.failed = true
如要進一步瞭解政策錯誤,請參閱「關於政策錯誤的相關資訊」。