Condividi tramite


Inviare e ricevere messaggi dalle code del bus di servizio di Azure (Java)

Questa guida introduttiva fornisce istruzioni dettagliate per un semplice scenario di invio di messaggi a una coda del bus di servizio e la ricezione di tali messaggi. Si crea un'app Java per inviare e ricevere messaggi da una coda del bus di servizio di Azure. È possibile trovare esempi Java predefiniti per il bus di servizio di Azure nel repository Azure SDK per Java in GitHub.

Suggerimento

Se si lavora con le risorse del bus di servizio di Azure in un'applicazione Spring, è consigliabile prendere in considerazione Spring Cloud Azure. Spring Cloud Azure è un progetto open source che offre l'integrazione perfetta di Spring con i servizi di Azure. Per altre informazioni su Spring Cloud Azure e per un esempio relativo all'uso del Bus di servizio, vedere Spring Cloud Stream con il Bus di servizio di Azure.

Prerequisiti

Creare uno spazio dei nomi nel portale di Azure

Per iniziare a usare le entità di messaggistica del bus di servizio in Azure, creare uno spazio dei nomi con un nome univoco in Azure. Uno spazio dei nomi fornisce un contenitore di ambito per le risorse del Service Bus, ad esempio code e argomenti, nell'applicazione.

Per creare uno spazio dei nomi:

  1. Accedere al portale di Azure.

  2. Selezionare il menu a comparsa in alto a sinistra e passare alla pagina Tutti i servizi.

  3. Sulla barra di spostamento a sinistra selezionare Integrazione.

  4. Scorrere verso il basso fino a dei servizi di messaggistica>Service Bus e selezionare Crea.

    Screenshot che mostra la selezione di Crea una risorsa, Integrazione e quindi bus di servizio nel menu.

  5. Nella scheda Informazioni di base della pagina Crea spazio dei nomi seguire questa procedura:

    1. Per Sottoscrizione scegliere una sottoscrizione di Azure in cui creare lo spazio dei nomi.

    2. Per Gruppo di risorse scegliere un gruppo di risorse esistente o crearne uno nuovo.

    3. Immettere un nome del namespace che soddisfi le convenzioni di denominazione seguenti.

      • Il nome deve essere univoco in Azure. Verrà effettuato immediatamente un controllo sulla disponibilità del nome.
      • La lunghezza del nome deve essere compresa tra 6 e 50 caratteri.
      • Il nome può contenere solo lettere, numeri, trattini -.
      • Il nome deve iniziare con una lettera e terminare con una lettera o un numero.
      • Il nome non termina con -sb o -mgmt.
    4. Per Posizione, scegliere la regione in cui ospitare lo spazio dei nomi.

    5. In Piano tariffario, selezionare il piano tariffario (Basic, Standard o Premium) per lo spazio dei nomi. Per questo avvio rapido selezionare Standard.

      Se si seleziona il livello Premium , è possibile abilitare la replica geografica per lo spazio dei nomi. La funzionalità di replica geografica garantisce che i metadati e i dati di uno spazio dei nomi vengano replicati continuamente da un'area primaria a una o più aree secondarie.

      Importante

      Se si vogliono usare argomenti e sottoscrizioni, scegliere Standard o Premium. Gli argomenti e le sottoscrizioni non sono supportati nel piano tariffario Basic.

      Se è stato selezionato il piano tariffario Premium, specificare il numero di unità di messaggistica. Il piano Premium fornisce l'isolamento delle risorse a livello di CPU e memoria in modo che ogni carico di lavoro venga eseguito in isolamento. Questo contenitore di risorse viene chiamato unità di messaggistica. Uno spazio dei nomi Premium ha almeno un'unità di messaggistica. È possibile acquistare 1, 2, 4, 8 o 16 unità di messaggistica per ogni spazio dei nomi Premium del Bus di servizio. Per altre informazioni, vedere Livello di messaggistica Premium del bus di servizio.

    6. Selezionare Rivedi e crea nella parte inferiore della pagina.

      Screenshot che mostra la pagina di creazione di uno spazio dei nomi

    7. Nella pagina Rivedi + crea controllare le impostazioni e selezionare Crea.

  6. Al termine della distribuzione della risorsa, selezionare Vai alla risorsa nella pagina di distribuzione.

    Screenshot che mostra la pagina dell'implementazione riuscita con il link Vai alla risorsa.

  7. Viene visualizzata la home page dello spazio dei nomi del bus di servizio.

    Screenshot che mostra la home page dello spazio dei nomi del Service Bus creato.

