ColdFusion と Azure Service Bus

概要

Microsoft Azure Service Bus は、管理されたエンタープライズ統合メッセージブローカーです。Service Bus は、アプリケーションとサービスを切り離すことができます。Service Bus は、非同期データおよび状態転送用のプラットフォームを提供します。

データは、メッセージを使用して様々なアプリケーションおよびサービス間で転送されます。メッセージは、バイナリ形式で、JSON、XML またはテキストを含めることができます。

データは、メッセージを使用して様々なアプリケーションおよびサービス間で転送されます。メッセージは、バイナリ形式で、JSON、XML またはテキストを含めることができます。

Service Bus を使用すると、データを転送したり、拡張性を高めたり、ワークフローを実装したり、トピックやサブスクリプションを管理したり、その他様々なことができます。

詳しくは、Service Bus の概要を参照してください。

名前空間

名前空間は、すべてのメッセージングコンポーネントのコンテナです。単一の名前空間に複数のキューおよびトピックを含めることができます。名前空間は、多くの場合、様々なアプリケーションおよびサービスのコンテナとして提供されます。

Message

メッセージは、キューに対して送受信されます。キューは、受信するアプリケーションが受信および処理できるようになるまで、メッセージを保存します。

トピック

トピックを使用して、メッセージを送受信することもできます。キューは、多くの場合、ポイントツーポイント通信に使用されますが、トピックは、パブリッシュ/サブスクライブのシナリオで便利です。

はじめに

azureservicebus パッケージのインストール

Zip インストーラーを使用する場合に限り、Adobe ColdFusion(2021 リリース)はモジュール化されています。デフォルトでは、Azure Service Bus のパッケージはインストールされていません。最初の手順は、ColdFusion の Service Bus パッケージをインストールすることです。

注意:GUI インストーラーを使用する場合、これらのパッケージは事前にインストールされています。

Service Bus のパッケージは、azureservicebus と呼ばれます。

azureservicebus パッケージをインストールするには、ColdFusion Administrator のパッケージマネージャーページを使用するか、以下の手順に従います。

  1. <CF_HOME>/cfusion/bin に移動します。

  2. 次のコマンドを入力します。

    • Windows:cfpm.bat
    • Linux:cfpm.sh
  3. コマンド install azureservicebus を入力します。

    Azure Service Bus パッケージがインストールされるまで待ちます。

詳しくは、ColdFusion パッケージマネージャーを参照してください。

クラウドサービス資格情報および設定の追加

ColdFusion(2021 リリース)には、様々なクラウドサービスにアクセスするためのオブジェクトを作成するためにハンドルを提供するメソッド、getCloudService() があります。

サービスハンドルのシンタックスを次に示します。

service=getCloudService(cloudCred,cloudConfig)

  • cloudCred:クラウドサービスの資格情報を定義します。構造体または文字列です(資格情報エイリアスとも呼ばれます)。
  • cloudConfig:クラウドサービス設定の詳細を定義します。構造体または文字列です(設定エイリアスとも呼ばれます)。

Azure 資格情報を獲得したら、次のいずれかの方法でこれらの資格情報を宣言する必要があります。それによって初めて、これらの資格情報を使用して Service Bus オブジェクトを作成でき、それからそのオブジェクトを使用して様々な Service Bus メソッドを呼び出すことができます。

ColdFusion Administrator

資格情報の設定

ColdFusion Administrator で、データとサービス/クラウド資格情報をクリックします。

エイリアスは、クラウドサービスおよびその設定の詳細の名前付き表現です。ColdFusion Administrator を使用して設定エイリアスを設定できます。

接続文字列には、アプリケーションから Azure Storage アカウントのデータにアクセスするために必要な認証情報が含まれています。

詳しくは、Azure Storage の接続文字列を構成するを参照してください。

詳細を入力したら、「資格情報を追加」をクリックします。

設定オプションの設定

ColdFusion Administrator で、「データとサービス/クラウド設定」をクリックします。

設定エイリアス、ベンダー、サービスの名前など、次の詳細を入力します。

クラウド設定オプションの追加
クラウド設定オプションの追加

設定オプションを追加した後、さらにいくつかのオプションを追加する必要がある場合があります。次に表示される画面で追加できます。場合によって追加する必要があるオプションを次に示します。

  • 操作タイムアウト
  • 再試行ポリシー

詳しくは、クラウド設定オプションを参照してください。

オブジェクトの作成

Blob 資格情報および設定オプションのエイリアスを作成したら、getCloudService API を使用してオブジェクトを作成し、次のコードを CFM に含めることができます。 

sbObject= getCloudService("sbCred", "sbConf")

Application.cfc

Application.cfc で Blob 資格情報および設定オプションを指定できます。次に例を示します。

