Gebeurtenissen ontvangen met behulp van pull-levering met Java

Dit artikel bevat een snelle, stapsgewijze handleiding voor het ontvangen van CloudEvents met behulp van de pull-levering van Event Grid. Het biedt voorbeeldcode voor het ontvangen, bevestigen (verwijderen van gebeurtenissen uit Event Grid).

Vereisten

De vereisten die u moet hebben voordat u doorgaat, zijn:

  • Begrijpen wat pull-levering is. Zie pull-leveringsconcepten en overzicht van pull-levering voor meer informatie.

  • Een naamruimte, onderwerp en gebeurtenisabonnement.

    • Een naamruimte maken en beheren
    • Een naamruimteonderwerp maken en beheren
    • Een gebeurtenisabonnement maken en beheren
  • Het nieuwste bèta-SDK-pakket. Als u maven gebruikt, kunt u de centrale opslagplaats van Maven raadplegen.

    Belangrijk

    Sdk-ondersteuning voor pull-leveringsgegevensvlak is beschikbaar in bètapakketten. U moet het meest recente bètapakket in uw project gebruiken.

  • Een IDE die Ondersteuning biedt voor Java, zoals IntelliJ IDEA, Eclipse IDE of Visual Studio Code.

  • Java JRE met Java 8-taalniveau.

  • Er moeten gebeurtenissen beschikbaar zijn voor een onderwerp. Zie gebeurtenissen publiceren naar naamruimteonderwerpen.

Voorbeeldcode

De voorbeeldcode die in dit artikel wordt gebruikt, vindt u op deze locatie:

    https://github.com/jfggdl/event-grid-pull-delivery-quickstart

Gebeurtenissen ontvangen met behulp van pull-levering

U leest gebeurtenissen uit Event Grid door een naamruimteonderwerp en een wachtrij-gebeurtenisabonnement op te geven met de ontvangstbewerking . Het gebeurtenisabonnement is de resource die de verzameling CloudEvents definieert die een consumentclient kan lezen. Deze voorbeeldcode maakt gebruik van verificatie op basis van sleutels, omdat deze een snelle en eenvoudige benadering biedt voor verificatie. Voor productiescenario's moet u Microsoft Entry ID-verificatie gebruiken omdat het een veel robuuster verificatiemechanisme biedt.

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

Gebeurtenissen bevestigen

Als u gebeurtenissen wilt bevestigen, gebruikt u dezelfde code die wordt gebruikt voor het ontvangen van gebeurtenissen en voegt u de volgende regels toe om een privémethode voor bevestiging aan te roepen:

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

Een voorbeeld van een implementatie van een bevestigingsmethode samen met een hulpprogrammamethode om informatie over mislukte vergrendelingstokens af te drukken:

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

Release-gebeurtenissen

Release-gebeurtenissen om ze beschikbaar te maken voor herlivery. Net zoals u hebt gedaan voor het bevestigen van gebeurtenissen, kunt u de volgende statische methode en een regel toevoegen om deze aan te roepen voor het vrijgeven van gebeurtenissen die zijn geïdentificeerd door de vergrendelingstokens die als argument zijn doorgegeven. U hebt de writeFailedLockTokens methode voor deze methode nodig om te compileren.

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

Gebeurtenissen negeren

Negeer gebeurtenissen die uw consumententoepassing niet kan verwerken. Voorwaarden waarvoor u een gebeurtenis weigert, bevatten een onjuiste gebeurtenis die niet kan worden geparseerd of problemen met de toepassing die de gebeurtenissen verwerkt.

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

Volgende stappen