Creare una coda nel portale di Azure

  1. Nella pagina spazio dei nomi bus di servizio espandere Entità nel menu di spostamento a sinistra e selezionare Code.

  2. Nella pagina Code, sulla barra degli strumenti, selezionare + Coda.

  3. Inserire un nome per la coda. Lascia gli altri valori con le loro impostazioni predefinite.

  4. Fare clic su Crea.

    Screenshot che mostra la pagina Crea coda.

Autenticare l'app in Azure

Questo articolo illustra due modi per connettersi al bus di servizio di Azure: senza password e stringa di connessione.

La prima opzione mostra come usare l'entità di sicurezza in Microsoft Entra ID e il controllo degli accessi in base al ruolo (RBAC) per connettersi a uno spazio dei nomi del Bus di servizio. Non è necessario preoccuparsi di avere una stringa di connessione hardcoded nel codice, in un file di configurazione o in un'archiviazione sicura come Azure Key Vault.

La seconda opzione mostra come usare una stringa di connessione per connettersi a uno spazio dei nomi del Bus di servizio. Se non si ha familiarità con Azure, è possibile trovare l'opzione stringa di connessione più semplice da seguire. È consigliabile usare l'opzione senza password in applicazioni e ambienti di produzione reali. Per altre informazioni, vedere Autenticazione e autorizzazione del bus di servizio. Per altre informazioni sull'autenticazione senza password, vedere Autenticare le app .NET.

Assegnare ruoli all'utente di Microsoft Entra

Quando si sviluppa in locale, assicurarsi che l'account utente che si connette al bus di servizio di Azure disponga delle autorizzazioni corrette. Per inviare e ricevere messaggi, è necessario il ruolo Proprietario dati del bus di servizio di Azure. Per assegnare a se stessi questo ruolo, è necessario il ruolo Amministratore accesso utenti o un altro ruolo che include l'azione Microsoft.Authorization/roleAssignments/write .

È possibile assegnare ruoli controllo degli accessi in base al ruolo di Azure a un utente usando il portale di Azure, l'interfaccia della riga di comando di Azure o Azure PowerShell. Per ulteriori informazioni sugli ambiti disponibili per le assegnazioni di ruolo, consultare Comprendere l'ambito per Azure RBAC.

L'esempio seguente assegna il ruolo Azure Service Bus Data Owner all'account utente, che fornisce l'accesso completo alle risorse del Bus di servizio di Azure. In uno scenario reale, seguire il principio dei privilegi minimi per concedere agli utenti solo le autorizzazioni minime necessarie per un ambiente di produzione più sicuro.

Ruoli predefiniti di Azure per il Bus di servizio di Azure

Per il Bus di servizio di Azure, la gestione degli spazi dei nomi e di tutte le risorse correlate tramite il portale di Azure e l'API Gestione risorse di Azure è già protetto mediante il modello RBAC di Azure. Azure fornisce i ruoli predefiniti di Azure seguenti per autorizzare l'accesso a uno spazio dei nomi del bus di servizio:

Per creare un ruolo personalizzato, vedere Diritti necessari per le operazioni del Bus di servizio.

Aggiungere l'utente di Microsoft Entra al ruolo Proprietario del Bus di servizio di Azure

Aggiungere il nome utente di Microsoft Entra al ruolo Proprietario dei dati del Bus di servizio di Azure a livello di spazio dei nomi del Bus di servizio. Questa configurazione consente a un'app eseguita nel contesto dell'account utente di inviare messaggi a una coda o a un argomento. Può ricevere messaggi da una coda o da una sottoscrizione di un argomento.

Importante