<cfscript> 
        this.sqsCred  = { 
            &quot;alias&quot; : &quot;firstAWSCred&quot;, 
            &quot;vendorName&quot; : &quot;AZURE&quot;, 
            &quot;region&quot; : &quot;us-west-2&quot;, 
            &quot;secretAccessKey&quot; : &quot;xxxxxxxxxxxxxxxxxxx&quot;, 
            &quot;accessKeyId&quot; : &quot;xxxxxxxxxxxxxxxxxx&quot; 
        } 
         
        this.sqsConf  = { 
            &quot;serviceName&quot; : &quot;SERVICE_BUS&quot; 
        } 
        this.serviceBusCred = { 
            &quot;vendorName&quot; : &quot;AZURE&quot;, 
                &quot;connectionString&quot; : &quot;xxxxxxxxxx&quot; 
        } 
  
        this.serviceBusConf = { 
            &quot;serviceName&quot; : &quot;SERVICE_BUS&quot; 
        } 
    </cfscript>

オブジェクトの作成

sbObject = getCloudService(this.serviceBusCred, this.serviceBusConf)

CFM ページ上

CFM ページでは、次に示す 4 つの方法のいずれかで Service Bus 資格情報および設定オプションを指定できます。

資格情報エイリアスおよび設定エイリアス

Azure Blob 資格情報および設定オプション用のエイリアスを作成したら、次に示すように、getCloudService ハンドルでそれらのエイリアスを使用できます。

<cfscript> // ColdFusion Administrator で資格情報エイリアスと設定エイリアスを定義 sbObject=getCloudService(&quot;sbCred&quot;,&quot;sbConf&quot;) // 以下にコードを記述 ...........</cfscript>

資格情報エイリアスおよび設定オプションの構造体

<cfscript> sbCred = { &quot;vendorName&quot; : &quot;AZURE&quot;, &quot;connectionString&quot; : &quot;xxxxxx&quot; } sbConf = { &quot;serviceName&quot; : &quot;AZURE_SERVICEBUS&quot;, &quot;options&quot; : { &quot;operationTimeout&quot; : &quot;10s&quot;, &quot;retryPolicy&quot;:&quot;default&quot; } } </cfscript>

設定エイリアスおよび資格情報の構造体

<cfscript> // 設定エイリアスとサービス資格情報構造体を使用 // Service Bus 資格情報 sbCred= { &quot;vendorName&quot; : &quot;AZURE&quot;, &quot;connectionString&quot; : &quot;xxxxxx&quot; } sb= getCloudService(sbCred, &quot;sbConf&quot;) // 以下にコードを記述 .....................................</cfscript>

資格情報と設定オプションの両方の構造体

<cfscript> // クラウドの資格情報と設定の構造体を使用 sbCred = { &quot;vendorName&quot; : &quot;AZURE&quot;, &quot;connectionString&quot; : &quot;xxxxxx&quot; } sbConf = { &quot;serviceName&quot; : &quot;AZURE_SERVICEBUS&quot;, &quot;options&quot; : { &quot;operationTimeout&quot; : &quot;10s&quot;, &quot;retryPolicy&quot;:&quot;default&quot; } } sb= getCloudService(sbCred , sbConf ) // 以下にコードを記述 ...................................................................</cfscript>

Admin API

また、Admin API を使用して Service Bus 資格情報および設定オプションを追加することもできます。資格情報および設定を追加するためのメソッドは、cloud.cfc で使用できます。

次に、メソッド addCredential(struct credential) および addServiceConfig(struct config) の使用例を示します。

資格情報の追加

<cfscript> 
  // Administrator コンポーネントのオブジェクトを作成して login メソッドを呼び出す 
  adminObj = createObject(&quot;component&quot;,&quot;cfide.adminapi.administrator&quot;) 
  adminObj.login(&quot;admin&quot;) 
   
  // クラウドコンポーネントのオブジェクトを作成 
  cloudObj = createObject(&quot;component&quot;,&quot;cfide.adminapi.cloud&quot;) 
   
  // 資格情報構造体を定義 
  credentialStruct={ 
        &quot;vendorName&quot; : &quot;AZURE&quot;, 
        &quot;connectionString&quot; : &quot;xxxxxx&quot; 
  } 
   
  // 資格情報の credentialStruct を追加 
  try{ 
    cloudObj.addCredential(credentialStruct) 
    writeOutput(&quot;Credentials added successfully&quot;) 
  } 
  catch(any e){ 
      writeDump(e) 
  } 
</cfscript>

設定の追加

<cfscript> // Administrator コンポーネントのオブジェクトを作成して login メソッドを呼び出す adminObj = createObject(&quot;component&quot;,&quot;cfide.adminapi.administrator&quot;) adminObj.login(&quot;admin&quot;) // クラウドコンポーネントのオブジェクトを作成 cloudObj = createObject(&quot;component&quot;,&quot;cfide.adminapi.cloud&quot;) // 設定構造体を定義 configStruct= { &quot;serviceName&quot; : &quot;AZURE_SERVICEBUS&quot;, &quot;options&quot; : { &quot;operationTimeout&quot; : &quot;10s&quot;, &quot;retryPolicy&quot;:&quot;default&quot; } } // 設定の configStruct を追加 try{ cloudObj.addServiceConfig(configStruct) writeOutput(&quot;Configuration service added successfully&quot;) } catch(any e){ writeDump(e) } </cfscript>

CFSetup

CFSetup 設定ユーティリティを使用して SQS の資格情報と設定をセットアップすることもできます。

クラウド資格情報の追加

  • add cloudcredential credentialAlias=s3cred accesskeyid=<access> secretaccesskey=<secret> region=ap-southeast-1 vendorname=AWS

資格情報の設定

  • set cloudcredential snscred secretaccesskey=awssecret

クラウド設定の追加

  • add cloudconfiguration serviceName=S3 alias=s3Config

設定の設定

  • set cloudconfiguration conf1 alias=conf2

ColdFusion Administrator

ColdFusion Administrator/設定で、Service Bus イベントの処理に使用されるスレッドプール設定を変更できます。

  • コアプールサイズ:保持しておく必要があるワーカースレッドの最小数です。
  • 最大プールサイズ:プールで使用可能なスレッドの最大数です。
  • キープアライブ時間:アイドルスレッドのタイムアウトまでの待機時間(ミリ秒単位)です。
sb-admin

トピックの作成

Service Bus では、トピックに複数の独立したサブスクリプションを含めることができます。トピックのサブスクライバーは、そのトピックに送信された各メッセージのコピーを受信できます。複数のレシーバーが 1 つのサブスクリプションに割り当てられる可能性があります。トピックには 0 個以上のサブスクリプションを含めることができますが、サブスクリプションは 1 つのトピックにのみ属することができます。

<cfscript> sb = getcloudService(this.serviceBusCred, this.serviceBusConf) // トピックメタデータ createTopicMetadata = { &quot;autoDeleteOnIdle&quot; = &quot;45M&quot;, &quot;requiresDuplicateDetection&quot; = &quot;yes&quot;, //&quot;maxSize&quot; = 1024, &quot;entityStatus&quot; = &quot;Active&quot;, &quot;userMetadata&quot; = &quot;my user metadata&quot;, &quot;enableBatchedOperations&quot; = &quot;true&quot;, &quot;enablePartitioning&quot; = &quot;yes&quot; } //sb.deleteTopic(&quot;secondTopic&quot;) tempTopic = sb.createTopic(&quot;Topic_005&quot;, createTopicMetadata) //sb.deleteTopic(&quot;firstTopic&quot;) writeDump(tempTopic) //writeDump(sb.listTopics()) </cfscript>

サブスクリプションの作成

アプリケーションは、キューから受信するのと同じ方法で、QueueClient または MessageSession オブジェクトを使用して、サブスクリプションからメッセージを受信します。トピックには 0 個以上のサブスクリプションを含めることができますが、サブスクリプションは 1 つのトピックにのみ属することができます。詳しくは、Azure SB サブスクリプションを参照してください。

<cfscript> sb = getcloudService(this.serviceBusCred, this.serviceBusConf) subscriptionMetadata={ &quot;subscriptionName&quot;=&quot;sub_1&quot;, &quot;topicPath&quot;=&quot;Topic_005&quot;, &quot;lockDuration&quot; = &quot;77s&quot;, &quot;maxDeliveryCount&quot; = 12, &quot;enableDeadLetteringOnMessageExpiration&quot;=&quot;true&quot;, &quot;enableDeadLetteringOnFilterEvaluationException&quot;=&quot;true&quot; } mysub=sb.subscribe(subscriptionMetadata) writeDump(mysub) </cfscript>

キューへのメッセージの送信

キューを作成したら、sendMessage 関数を使用して、メッセージをキューに送信できます。詳しくは、公式ドキュメントを参照してください。

<cfscript> sb = getcloudService(this.serviceBusCred, this.serviceBusConf) sb.deleteQueue(&quot;Queue18&quot;) // メッセージを送信 sendMessageMetadata = { &quot;messageBody&quot; = &quot;my message is here&quot;, &quot;messageProperties&quot; = { &quot;myatt1&quot; = &quot;att1,att2&quot; } } tempQ = sb.createQueue(&quot;Queue18&quot;) //writedump(tempQ) mypath=tempQ.getPath() sendMessageResponse = tempQ.sendMessage(sendMessageMetadata) writeDump(sendMessageResponse) </cfscript>

メンバー関数

<cfscript> sb = getcloudService(this.serviceBusCred, this.serviceBusConf); myQ = sb.listQueues().get(&quot;queueList&quot;)[1] sendMessage() public function sendMessage() { writeoutput(&quot;send message response&quot;) closure = function (){ writeoutput(&quot;my function my choice&quot;) } sendMessageMetadata = { &quot;messageBody&quot; = &quot;my message my choice&quot;, &quot;messageProperties&quot; = { &quot;myatt1&quot; = &quot;att1,att2&quot; } } sendMessageResponse = myQ.sendMessage(sendMessageMetadata) writeDump(sendMessageResponse) } </cfscript>

キューのリスト表示

すべてのキューをリスト表示するには、listQueues 関数を使用します。

<cfscript> sb = getcloudService(this.serviceBusCred, this.serviceBusConf) // すべてのキューをリストアップ allQueues=sb.listQueues() writeDump(allQueues) </cfscript>

メンバー関数

<cfscript> sb = getcloudService(this.serviceBusCred, this.serviceBusConf); myQ = sb.listQueues().get(&quot;queueList&quot;)[1] writeDump(myQ.getDescription()) </cfscript>

キューの削除

キューを削除するには、deleteQueue 関数を使用します。この関数は、キューの名前をパラメーターとして取ります。

<cfscript> sb = getcloudService(this.serviceBusCred, this.serviceBusConf) // すべてのキューをリストアップ try{ sb.deleteQueue(&quot;Queue8&quot;) writeOutput(&quot;Queue deleted successfully&quot;) } catch (any e){ writeOutput(&quot;Unable to delete queue&quot;) } </cfscript>

キューの更新

キューを更新するには、updateQueue 関数を使用します。この関数は、次のパラメーターを受け入れます。

  • キューの名前
  • メタデータ構造体

メタデータ構造体は、次の値で構成されます。

  • "autoDeleteOnIdle" = "time",
  • "enableDeadLetteringOnMessageExpiration" = false|true,
  • "entityStatus" = "Disabled|Enabled",
  • "userMetadata" = "some metadata",
  • "enableBatchedOperations" = "no|yes"

<cfscript> sb = getcloudService(this.serviceBusCred, this.serviceBusConf) // キュー属性を定義 lockDuration = 51 qName = &quot;Q_001&quot; queueAttributes = { &quot;autoDeleteOnIdle&quot; = &quot;240h&quot;, &quot;enableDeadLetteringOnMessageExpiration&quot; = true, &quot;maxDeliveryCount&quot; = 101, &quot;requiresDuplicateDetection&quot; = &quot;YES&quot;, // 更新で変更できない&quot;lockDuration&quot; = &quot;#lockDuration#s&quot;, //&quot;maxSizeInMB&quot; = 2048, // デフォルト値を確認 &quot;entityStatus&quot; = &quot;Active&quot;, &quot;userMetadata&quot; = &quot;some user metadata : data val&quot;, &quot;enableBatchedOperations&quot; = true, &quot;enablePartitioning&quot; = false // 更新で変更できない} 
    queueAttributesUpdated = { &quot;autoDeleteOnIdle&quot; = &quot;10M&quot;, &quot;enableDeadLetteringOnMessageExpiration&quot; = false, &quot;entityStatus&quot; = &quot;Disabled&quot;, &quot;userMetadata&quot; = &quot;some new user metadata&quot;, &quot;enableBatchedOperations&quot; = &quot;no&quot; } // キューを作成 sb.createQueue(qName, queueAttributes) try{ sb.updateQueue(qName, queueAttributesUpdated) writeOutput(&quot;Queue updated successfully.&quot;) 
    } 
    catch (any e){ writeOutput(&quot;Could not update queue.&quot;) 
    } 
</cfscript>

プリフェッチ

公式 Service Bus クライアントのいずれかでプリフェッチが有効な場合、レシーバーは、アプリケーションが最初に要求した数を超えて、最大で PrefetchCount 上限まで、メッセージを自動的に獲得します。詳しくは、Service Bus のプリフェッチを参照してください。

setPrefetchCount

<cfscript> sb = getcloudService(this.serviceBusCred, this.serviceBusConf) // キューを作成 myQueue=sb.createQueue(&quot;Q_004&quot;) // プリフェッチ回数を設定 try{ setCount=sb.setPrefectCount(myQueue,50) writeOutput(&quot;Prefetch count set successfully.&quot;) 
    } 
    catch (any e){ writeOutput(&quot;Unable to set prefetch count.&quot;) 
    } 
</cfscript>

getPrefetchCount

<cfscript> sb = getcloudService(this.serviceBusCred, this.serviceBusConf) // プリフェッチ回数を取得 getCount=sb.getPrefetchCount(&quot;Q_004&quot;) writeDump(getCount) </cfscript>

キューへのメッセージの送信

sendMessageBatch 関数を使用して、メッセージのバッチをキューに送信します。この関数は、次のパラメーターを受け入れます。

  1. キューの名前
  2. キューに送信されるメッセージ本文

