تلقي الأحداث باستخدام تسليم السحب مع Java

توفر هذه المقالة دليلا سريعا خطوة بخطوة لتلقي CloudEvents باستخدام تسليم سحب Event Grid. يوفر نموذج التعليمات البرمجية لتلقي ، والإقرار (حذف الأحداث من شبكة الأحداث).

المتطلبات الأساسية

المتطلبات الأساسية التي تحتاج إلى وجودها قبل المتابعة هي:

  • فهم ما هو تسليم السحب. لمزيد من المعلومات، راجع مفاهيم تسليم السحب ونظرة عامة على تسليم السحب.

  • مساحة اسم وموضوع واشتراك حدث.

    • إنشاء مساحة اسم وإدارتها
    • إنشاء موضوع مساحة اسم وإدارته
    • إنشاء اشتراك حدث وإدارته
  • أحدث حزمة بيتا SDK. إذا كنت تستخدم maven، يمكنك استشارة مستودع maven المركزي.

    هام

    يتوفر دعم SDK لمستوى بيانات تسليم السحب في حزم بيتا. يجب عليك استخدام أحدث حزمة بيتا في مشروعك.

  • IDE التي تدعم Java مثل IntelliJ IDEA أو Eclipse IDE أو Visual Studio Code.

  • Java JRE يعمل على مستوى لغة Java 8.

  • يجب أن يكون لديك أحداث متوفرة حول موضوع. راجع نشر الأحداث إلى مواضيع مساحة الاسم.

تلقي الأحداث باستخدام تسليم السحب

يمكنك قراءة الأحداث من Event Grid عن طريق تحديد موضوع مساحة اسم واشتراك حدث قائمة انتظار مع عملية الاستلام. اشتراك الحدث هو المورد الذي يحدد بشكل فعال مجموعة CloudEvents التي يمكن لعميل المستهلك قراءتها. يستخدم نموذج التعليمات البرمجية هذا المصادقة المستندة إلى المفتاح لأنه يوفر نهجا سريعا وبسيطا للمصادقة. بالنسبة لسيناريوهات الإنتاج، يجب استخدام مصادقة معرف إدخال Microsoft لأنها توفر آلية مصادقة أكثر قوة.

package com.azure.messaging.eventgrid.samples;

import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.http.HttpClient;
import com.azure.core.models.CloudEvent;
import com.azure.messaging.eventgrid.EventGridClient;
import com.azure.messaging.eventgrid.EventGridClientBuilder;
import com.azure.messaging.eventgrid.EventGridMessagingServiceVersion;
import com.azure.messaging.eventgrid.models.*;

import java.time.Duration;
import java.util.ArrayList;
import java.util.List;

/**
 * <p>Simple demo consumer app of CloudEvents from queue event subscriptions created for namespace topics.
 * This code samples should use Java 1.8 level or above to avoid compilation errors.
 * You should consult the resources below to use the client SDK and set up your project using maven.
 * @see <a href="https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/eventgrid/azure-messaging-eventgrid">Event Grid data plane client SDK documentation</a>
 * @see <a href="https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/boms/azure-sdk-bom/README.md">Azure BOM for client libraries</a>
 * @see <a href="https://aka.ms/spring/versions">Spring Version Mapping</a> if you are using Spring.
 * @see <a href="https://aka.ms/azsdk">Tool with links to control plane and data plane SDKs across all languages supported</a>.
 *</p>
 */
public class NamespaceTopicConsumer {
    private static final String TOPIC_NAME = "<yourNamespaceTopicName>";
    public static final String EVENT_SUBSCRIPTION_NAME = "<yourEventSusbcriptionName>";
    public static final String ENDPOINT =  "<yourFullHttpsUrlToTheNamespaceEndpoint>";
    public static final int MAX_NUMBER_OF_EVENTS_TO_RECEIVE = 10;
    public static final Duration MAX_WAIT_TIME_FOR_EVENTS = Duration.ofSeconds(10);

    private static EventGridClient eventGridClient;
    private static List<String> receivedCloudEventLockTokens = new ArrayList<>();
    private static List<CloudEvent> receivedCloudEvents = new ArrayList<>();