Nella maggior parte dei casi, la propagazione dell'assegnazione di ruolo in Azure richiede un minuto o due. In rari casi, potrebbero essere necessari fino a otto minuti. Se si ricevono errori di autenticazione quando si esegue il codice per la prima volta, attendere alcuni istanti e riprovare.

  1. Se la pagina Spazio dei nomi del Bus di servizio non è aperta nel portale di Azure, individuare lo spazio dei nomi del Bus di servizio usando la barra di ricerca principale o lo spostamento a sinistra.

  2. Nella pagina Panoramica selezionare Controllo di accesso (IAM) dal menu a sinistra.

  3. Nella pagina Controllo di accesso (IAM), selezionare la scheda Assegnazioni di ruolo.

  4. Selezionare + Aggiungi dal menu in alto e quindi Aggiungi assegnazione di ruolo.

    Screenshot che mostra come assegnare un ruolo.

  5. Usare la casella di ricerca per filtrare i risultati in base al ruolo desiderato. Per questo esempio, cercare Azure Service Bus Data Owner e selezionare il risultato corrispondente. Scegliere quindi Avanti.

  6. In Assegna accesso a selezionare Utente, gruppo o entità servizio e quindi scegliere + Seleziona membri.

  7. Nella finestra di dialogo cercare il nome utente di Microsoft Entra (in genere l'indirizzo di posta elettronica user@domain) e quindi scegliere Selezionare nella parte inferiore della finestra di dialogo.

  8. Selezionare Rivedi e assegna per passare alla pagina finale e quindi Rivedi e assegna di nuovo per completare il processo.

Inviare messaggi a una coda

In questa sezione, crei un progetto console Java e aggiungi il codice per inviare messaggi alla coda che hai creato in precedenza.

Creare un progetto di console Java

Creare un progetto Java usando Eclipse o un altro strumento a scelta.

Configurare l'applicazione per l'uso del bus di servizio

Aggiungere riferimenti alle librerie di Azure Core e del Bus di servizio di Azure.

Se si usa Eclipse e si crea un'applicazione console Java, convertire il progetto Java in maven: fare clic con il pulsante destro del mouse sul progetto nella finestra Esplora pacchetti . Selezionare Configura>Converti in progetto Maven. Aggiungere quindi dipendenze a queste due librerie, come illustrato nell'esempio seguente.

Aggiornare il file pom.xml per aggiungere dipendenze al Bus di servizio di Azure e ai pacchetti di identità di Azure.

    <dependencies>
        <dependency>
            <groupId>com.azure</groupId>
            <artifactId>azure-messaging-servicebus</artifactId>
            <version>7.13.3</version>
        </dependency>
        <dependency>
            <groupId>com.azure</groupId>
            <artifactId>azure-identity</artifactId>
            <version>1.8.0</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>

Aggiungere il codice per inviare messaggi alla coda

  1. Aggiungere le istruzioni import seguenti nell'argomento del file Java.

    import com.azure.messaging.servicebus.*;
    import com.azure.identity.*;
    
    import java.util.concurrent.TimeUnit;
    import java.util.Arrays;
    import java.util.List;
    
  2. Nella classe definire le variabili per contenere la stringa di connessione e il nome della coda.

    static String queueName = "<QUEUE NAME>";
    

    Importante

    Sostituire <QUEUE NAME> con il nome della coda.

  3. Aggiungere un metodo denominato sendMessage nella classe per inviare un messaggio alla coda.

    Importante

    Sostituire NAMESPACENAME con il nome dello spazio dei nomi del bus di servizio.

    static void sendMessage()
    {
        // create a token using the default Azure credential
        DefaultAzureCredential credential = new DefaultAzureCredentialBuilder()
                .build();
    
        ServiceBusSenderClient senderClient = new ServiceBusClientBuilder()
                .fullyQualifiedNamespace("NAMESPACENAME.servicebus.windows.net")
                .credential(credential)
                .sender()
                .queueName(queueName)
                .buildClient();
    
        // send one message to the queue
        senderClient.sendMessage(new ServiceBusMessage("Hello, World!"));
        System.out.println("Sent a single message to the queue: " + queueName);
    }
    
    
  4. Aggiungere un metodo denominato createMessages nella classe per creare un elenco di messaggi. In genere, questi messaggi provengono da parti diverse dell'applicazione. In questo esempio viene usato un elenco di messaggi di esempio.

    static List<ServiceBusMessage> createMessages()
    {
        // create a list of messages and return it to the caller
        ServiceBusMessage[] messages = {
                new ServiceBusMessage("First message"),
                new ServiceBusMessage("Second message"),
                new ServiceBusMessage("Third message")
        };
        return Arrays.asList(messages);
    }
    
  5. Aggiungere un metodo denominato sendMessageBatch per inviare messaggi alla coda creata. Questo metodo crea un oggetto ServiceBusSenderClient per la coda, richiama il metodo createMessages per ottenere l'elenco di messaggi, prepara uno o più batch e li invia alla coda.

    Importante

    Sostituire NAMESPACENAME con il nome dello spazio dei nomi del bus di servizio.

    static void sendMessageBatch()
    {
        // create a token using the default Azure credential
        DefaultAzureCredential credential = new DefaultAzureCredentialBuilder()
                .build();
    
        ServiceBusSenderClient senderClient = new ServiceBusClientBuilder()
                .fullyQualifiedNamespace("NAMESPACENAME.servicebus.windows.net")
                .credential(credential)
                .sender()
                .queueName(queueName)
                .buildClient();
    
        // Creates an ServiceBusMessageBatch where the ServiceBus.
        ServiceBusMessageBatch messageBatch = senderClient.createMessageBatch();
    
        // create a list of messages
        List<ServiceBusMessage> listOfMessages = createMessages();
    
        // We try to add as many messages as a batch can fit based on the maximum size and send to Service Bus when
        // the batch can hold no more messages. Create a new batch for next set of messages and repeat until all
        // messages are sent.
        for (ServiceBusMessage message : listOfMessages) {
            if (messageBatch.tryAddMessage(message)) {
                continue;
            }
    
            // The batch is full, so we create a new batch and send the batch.
            senderClient.sendMessages(messageBatch);
            System.out.println("Sent a batch of messages to the queue: " + queueName);
    
            // create a new batch
            messageBatch = senderClient.createMessageBatch();
    
            // Add that message that we couldn't before.
            if (!messageBatch.tryAddMessage(message)) {
                System.err.printf("Message is too large for an empty batch. Skipping. Max size: %s.", messageBatch.getMaxSizeInBytes());
            }
        }
    
        if (messageBatch.getCount() > 0) {
            senderClient.sendMessages(messageBatch);
            System.out.println("Sent a batch of messages to the queue: " + queueName);
        }
    
        //close the client
        senderClient.close();
    }
    

Ricevere messaggi da una coda

In questa sezione si aggiunge il codice per recuperare i messaggi dalla coda.

  1. Aggiungere un metodo denominato receiveMessages per ricevere messaggi dalla coda. Questo metodo crea un oggetto ServiceBusProcessorClient per la coda specificando un gestore per l'elaborazione di messaggi e un altro per la gestione degli errori. Quindi avvia il processore, aspetta alcuni secondi, stampa i messaggi ricevuti e infine arresta e chiude il processore.

    Importante

    • Sostituire NAMESPACENAME con il nome dello spazio dei nomi del bus di servizio.
    // handles received messages
    static void receiveMessages() throws InterruptedException
    {
        DefaultAzureCredential credential = new DefaultAzureCredentialBuilder()
                .build();
    
        ServiceBusProcessorClient processorClient = new ServiceBusClientBuilder()
                .fullyQualifiedNamespace("NAMESPACENAME.servicebus.windows.net")
                .credential(credential)
                .processor()
                .queueName(queueName)
                .processMessage(context -> processMessage(context))
                .processError(context -> processError(context))
                .buildProcessorClient();
    
        System.out.println("Starting the processor");
        processorClient.start();
    
        TimeUnit.SECONDS.sleep(10);
        System.out.println("Stopping and closing the processor");
        processorClient.close();
    }
    
  2. Aggiungere il metodo processMessage per elaborare un messaggio ricevuto dalla sottoscrizione del Bus di servizio.

    private static void processMessage(ServiceBusReceivedMessageContext context) {
        ServiceBusReceivedMessage message = context.getMessage();
        System.out.printf("Processing message. Session: %s, Sequence #: %s. Contents: %s%n", message.getMessageId(),
            message.getSequenceNumber(), message.getBody());
    }
    
  3. Aggiungere il metodo processError per gestire i messaggi di errore.

    private static void processError(ServiceBusErrorContext context) {
        System.out.printf("Error when receiving messages from namespace: '%s'. Entity: '%s'%n",
            context.getFullyQualifiedNamespace(), context.getEntityPath());
    
        if (!(context.getException() instanceof ServiceBusException)) {
            System.out.printf("Non-ServiceBusException occurred: %s%n", context.getException());
            return;
        }
    
        ServiceBusException exception = (ServiceBusException) context.getException();
        ServiceBusFailureReason reason = exception.getReason();
    
        if (reason == ServiceBusFailureReason.MESSAGING_ENTITY_DISABLED
            || reason == ServiceBusFailureReason.MESSAGING_ENTITY_NOT_FOUND
            || reason == ServiceBusFailureReason.UNAUTHORIZED) {
            System.out.printf("An unrecoverable error occurred. Stopping processing with reason %s: %s%n",
                reason, exception.getMessage());
        } else if (reason == ServiceBusFailureReason.MESSAGE_LOCK_LOST) {
            System.out.printf("Message lock lost for message: %s%n", context.getException());
        } else if (reason == ServiceBusFailureReason.SERVICE_BUSY) {
            try {
                // Choosing an arbitrary amount of time to wait until trying again.
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                System.err.println("Unable to sleep for period of time");
            }
        } else {
            System.out.printf("Error source %s, reason %s, message: %s%n", context.getErrorSource(),
                reason, context.getException());
        }
    }
    
  4. Aggiornare il metodo main per richiamare i metodi sendMessage, sendMessageBatch e receiveMessages e per generare InterruptedException.

    public static void main(String[] args) throws InterruptedException {
        sendMessage();
        sendMessageBatch();
        receiveMessages();
    }
    

Eseguire l'app

  1. Se si usa Eclipse, fare clic con il pulsante destro del mouse sul progetto, scegliere Esporta, espandere Java, selezionare Esegui file JAR eseguibile e seguire la procedura per creare un file JAR eseguibile.

  2. Se si è connessi con un account utente diverso da quello aggiunto al ruolo Proprietario dati del bus di servizio di Azure, seguire questa procedura. In caso contrario, procedere per eseguire il file JAR nel passaggio successivo.

    1. Installare l'interfaccia della riga di comando di Azure nel computer.

    2. Eseguire il comando seguente dell'interfaccia della riga di comando per accedere ad Azure. Usare lo stesso account utente aggiunto al ruolo Proprietario dati del Bus di servizio di Azure.

      az login
      
  3. Eseguire il file Jar usando il comando seguente.

    java -jar <JAR FILE NAME>
    
  4. Nella finestra della console è visualizzato l'output seguente.

    Sent a single message to the queue: myqueue
    Sent a batch of messages to the queue: myqueue
    Starting the processor
    Processing message. Session: 88d961dd801f449e9c3e0f8a5393a527, Sequence #: 1. Contents: Hello, World!
    Processing message. Session: e90c8d9039ce403bbe1d0ec7038033a0, Sequence #: 2. Contents: First message
    Processing message. Session: 311a216a560c47d184f9831984e6ac1d, Sequence #: 3. Contents: Second message
    Processing message. Session: f9a871be07414baf9505f2c3d466c4ab, Sequence #: 4. Contents: Third message
    Stopping and closing the processor
    

Nella pagina Panoramica dello spazio dei nomi del bus di servizio nel portale di Azure è possibile visualizzare il numero di messaggi in ingresso e in uscita. Aspettare circa un minuto quindi aggiornare la pagina per vedere i valori più recenti.

Lo screenshot mostra il numero di messaggi in ingresso e in uscita.

Selezionare la coda in questa pagina Panoramica per passare alla pagina Coda del bus di servizio. Anche in questa pagina viene visualizzato il numero di messaggi in ingresso e in uscita. Vengono visualizzate anche altre informazioni, ad esempio le dimensioni correnti della coda e le dimensioni massime, il numero di messaggi attivi.

La schermata mostra i dettagli della coda dei messaggi di questa coda.

Vedere la documentazione e gli esempi seguenti: