Share via


Java ile çekme teslimi kullanarak olayları alma

Bu makalede, Event Grid'in çekme teslimi kullanılarak CloudEvents'i almak için hızlı, adım adım kılavuz sağlanır. Olay almak, onaylamak (Event Grid'den olayları silmek) için örnek kod sağlar.

Önkoşullar

Devam etmeden önce sahip olmanız gereken önkoşullar şunlardır:

  • Çekme teslimi nedir anlayın. Daha fazla bilgi için bkz . çekme teslimi kavramları ve çekme teslimi genel bakış.

  • Ad alanı, konu ve olay aboneliği.

    • Ad alanı oluşturma ve yönetme
    • Ad alanı konusu oluşturma ve yönetme
    • Olay aboneliği oluşturma ve yönetme
  • En son beta SDK paketi. Maven kullanıyorsanız maven merkezi deposuna başvurabilirsiniz.

    Önemli

    Çekme teslimi veri düzlemi SDK'sı desteği beta paketlerde kullanılabilir. Projenizde en son beta paketini kullanmanız gerekir.

  • IntelliJ IDEA, Eclipse IDE veya Visual Studio Code gibi Java'yı destekleyen bir IDE.

  • Java 8 dil düzeyinde çalışan Java JRE.

  • Bir konu başlığında kullanılabilir olaylarınız olmalıdır. Bkz . olayları ad alanında yayımlama konuları.

Çekme teslimi kullanarak olayları alma

Event Grid'den olayları, alma işlemiyle birlikte bir ad alanı konusu ve kuyruk olayı aboneliği belirterek okursunuz. Olay aboneliği, bir tüketici istemcisinin okuyabileceği CloudEvents koleksiyonunu etkili bir şekilde tanımlayan kaynaktır. Bu örnek kod, kimlik doğrulaması için hızlı ve basit bir yaklaşım sağladığı için anahtar tabanlı kimlik doğrulamasını kullanır. Üretim senaryolarında, çok daha sağlam bir kimlik doğrulama mekanizması sağladığından Microsoft Entry ID kimlik doğrulamasını kullanmanız gerekir.

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());

Olayları onaylama

Olayları onaylamak için, olayları almak için kullanılan kodu kullanın ve bir onay özel yöntemini çağırmak için aşağıdaki satırları ekleyin:

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

Başarısız kilit belirteçleri hakkındaki bilgileri yazdırmak için bir yardımcı program yöntemiyle birlikte bir onay yönteminin örnek uygulaması aşağıda verilmiştir:

    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());
        }
    }

Yayın olayları

Yeniden teslim için kullanılabilir hale getirmek için olayları yayınlayın. Olayları onaylarken yaptığınıza benzer şekilde, bağımsız değişken olarak geçirilen kilit belirteçleri tarafından tanımlanan olayları serbest bırakmak için aşağıdaki statik yöntemi ve bunu çağırmak için bir satır ekleyebilirsiniz. Derlemek writeFailedLockTokens için bu yöntemin yöntemine ihtiyacınız vardır.

   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());
        }
    }

Olayları reddet

Tüketici uygulamanızın işleyebildiği olayları reddedin. Bir olayı reddettiğiniz koşullar arasında ayrıştırılabilen hatalı biçimlendirilmiş bir olay veya olayları işleyen uygulamayla ilgili sorunlar bulunur.

    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());
        }
    }

Sonraki adımlar