    //TODO  Do NOT include keys in source code. This code's objective is to give you a succinct sample about using Event Grid, not to provide an authoritative example for handling secrets in applications.
    /**
     * For security concerns, you should not have keys or any other secret in any part of the application code.
     * You should use services like Azure Key Vault for managing your keys.
     */
    public static final AzureKeyCredential CREDENTIAL = new AzureKeyCredential("<namespace key>");
    public static void main(String[] args) {
        //TODO Update Event Grid version number to your desired version. You can find more information on data plane APIs here:
        //https://learn.microsoft.com/en-us/rest/api/eventgrid/.
        eventGridClient = new EventGridClientBuilder()
                .httpClient(HttpClient.createDefault())  // Requires Java 1.8 level
                .endpoint(ENDPOINT)
                .serviceVersion(EventGridMessagingServiceVersion.V2023_06_01_PREVIEW)
                .credential(CREDENTIAL).buildClient();   // you may want to use .buildAsyncClient() for an asynchronous (project reactor) client.

        System.out.println("Waiting " +  MAX_WAIT_TIME_FOR_EVENTS.toSecondsPart() + " seconds for events to be read...");
        List<ReceiveDetails> receiveDetails = eventGridClient.receiveCloudEvents(TOPIC_NAME, EVENT_SUBSCRIPTION_NAME,
                MAX_NUMBER_OF_EVENTS_TO_RECEIVE, MAX_WAIT_TIME_FOR_EVENTS).getValue();

        for (ReceiveDetails detail : receiveDetails) {
            // Add order message received to a tracking list
            CloudEvent orderCloudEvent = detail.getEvent();
            receivedCloudEvents.add(orderCloudEvent);
            // Add lock token to a tracking list. Lock token functions like an identifier to a cloudEvent
            BrokerProperties metadataForCloudEventReceived = detail.getBrokerProperties();
            String lockToken = metadataForCloudEventReceived.getLockToken();
            receivedCloudEventLockTokens.add(lockToken);
        }
        System.out.println("<-- Number of events received: " + receivedCloudEvents.size());

الإقرار بالأحداث

للإقرار بالأحداث، استخدم نفس التعليمات البرمجية المستخدمة لتلقي الأحداث وأضف الأسطر التالية لاستدعاء أسلوب خاص للإقرار:

        // Acknowledge (i.e. delete from Event Grid the) events
        acknowledge(receivedCloudEventLockTokens);

فيما يلي نموذج تنفيذ لأسلوب الاعتراف مع أسلوب الأداة المساعدة لطباعة معلومات حول رموز التأمين المميزة الفاشلة:

    private static void acknowledge(List<String> lockTokens) {
        AcknowledgeResult acknowledgeResult = eventGridClient.acknowledgeCloudEvents(TOPIC_NAME, EVENT_SUBSCRIPTION_NAME, new AcknowledgeOptions(lockTokens));
        List<String> succeededLockTokens = acknowledgeResult.getSucceededLockTokens();
        if (succeededLockTokens != null && lockTokens.size() >= 1)
            System.out.println("@@@ " + succeededLockTokens.size() + " events were successfully acknowledged:");
        for (String lockToken : succeededLockTokens) {
            System.out.println("    Acknowledged event lock token: " + lockToken);
        }
        // Print the information about failed lock tokens
        if (succeededLockTokens.size() < lockTokens.size()) {
            System.out.println("    At least one event was not acknowledged (deleted from Event Grid)");
            writeFailedLockTokens(acknowledgeResult.getFailedLockTokens());
        }
    }

    private static void writeFailedLockTokens(List<FailedLockToken> failedLockTokens) {
        for (FailedLockToken failedLockToken : failedLockTokens) {
            System.out.println("    Failed lock token: " + failedLockToken.getLockToken());
            System.out.println("    Error code: " + failedLockToken.getErrorCode());
            System.out.println("    Error description: " + failedLockToken.getErrorDescription());
        }
    }

أحداث الإصدار

إصدار الأحداث لجعلها متاحة لإعادة الحياة. على غرار ما فعلته لإقرار الأحداث، يمكنك إضافة الأسلوب الثابت التالي وخط لاستدعائه لتحرير الأحداث المحددة بواسطة رموز التأمين المميزة التي تم تمريرها كوسيطة. تحتاج إلى writeFailedLockTokens أسلوب لهذا الأسلوب لتحويله برمجيا.

   private static void release(List<String> lockTokens) {
        ReleaseResult releaseResult = eventGridClient.releaseCloudEvents(TOPIC_NAME, EVENT_SUBSCRIPTION_NAME, new ReleaseOptions(lockTokens));
        List<String> succeededLockTokens = releaseResult.getSucceededLockTokens();
        if (succeededLockTokens != null && lockTokens.size() >= 1)
            System.out.println("^^^ " + succeededLockTokens.size() + " events were successfully released:");
        for (String lockToken : succeededLockTokens) {
            System.out.println("    Released event lock token: " + lockToken);
        }
        // Print the information about failed lock tokens
        if (succeededLockTokens.size() < lockTokens.size()) {
            System.out.println("    At least one event was not released back to Event Grid.");
            writeFailedLockTokens(releaseResult.getFailedLockTokens());
        }
    }

رفض الأحداث

رفض الأحداث التي لا يمكن لتطبيق المستهلك معالجتها. تتضمن الشروط التي ترفض حدثا لها حدثا غير صحيح لا يمكن تحليله أو مشاكل في التطبيق الذي يعالج الأحداث.

    private static void reject(List<String> lockTokens) {
        RejectResult rejectResult = eventGridClient.rejectCloudEvents(TOPIC_NAME, EVENT_SUBSCRIPTION_NAME, new RejectOptions(lockTokens));
        List<String> succeededLockTokens = rejectResult.getSucceededLockTokens();
        if (succeededLockTokens != null && lockTokens.size() >= 1)
            System.out.println("--- " + succeededLockTokens.size() + " events were successfully rejected:");
        for (String lockToken : succeededLockTokens) {
            System.out.println("    Rejected event lock token: " + lockToken);
        }
        // Print the information about failed lock tokens
        if (succeededLockTokens.size() < lockTokens.size()) {
            System.out.println("    At least one event was not rejected.");
            writeFailedLockTokens(rejectResult.getFailedLockTokens());
        }
    }

الخطوات التالية