<cfscript> sb = getcloudService(this.serviceBusCred, this.serviceBusConf) msgLockDurationInQ = 3 pauseTimeInSecs = (msgLockDurationInQ+3) * 1000 msgCount = 5 qName = &quot;Q_batchOps&quot; queueAttributes = { &quot;maxDeliveryCount&quot; = 100, &quot;lockDuration&quot; = &quot;#msgLockDurationInQ#s&quot; } // キューを作成 myQueue=sb.createQueue(qName,queueAttributes) // メッセージを一括送信 msgBatch = arrayNew(1) for(n=1; n <= msgCount; n++){ msgInstance = { &quot;messageId&quot; = &quot;#n#&quot;, &quot;messageBody&quot; = &quot;msg time stamp - #now()#&quot; } msgBatch[n] = msgInstance } messageBatchResponse=sb.sendMessageBatch(qName, msgBatch) writeDump(messageBatchResponse) </cfscript>

メッセージのスケジュール

例えば、特定の時簡にシステムによって処理が可能になるようにジョブをスケジュールするために、遅延処理用にキューまたはトピックにメッセージを送信できます。詳しくは、公式ドキュメントを参照してください。

<cfscript> sb = getcloudService(this.serviceBusCred, this.serviceBusConf) // キューを作成 myQueue=sb.createQueue(&quot;Q_006&quot;) schedMessage={ &quot;messageId&quot; = &quot;001&quot;, &quot;messageBody&quot; = &quot;message body&quot;, &quot;ScheduledEnqueueTimeUtc&quot;=&quot;02/02/2020&quot; } scheduleResponse=sb.scheduleMessageToQueue(myQueue, schedMessage) writeDump(scheduleResponse) </cfscript>

メッセージの参照

メッセージ参照(またはピーク)を使用すると、Service Bus クライアントで、キューまたはサブスクリプションに存在するすべてのメッセージを(通常は診断およびデバッグ目的で)列挙できます。詳しくは、公式ドキュメントを参照してください。

<cfscript> sb = getcloudService(this.serviceBusCred, this.serviceBusConf) msgCount = 3 msgLockDuration = 3 qName = &quot;Q_Peek_Ex&quot; queueAttributes = { &quot;maxDeliveryCount&quot; = msgCount, &quot;lockDuration&quot; = &quot;#msgLockDuration#s&quot; } queue = sb.createQueue(qName, queueAttributes) peekProps = { &quot;fromSequenceNumber&quot; = 1, &quot;messageCount&quot; = msgCount - 1 } writeOutput(&quot;peeking q msgs...<br>&quot;) writeDump(queue.peekMessage(peekProps)) </cfscript>

トピックの更新

トピックを作成したら、updateTopic 関数を使用して、トピックを更新できます。この関数は、次のパラメーターを受け入れます。

  • トピック
  • トピックメタデータ

<cfscript> sb = getcloudService(this.serviceBusCred, this.serviceBusConf) // トピック属性を定義 topicName = &quot;topic_001&quot;; autoDeleteOnIdle = 45 topicAttributes = { &quot;autoDeleteOnIdle&quot; = &quot;#autoDeleteOnIdle#M&quot;, //&quot;requiresDuplicateDetection&quot; = &quot;yes&quot;, // 変更できない。デフォルト:false &quot;maxSizeInMB&quot; = 1024, &quot;entityStatus&quot; = &quot;Active&quot;, &quot;userMetadata&quot; = &quot;modified metadata&quot;, &quot;enableBatchedOperations&quot; = true, &quot;enablePartitioning&quot; = &quot;no&quot; } // トピックを作成 topic = sb.createTopic(topicName) // デフォルト属性を使用して作成 writeOutput(&quot;created topic: &quot; & topic.getPath() & &quot;<br>&quot;) // トピックを更新 try{ sb.updateTopic(topicName, topicAttributes) writeOutput(&quot;Topic &quot; & topicName & &quot; updated successfully&quot;) } catch (any e){ writeOutput(&quot;Unable to update topic&quot;) } </cfscript>

トピックの削除

作成したトピックを削除します。deleteTopic 関数を使用します。この関数は、トピックパスを引数として受け取ります。

<cfscript> sb = getcloudService(this.serviceBusCred, this.serviceBusConf) topicName=&quot;topic_001&quot; // 作成済みのトピック topic_001 を削除 try{ sb.deleteTopic(topicName) writeOutput(&quot;Topic &quot; & topicName & &quot; deleted successfully&quot;) } catch(any e){ writeOutput(&quot;Unable to delete the topic&quot;) } </cfscript>

トピックのリスト表示

アカウント内のすべてのトピックをリスト表示します。listTopics 関数を使用します。

<cfscript> sb = getcloudService(this.serviceBusCred, this.serviceBusConf) // 2 つのトピックを作成 sb.createTopic(&quot;T1&quot;) // トピック 1 sb.createTopic(&quot;T2&quot;) // トピック 2 // すべてのトピックをリストアップ listResponse=sb.listTopics() writeDump(listResponse) </cfscript>

トピックからのサブスクリプション解除

unsubscribe メソッドを使用して、トピックをサブスクリプション解除できます。

<cfscript> sb = getcloudService(this.serviceBusCred, this.serviceBusConf) topicName = &quot;topic-for-sub&quot;; subscriptionName = &quot;subsciption-001&quot; subscriptionAttribs = { &quot;subscriptionName&quot; = subscriptionName, &quot;autoDeleteOnIdle&quot; = &quot;5M&quot;, &quot;maxDeliveryCount&quot; = 10, &quot;lockDuration&quot; = &quot;10s&quot;, &quot;defaultMessageTimeToLive&quot; = &quot;10M&quot; } // トピックを作成 try{ topic=sb.createTopic(topicName) // デフォルト属性を使用して作成 writeOutput(&quot;Topic created successfully&quot;) } catch(any e){ writeOutput(&quot;Unable to create topic&quot;) } // サブスクリプションを作成 try{ subscription = topic.subscribe(topicName, subscriptionAttribs) // デフォルト属性を使用して作成 writeOutput(&quot;Subscribed to topic successfully&quot;) } catch(any e){ writeOutput(&quot;Unable to subscribe to topic&quot;) } // トピックのサブスクリプションを解除 //unsubscribe(String topicPath, String subscriptionName) try{ sb.unsubscribe(topic,subscription) writeOutput(&quot;Unsubscribed successfully&quot;) } catch(any e){ writeOutput(&quot;Unable to unsubscribe&quot;) } </cfscript>

サブスクリプション名の取得

以前作成したサブスクリプションの名前を取得するには、getSubscription 関数を使用します。この関数は、トピックおよびサブスクリプションの名前を受け入れます。

<cfscript> sb = getcloudService(this.serviceBusCred, this.serviceBusConf) topicName = &quot;testTopic&quot; // トピックを作成 topic=sb.createTopic(topicName) subscriptionName = &quot;sub-00&quot; // サブスクリプションを取得 subscription = topic.getSubscription(subscriptionName) writeDump(subsciption) </cfscript>

メッセージハンドラーの登録

registerMessageHandler メソッドでハンドラーを登録できます。登録したハンドラーはイベントの発生時に呼び出されます。

詳しくは、公式ドキュメントを参照してください。

<cfscript> sb = getcloudService(this.serviceBusCred, this.serviceBusConf) // void registerMessageHandler(String topicPath, String subscriptionName, Map metadata) // トピックを作成 // トピックメタデータ createTopicMetadata = { &quot;autoDeleteOnIdle&quot; = &quot;45M&quot;, &quot;requiresDuplicateDetection&quot; = &quot;yes&quot;, //&quot;maxSize&quot; = 1024, &quot;entityStatus&quot; = &quot;Active&quot;, &quot;userMetadata&quot; = &quot;my user metadata&quot;, &quot;enableBatchedOperations&quot; = &quot;true&quot;, &quot;enablePartitioning&quot; = &quot;yes&quot; } topic = sb.createTopic(&quot;Topic_013&quot;, createTopicMetadata) // サブスクリプションを作成 subscriptionName = &quot;Sub_013&quot; subscriptionAttribs = { &quot;subscriptionName&quot; = subscriptionName, &quot;autoDeleteOnIdle&quot; = &quot;5M&quot;, &quot;maxDeliveryCount&quot; = 10, &quot;lockDuration&quot; = &quot;10s&quot;, &quot;defaultMessageTimeToLive&quot; = &quot;10M&quot; } subscription = topic.subscribe(subscriptionAttribs) messageHandlerOptions={ &quot;autocomplete&quot;=&quot;yes&quot;, &quot;maxautorenewduration&quot;=&quot;50M&quot;, &quot;maxconsurrentcalls&quot;=30 } renewMessageResponse=sb.registerMessageHandler(topic,subscription,messageHandlerOptions) writeDump(renewMessageResponse) </cfscript>

メッセージの破棄

サブスクリプションメッセージの破棄

サブスクリプションに対するすべてのメッセージを破棄します。

シンタックス

abandonSubscriptionMessage(String formattedSubscriptionPath, Map metadata)

<cfscript> sb = getcloudService(this.serviceBusCred, this.serviceBusConf) topicName = &quot;topic_003&quot;; topic = topicUtil.createTopic(sb, topicName, false, {}) //purgeAndRecreate, attribs originalLabel = &quot;Red&quot; adandonCountLabel = &quot;adandonCount&quot; subscriptionName = &quot;sub_003&quot; subscription = topic.subscribe({ &quot;subscriptionName&quot; = subscriptionName }) updatedMessageProperties = { &quot;DeadLetterReason&quot; = &quot;reason for this&quot;, &quot;DeadLetterErrorDescription&quot; = &quot;collateral&quot; } abandonResponse = sb.abandonSubscriptionMessage(subscription.getTopicName(), subscription.getSubscriptionName(), updatedMessageProperties) writeDump(abandonResponse) </cfscript>

メッセージの破棄

ロックトークンを含むメッセージを破棄します。これにより、再度メッセージを処理できるようになります。メッセージの破棄により、メッセージの配信数が増加します。

シンタックス

abandonMessage(String queuePath, Map metadata)

<cfscript> sb = getcloudService(this.serviceBusCred, this.serviceBusConf) qName = &quot;cfqa-abandon-msg&quot; // キューを作成 queue = sb.createQueue(qName) oldLabel = &quot;red&quot; newLabel = &quot;blue&quot; sentMessage = sendMessage(queue, oldLabel) writeOutput(&quot;peeking at the queue: #qName#, before abandoning message.<br>&quot;) receivedMessage = sb.receiveMessagesFromQueue(queue, &quot;PEEKLOCK&quot;, 1) //READ_MODE_RECEIVEANDDELETE for(message in receivedMessage){ //cfdump(var=#message#, label=&quot;message received.&quot;) 
  abandonMessage(qName, message.lockToken, newLabel) } </cfscript>

メッセージの延期

メッセージの延期

キューまたはサブスクリプションクライアントが、処理対象だがアプリケーション内部の特殊事情により現在は処理できないメッセージを受信する場合、メッセージの取得を後に「延期する」オプションがあります。そのメッセージは、キューまたはサブスクリプションに残りますが、保留されます。

シンタックス

deferMessage(String queuePath, Map metadata)

<cfscript> sb = getcloudService(this.serviceBusCred, this.serviceBusConf) qName=&quot;queue_002&quot; // キューを作成 queue = sb.createQueue(qName, {&quot;lockDuration&quot;: &quot;2s&quot;}) // キューにメッセージを送信 msgBatch = arrayNew(1) for(n=1; n <= msgCount; n++){ msgInstance = { &quot;messageId&quot; = &quot;#n#&quot;, &quot;messageBody&quot; = &quot;msg time stamp - #now()#&quot; } msgBatch[n] = msgInstance } sb.sendMessageBatch(qName, msgBatch) receivedMessage = sb.receiveMessagesFromQueue(queue, &quot;PEEKLOCK&quot;, 1) //READ_MODE_RECEIVEANDDELETE // メッセージを延期 for(message in receivedMessage){ propertiesToModify = {&quot;deferred_time:&quot; : dateTimeFormat(now())} sb.deferMessage(qName, { &quot;lockToken&quot; = message.lockToken , &quot;propertiesToModify&quot; = propertiesToModify }) } </cfscript>

延期されたメッセージの受信

延期されたメッセージは、(サブキューに置かれる配信不能メッセージとは異なり)他のすべてのアクティブメッセージと共にメインキューに残りますが、通常の Receive/ReceiveAsync 関数を使用して受信することはできなくなります。延期されたメッセージは、アプリケーションが見失った場合、メッセージ参照を使用して見つけることができます。

シンタックス

receiveDeferredMessage(String queuePath, Map metadata)

<cfscript> sb = getcloudService(this.serviceBusCred, this.serviceBusConf) qName=&quot;queue_002&quot; // キューを作成 queue = sb.createQueue(qName, {&quot;lockDuration&quot;: &quot;2s&quot;}) // キューにメッセージを送信 msgBatch = arrayNew(1) for(n=1; n <= msgCount; n++){ msgInstance = { &quot;messageId&quot; = &quot;#n#&quot;, &quot;messageBody&quot; = &quot;msg time stamp - #now()#&quot; } msgBatch[n] = msgInstance } sb.sendMessageBatch(qName, msgBatch) receivedMessage = sb.receiveMessagesFromQueue(queue, &quot;PEEKLOCK&quot;, 1) //READ_MODE_RECEIVEANDDELETE // メッセージを延期 for(message in receivedMessage){ propertiesToModify = {&quot;deferred_time:&quot; : dateTimeFormat(now())} sb.deferMessage(qName, { &quot;lockToken&quot; = message.lockToken , &quot;propertiesToModify&quot; = propertiesToModify }) } // 延期されたメッセージを受信 receivedDeferredMessage = sb.receiveDeferredMessage(qName, { &quot;sequenceNumber&quot; : seqNo } ) writeDump(receivedDeferredMessage) </cfscript>

配信不能処理

Azure Service Bus キューおよびトピックサブスクリプションには、配信不能キューと呼ばれる、セカンダリサブキューが用意されています。配信不能キューは、明示的に作成する必要がなく、削除できません。配信不能キューの目的は、どのレシーバーにも配信できないメッセージや処理できないメッセージを保持することです。

配信不能メッセージ

シンタックス

deadLetterMessage(String queuePath, Map metadata)

配信不能サブスクリプションメッセージ

シンタックス

deadLetterSubscriptionMessage(String formattedSubscriptionPath, Map metadata)

ルール

フィルターまたはサブスクリプションルールは、そのトピックに送信されたメッセージのどれがトピックサブスクリプションによって受信される必要があるかを指定します。いつトピックサブスクリプションが作成されても、デフォルトのトピックサブスクリプションルールが作成され、これにより、そのトピックに送信されたすべてのメッセージをトピックサブスクリプションが受信できます。

サブスクリプションルールの追加

シンタックス

addSubscriptionRule(String topicPath, String subscriptionName, Map metadata)

<cfscript> sb = getcloudService(this.serviceBusCred, this.serviceBusConf) // トピックを作成 topicName = &quot;topic_001&quot; topic = sb.createTopic(topicName) subscriptionName = &quot;subscription_001&quot; // トピックをサブスクライブ sb.subscribe( topicName, { &quot;subscriptionName&quot; = subscriptionName } ) // ルールを取得 filterRuleTrue = { &quot;type&quot; = &quot;true&quot;, &quot;name&quot; = &quot;trueFilter&quot; } sb.addSubscriptionRule(topicName, subscriptonName, filterRuleTrue) </cfscript>

サブスクリプションルールの削除

シンタックス

removeSubscriptionRule(String topicPath, String subscriptionName, String ruleName)

<cfscript> sb = getcloudService(this.serviceBusCred, this.serviceBusConf) // トピックを作成 topicName = &quot;topic_001&quot; topic = sb.createTopic(topicName) subscriptionName = &quot;subscription_001&quot; // トピックをサブスクライブ sb.subscribe( topicName, { &quot;subscriptionName&quot; = subscriptionName } ) // ルールを取得 filterRuleTrue = { &quot;type&quot; = &quot;true&quot;, &quot;name&quot; = &quot;trueFilter&quot; } sb.addSubscriptionRule(topicName, subscriptonName, filterRuleTrue) removeRuleResponse=sb.removeSubscriptionRule(topicName, subscriptonName, filterRuleTrue) </cfscript>

サブスクリプションルールの取得

シンタックス

getSubscriptionRules(String formattedSubscriptionPath)

メッセージのスケジュール

キューまたはトピックへのメッセージをスケジュールできます。メッセージがスケジュールされた時間までそのメッセージがバスにキューされ、メッセージがレシーバー側に配信されます。これは、パフォーマンスを向上させるために、現在は非同期処理です。

キューへのメッセージのスケジュール

シンタックス

scheduleMessageToQueue(String queuePath, Map metadata)

<cfscript> sb = getcloudService(this.serviceBusCred, this.serviceBusConf) // キューを作成 myQueue=sb.createQueue(&quot;Q_006&quot;) schedMessage={ &quot;messageId&quot; = &quot;001&quot;, &quot;messageBody&quot; = &quot;message body&quot;, &quot;ScheduledEnqueueTimeUtc&quot;=&quot;02/02/2020&quot; } scheduleResponse=sb.scheduleMessageToQueue(myQueue, schedMessage) writeDump(scheduleResponse) </cfscript>

トピックへのメッセージのスケジュール

シンタックス

scheduleMessageToTopic(String topicPath, Map metadata)

スケジュールされたトピックへのメッセージのキャンセル

シンタックス

cancelScheduledTopicMessage(String topicPath, long sequenceNumber)

スケジュールされたキューへのメッセージのキャンセル

シンタックス

cancelScheduledQueueMessage(String queuePath, long sequenceNumber)

<cfscript> sb = getcloudService(this.serviceBusCred, this.serviceBusConf) qName = &quot;cancel-scheduled-1msg2&quot; delayInSecs = 30 msgCount = 1 // キューを作成 queue = sb.createQueue(qName) if(!listFindNoCase(qUtil.getQueuesListStr(sb), qName)) writeOutput(&quot;queue #qName# NOT created.This is NOT expected.<br>&quot;) else writeOutput(&quot;queue #qName# created successfully.<br>&quot;) messageArrayToSend = getMessageArray(msgCount) seqNo = scheduler.scheduleMessage(sb, qName, messageArrayToSend[1], delayInSecs) writeOutput(&quot;cancelling message with sequence no: #seqNo#<br>&quot;) cancelMessageResponse = sb.cancelScheduledMessage(qName, seqNo) if(cancelMessageResponse[statusCode] NEQ 200) writeOutput(&quot;error cancelling msg for #qName#, seqno.#seqNo#<br>&quot;) </cfscript>

メッセージ参照

peek メソッドは、キューまたはサブスクリプションログに存在するすべてのメッセージを、最下位から最上位の順番で列挙します。

キューからのメッセージのピーク

シンタックス

peekMessageFromQueue(String queuePath, Struct metadata)

<cfscript> sb = getcloudService(this.serviceBusCred, this.serviceBusConf) // キューを作成 qName=&quot;queue-005&quot; queue = sb.createQueue(qName) peekProperties = { &quot;fromSequenceNumber&quot; = 1, &quot;messageCount&quot; = 10 } peekResponse = sb.peekMessageFromQueue(queue.getPath(), peekProperties) receivedMsgArray = peekResponse.messages writeDump(receivedMsgArray) </cfscript>

サブスクリプションからのメッセージのピーク

シンタックス

peekMessageFromSubscription(String topicPath, String subscriptionName, Struct metadata)

<cfscript> sb = getcloudService(this.serviceBusCred, this.serviceBusConf) qName = &quot;q-msg-Peek-x4&quot; msgCount = 3 msgLockDuration = 2 // キューを作成 queue=sb.createQueue(qName,{ &quot;lockDuration&quot;=msgLockDuration, &quot;maxDeliveryCount&quot;=msgCount }) // ピークプロパティを設定 peekProps = { &quot;fromSequenceNumber&quot; = 1, &quot;messageCount&quot; = msgCount } peekResponse = sb.peekMessage(queue.getPath(), peekProps) // サイズが msgCount - 1 の配列 if(peekResponse[statusCode] == 200){ receivedMessages = peekResponse.messages writeOutput(&quot;received message deserialized:<br>&quot;) } else writeOutput(&quot;message browsing failed&quot;) </cfscript>

ヘルプをすばやく簡単に入手

新規ユーザーの場合

Adobe MAX 2025

Adobe MAX Japan
クリエイターの祭典

2025 年 2 月 13 日
東京ビッグサイト