Použití Azure Storage Queue ve Spring aplikacích

Tento článek ukazuje, jak používat Azure Storage Queue v aplikacích Java vytvořených pomocí Spring Framework.

Azure Storage Queue implementuje cloudové fronty, které umožňují komunikaci mezi komponentami distribuované aplikace. Každá fronta udržuje seznam zpráv, které mohou být přidány komponentou odesílatele a zpracovány komponentou příjemce. Díky frontě se vaše aplikace může škálovat okamžitě, aby splňovala poptávku.

Spring Cloud Azure poskytuje různé moduly pro použití architektur Spring k odesílání zpráv a přijímání zpráv z Azure Storage front. Tyto moduly můžete používat nezávisle nebo je kombinovat pro různé případy použití, jak je popsáno v následujícím seznamu:

Požadavky

Poznámka:

Pokud chcete účtu udělit přístup k prostředkům, přiřaďte v nově vytvořeném účtu Azure Storage roli Storage Queue Data Contributor k účtu Microsoft Entra, který právě používáte. Další informace najdete v tématu Assignování rolí Azure pomocí portálu Azure.

Důležité

K dokončení kroků v tomto kurzu se vyžaduje Spring Boot verze 2.5 nebo vyšší.

Příprava místního prostředí

V tomto kurzu konfigurace a kód nemají žádné ověřovací operace. Připojení ke službě Azure ale vyžaduje ověření. K dokončení ověřování je potřeba použít klientskou knihovnu Azure Identity. Spring Cloud Azure používá DefaultAzureCredential, které knihovna identit Azure poskytuje, aby vám pomohla získat přihlašovací údaje bez jakýchkoli změn kódu.

DefaultAzureCredential podporuje více metod ověřování a určuje, kterou metodu použít za běhu. Tento přístup umožňuje vaší aplikaci používat různé metody ověřování v různých prostředích , jako jsou místní nebo produkční prostředí, bez implementace kódu specifického pro prostředí. Další informace najdete v části DefaultAzureCredential v části Authenticate Azure hostované Java aplikace.

Pokud chcete k dokončení ověřování v místních vývojových prostředích použít Azure CLI, IntelliJ nebo jiné metody, přečtěte si Azure ověřování v Java vývojových prostředích. K dokončení ověřování v Azure hostitelských prostředích doporučujeme použít spravovanou identitu. Další informace najdete v tématu Co jsou spravované identity pro prostředky Azure?

Použití startéru fronty úložiště Spring Cloud Azure

Modul Spring Cloud Azure Storage Queue Starter importuje klientskou knihovnu Azure Storage Queue pro Java s architekturou Spring Boot. Spring Cloud Azure a Azure SDK můžete používat společně, aniž by se vzájemně vylučovaly. Takže můžete v aplikaci Spring dál používat Java klient API pro fronty úložiště.

Přidat závislosti

Pokud chcete nainstalovat modul Spring Cloud Azure Storage Queue Starter, přidejte do souboru 0>pom.xml

  • Spring Cloud Azure Bill of Materials (BOM):

    <dependencyManagement>
       <dependencies>
         <dependency>
           <groupId>com.azure.spring</groupId>
           <artifactId>spring-cloud-azure-dependencies</artifactId>
           <version>7.3.0</version>
           <type>pom</type>
           <scope>import</scope>
           </dependency>
       </dependencies>
    </dependencyManagement>
    

    Poznámka:

    Pokud používáte Spring Boot 4.0.x, nezapomeňte nastavit spring-cloud-azure-dependencies verzi na 7.3.0.

    Pokud používáte Spring Boot 3.5.x, nezapomeňte nastavit spring-cloud-azure-dependencies verzi na 6.4.0hodnotu.

    Pokud používáte Spring Boot 3.1.x-3.5.x, nezapomeňte nastavit verzi na spring-cloud-azure-dependencies.

    Pokud používáte Spring Boot 2.x, nezapomeňte nastavit spring-cloud-azure-dependencies verzi na 4.20.0.

    Tato faktura materiálu (BOM) by měla být nakonfigurována v <dependencyManagement> části vašeho pom.xml souboru. Tím zajistíte, že všechny závislosti Spring Cloud Azure budou používat stejnou verzi.

    Další informace o verzi použité pro tento BOM najdete v tématu Kterou verzi Spring Cloud Azure bych měl(a) použít.

  • Artefakt Spring Cloud pro Azure Queue Storageů:

    <dependency>
      <groupId>com.azure.spring</groupId>
      <artifactId>spring-cloud-azure-starter-storage-queue</artifactId>
    </dependency>
    

Kódování aplikace pro odesílání a příjem zpráv

V této části se dozvíte, jak používat klienty Azure Queue Storage v kontextu aplikace Spring. Máte následující dvě možnosti:

  • Použijte automatickou konfiguraci Spring Boot a klienty připravené k okamžitému použití z kontextu Spring (doporučeno).
  • Programově sestavte klienta.

S automatickou konfigurací můžete automaticky propojit klientské komponenty z kontejneru Spring IoC (inversion-of-control). Tento přístup poskytuje flexibilnější a efektivnější zážitek při práci s klienty fronty úložiště. Automatická konfigurace má následující výhody:

  • Automatická konfigurace používá externalizovanou konfiguraci , abyste mohli pracovat se stejným kódem aplikace v různých prostředích.

  • Na architekturu Spring Boot můžete delegovat proces učení modelu tvůrce a registraci klientů do kontextu aplikace. Zaměřujete se jenom na to, jak používat klienty s vlastními obchodními požadavky.

  • Indikátor stavu můžete použít ke kontrole stavu a stavu aplikace a interních komponent.

Příklady kódu v následujících částech ukazují, jak se používají QueueClient se dvěma alternativami popsanými.

Návod

Azure Java SDK pro fronty úložiště zahrnuje více klientů pro interakci s frontami úložiště. Startér také poskytuje automatickou konfiguraci pro všechny klienty fronty úložiště a tvůrce klientů. Tento článek používá pouze QueueClient jako příklad.

Použití automatické konfigurace Spring Bootu

Pokud chcete odesílat zprávy do front Azure Storage a přijímat je z těchto front, nakonfigurujte aplikaci pomocí následujícího postupu:

  1. Nakonfigurujte název svého úložiště a název fronty, jak je znázorněno v následujícím příkladu:

    spring.cloud.azure.storage.queue.account-name=<your-storage-account-name>
    spring.cloud.azure.storage.queue.queue-name=<your-storage-queue-name>
    
  2. Vložte komponentu QueueClient do vaší Spring aplikace a volejte související rozhraní API pro odesílání zpráv, jak ukazuje následující příklad:

    import com.azure.storage.queue.QueueClient;
    import com.azure.storage.queue.models.QueueMessageItem;
    import com.azure.storage.queue.models.SendMessageResult;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.CommandLineRunner;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class StorageQueueClientApplication implements CommandLineRunner {
    
        private final static Logger logger = LoggerFactory.getLogger(StorageQueueClientApplication.class);
    
        @Autowired
        private QueueClient queueClient;
    
        public static void main(String[] args) {
            SpringApplication.run(StorageQueueClientApplication.class, args);
        }
    
        @Override
        public void run(String... args) {
         // Using the QueueClient object, call the create method to create the queue in your storage account.
            queueClient.create();
            SendMessageResult sendMessageResult = queueClient.sendMessage("Hello world");
            logger.info("Send message id: {}", sendMessageResult.getMessageId());
    
            QueueMessageItem queueMessageItem = queueClient.receiveMessage();
            logger.info("Received message: {}", new String(queueMessageItem.getBody().toBytes()));
        }
    
    }
    
  3. Spusťte aplikaci. Po spuštění aplikace vytvoří protokoly podobné následujícímu příkladu:

    Send message id: ...
    Received message: Hello world
    

Programové sestavení klienta

Klientské beany můžete sestavit sami, ale proces je komplikovaný. V aplikacích Spring Boot musíte spravovat vlastnosti, zjistit vzor tvůrce a zaregistrovat klienty do kontextu aplikace Spring. Následující kroky ukazují, jak to udělat.

  1. Sestavte klienta programově v aplikaci Spring, jak je znázorněno v následujícím příkladu. Ujistěte se, že zástupný symbol <storage-account-name> nahradíte vlastní hodnotou.

    import com.azure.identity.DefaultAzureCredentialBuilder;
    import com.azure.storage.queue.QueueClient;
    import com.azure.storage.queue.QueueClientBuilder;
    import com.azure.storage.queue.models.QueueMessageItem;
    import com.azure.storage.queue.models.SendMessageResult;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.boot.CommandLineRunner;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class StorageQueueClientApplication implements CommandLineRunner {
    
        private final static String queueName = "test-queue";
        private final static String endpoint = "https://<storage-account-name>.queue.core.windows.net/";
        private final static Logger logger = LoggerFactory.getLogger(StorageQueueClientApplication.class);
    
        QueueClient queueClient = new QueueClientBuilder()
            .endpoint(endpoint)
            .queueName(queueName)
            .credential(new DefaultAzureCredentialBuilder().build())
            .buildClient();
    
        public static void main(String[] args) {
            SpringApplication.run(StorageQueueClientApplication.class, args);
        }
    
        @Override
        public void run(String... args) {
         // Using the QueueClient object, call the create method to create the queue in your storage account.
            queueClient.create();
            SendMessageResult sendMessageResult = queueClient.sendMessage("Hello world");
            logger.info("Send message id: {}", sendMessageResult.getMessageId());
    
            QueueMessageItem queueMessageItem = queueClient.receiveMessage();
            logger.info("Received message: {}", new String(queueMessageItem.getBody().toBytes()));
        }
    
    }
    
  2. Spusťte aplikaci. Po spuštění aplikace vytvoří protokoly podobné následujícímu příkladu:

    Send message id: ...
    Received message: Hello world
    

Následující seznam ukazuje důvody, proč tento kód není flexibilní nebo elegantní:

  • Názvy účtů úložiště a front jsou pevně zakódované.
  • Pokud používáte @Value k získání konfigurací z prostředí Spring, nemůžete mít v souboru application.properties nápovědy IDE.
  • Pokud máte scénář mikroslužby, musíte kód v každém projektu duplikovat a je snadné udělat chyby a těžko být konzistentní.

Naštěstí není nezbytné vytvářet klientské komponenty sami pomocí služby Azure Spring Cloud. Místo toho je můžete přímo vložit a použít vlastnosti konfigurace, které už znáte ke konfiguraci fronty úložiště. Další informace najdete v tématu Vlastnosti konfigurace Spring Cloud Azure.

Spring Cloud Azure také poskytuje následující globální konfigurace pro různé scénáře. Další informace najdete v tématu Spring Cloud Azure vlastnosti globální konfigurace.

  • Možnosti proxy serveru.
  • Možnosti opakování

Můžete se také připojit k různým Azure cloudům. Další informace najdete v tématu Pojení k různým cloudům Azure.

Použijte Spring Messaging Azure Storage Queue

Modul Spring Messaging Azure Storage Queue poskytuje podporu architektury Spring Messaging s Azure Queue Storage.

Pokud používáte frontu Spring Messaging Azure Storage, můžete k asynchronnímu a synchronnímu odesílání zpráv do front úložiště použít funkci StorageQueueTemplate.

Následující části ukazují, jak používat Spring Messaging Azure Storage Queue k odesílání a přijímání zpráv z front úložiště.

Přidat závislosti

Pokud chcete nainstalovat modul Spring Messaging Azure Storage Queue, přidejte do souboru pom.xml0 následující závislosti:

  • Spring Cloud Azure Bill of Materials (BOM):

    <dependencyManagement>
       <dependencies>
         <dependency>
           <groupId>com.azure.spring</groupId>
           <artifactId>spring-cloud-azure-dependencies</artifactId>
           <version>7.3.0</version>
           <type>pom</type>
           <scope>import</scope>
           </dependency>
       </dependencies>
    </dependencyManagement>
    

    Poznámka:

    Pokud používáte Spring Boot 4.0.x, nezapomeňte nastavit spring-cloud-azure-dependencies verzi na 7.3.0.

    Pokud používáte Spring Boot 3.5.x, nezapomeňte nastavit spring-cloud-azure-dependencies verzi na 6.4.0hodnotu.

    Pokud používáte Spring Boot 3.1.x-3.5.x, nezapomeňte nastavit verzi na spring-cloud-azure-dependencies.

    Pokud používáte Spring Boot 2.x, nezapomeňte nastavit spring-cloud-azure-dependencies verzi na 4.20.0.

    Tato faktura materiálu (BOM) by měla být nakonfigurována v <dependencyManagement> části vašeho pom.xml souboru. Tím zajistíte, že všechny závislosti Spring Cloud Azure budou používat stejnou verzi.

    Další informace o verzi použité pro tento BOM najdete v tématu Kterou verzi Spring Cloud Azure bych měl(a) použít.

  • Startovací moduly Spring Cloud Azure a artefakty Spring Messaging Storage Queue:

    <dependency>
      <groupId>com.azure.spring</groupId>
      <artifactId>spring-cloud-azure-starter</artifactId>
    </dependency>
    <dependency>
      <groupId>com.azure.spring</groupId>
      <artifactId>spring-messaging-azure-storage-queue</artifactId>
    </dependency>
    

Kódování aplikace pro odesílání a příjem zpráv

Ke konfiguraci a kódování aplikace použijte následující postup:

  1. Nakonfigurujte název účtu služby Azure Storage pro vaše úložné fronty, jak je znázorněno v následujícím příkladu:

    spring.cloud.azure.storage.queue.account-name=<your-storage-account-name>
    
  2. Pro připojení odesílatele a příjemce k odesílání a přijímání zpráv pomocí Springu, jak je znázorněno v následujícím příkladu. Ujistěte se, že zástupný symbol <storage-queue-name> nahradíte vlastní hodnotou.

    import com.azure.spring.messaging.AzureHeaders;
    import com.azure.spring.messaging.checkpoint.Checkpointer;
    import com.azure.spring.messaging.storage.queue.core.StorageQueueTemplate;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.CommandLineRunner;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.messaging.Message;
    import org.springframework.messaging.support.MessageBuilder;
    import java.time.Duration;
    
    @SpringBootApplication
    public class StorageQueueMessagingApplication implements CommandLineRunner {
    
        private static final Logger LOGGER = LoggerFactory.getLogger(StorageQueueMessagingApplication.class);
        private static final String STORAGE_QUEUE_NAME = "<storage-queue-name>";
    
        @Autowired
        StorageQueueTemplate storageQueueTemplate;
    
        public static void main(String[] args) {
            SpringApplication.run(StorageQueueMessagingApplication.class, args);
        }
    
        @Override
        public void run(String... args) {
            storageQueueTemplate
                .sendAsync(STORAGE_QUEUE_NAME, MessageBuilder.withPayload("Hello world").build())
                .subscribe();
            LOGGER.info("Message was sent successfully.");
    
            Message<?> message = storageQueueTemplate.receiveAsync(STORAGE_QUEUE_NAME, Duration.ofSeconds(30)).block();
            LOGGER.info("Received message: {}", new String((byte[]) message.getPayload()));
        }
    
    }
    
  3. Spusťte aplikaci. Po spuštění aplikace vytvoří protokoly podobné následujícímu příkladu:

    Message was sent successfully.
    ...
    Received message: Hello World
    

Použití Spring Integration Azure Storage Queue

Modul Spring Integration Azure Storage Queue poskytuje podporu pro architekturu integrace Spring s frontami úložiště.

Pokud vaše aplikace Spring používá kanály zpráv Spring Integration, můžete směrovat zprávy mezi kanály zpráv a frontou úložiště pomocí adaptérů kanálů. Adaptér příchozího kanálu předává zprávy z úložné fronty do kanálu zpráv. Adaptér odchozího kanálu publikuje zprávy ze zprávového kanálu do fronty úložiště.

Následující části ukazují, jak používat Spring Integration Azure Storage Queue k odesílání a přijímání zpráv do a z front úložiště.

Přidat závislosti

Pokud chcete nainstalovat modul Spring Integration Azure Storage Queue, přidejte do souboru pom.xml následující závislosti:

  • Spring Cloud Azure Bill of Materials (BOM):

    <dependencyManagement>
       <dependencies>
         <dependency>
           <groupId>com.azure.spring</groupId>
           <artifactId>spring-cloud-azure-dependencies</artifactId>
           <version>7.3.0</version>
           <type>pom</type>
           <scope>import</scope>
           </dependency>
       </dependencies>
    </dependencyManagement>
    

    Poznámka:

    Pokud používáte Spring Boot 4.0.x, nezapomeňte nastavit spring-cloud-azure-dependencies verzi na 7.3.0.

    Pokud používáte Spring Boot 3.5.x, nezapomeňte nastavit spring-cloud-azure-dependencies verzi na 6.4.0hodnotu.

    Pokud používáte Spring Boot 3.1.x-3.5.x, nezapomeňte nastavit verzi na spring-cloud-azure-dependencies.

    Pokud používáte Spring Boot 2.x, nezapomeňte nastavit spring-cloud-azure-dependencies verzi na 4.20.0.

    Tato faktura materiálu (BOM) by měla být nakonfigurována v <dependencyManagement> části vašeho pom.xml souboru. Tím zajistíte, že všechny závislosti Spring Cloud Azure budou používat stejnou verzi.

    Další informace o verzi použité pro tento BOM najdete v tématu Kterou verzi Spring Cloud Azure bych měl(a) použít.

  • Artefakty fronty Azure Storage integrace Spring:

    <dependency>
      <groupId>com.azure.spring</groupId>
      <artifactId>spring-cloud-azure-starter-integration-storage-queue</artifactId>
    </dependency>
    

Kódování aplikace pro odesílání a příjem zpráv

Ke konfiguraci a kódování aplikace použijte následující postup:

  1. Nakonfigurujte název účtu Azure Storage pro fronty úložiště.

    spring.cloud.azure.storage.queue.account-name=<your-storage-account-name>
    
  2. Vytvořte novou třídu QueueReceiveConfiguration Java, jak je znázorněno v následujícím příkladu. Tato třída slouží k definování příjemce zprávy. Ujistěte se, že zástupný symbol <storage-queue-name> nahradíte vlastní hodnotou.

    import com.azure.spring.integration.storage.queue.inbound.StorageQueueMessageSource;
    import com.azure.spring.messaging.AzureHeaders;
    import com.azure.spring.messaging.checkpoint.Checkpointer;
    import com.azure.spring.messaging.storage.queue.core.StorageQueueTemplate;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.integration.annotation.InboundChannelAdapter;
    import org.springframework.integration.annotation.Poller;
    import org.springframework.integration.annotation.ServiceActivator;
    import org.springframework.messaging.handler.annotation.Header;
    
    @Configuration
    public class QueueReceiveConfiguration {
    
        private static final Logger LOGGER = LoggerFactory.getLogger(QueueReceiveConfiguration.class);
        private static final String STORAGE_QUEUE_NAME = "<storage-queue-name>";
        private static final String INPUT_CHANNEL = "input";
    
        @Bean
        @InboundChannelAdapter(channel = INPUT_CHANNEL, poller = @Poller(fixedDelay = "1000"))
        public StorageQueueMessageSource storageQueueMessageSource(StorageQueueTemplate storageQueueTemplate) {
            return new StorageQueueMessageSource(STORAGE_QUEUE_NAME, storageQueueTemplate);
        }
    
        @ServiceActivator(inputChannel = INPUT_CHANNEL)
        public void messageReceiver(byte[] payload, @Header(AzureHeaders.CHECKPOINTER) Checkpointer checkpointer) {
            String message = new String(payload);
            LOGGER.info("Received message: {}", message);
        }
    
    }
    
  3. Vytvořte novou třídu QueueSendConfiguration Java, jak je znázorněno v následujícím příkladu. Tato třída slouží k definování odesílatele zprávy. Ujistěte se, že zástupný symbol <storage-queue-name> nahradíte vlastní hodnotou.

    import com.azure.spring.integration.core.handler.DefaultMessageHandler;
    import com.azure.spring.messaging.storage.queue.core.StorageQueueTemplate;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.integration.annotation.MessagingGateway;
    import org.springframework.integration.annotation.ServiceActivator;
    import org.springframework.messaging.MessageHandler;
    import org.springframework.util.concurrent.ListenableFutureCallback;
    
    @Configuration
    public class QueueSendConfiguration {
    
        private static final Logger LOGGER = LoggerFactory.getLogger(QueueSendConfiguration.class);
        private static final String STORAGE_QUEUE_NAME = "<storage-queue-name>";
        private static final String OUTPUT_CHANNEL = "output";
    
        @Bean
        @ServiceActivator(inputChannel = OUTPUT_CHANNEL)
        public MessageHandler messageSender(StorageQueueTemplate storageQueueTemplate) {
            DefaultMessageHandler handler = new DefaultMessageHandler(STORAGE_QUEUE_NAME, storageQueueTemplate);
            handler.setSendCallback(new ListenableFutureCallback<Void>() {
                @Override
                public void onSuccess(Void result) {
                    LOGGER.info("Message was sent successfully.");
                }
    
                @Override
                public void onFailure(Throwable ex) {
                    LOGGER.info("There was an error sending the message.");
                }
            });
            return handler;
        }
    
        @MessagingGateway(defaultRequestChannel = OUTPUT_CHANNEL)
        public interface StorageQueueOutboundGateway {
            void send(String text);
        }
    
    }
    
  4. Připojení odesílatele a příjemce k odesílání a přijímání zpráv pomocí Springu

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.context.ConfigurableApplicationContext;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.integration.config.EnableIntegration;
    
    @SpringBootApplication
    @EnableIntegration
    @Configuration(proxyBeanMethods = false)
    public class StorageQueueIntegrationApplication {
    
        public static void main(String[] args) {
            ConfigurableApplicationContext applicationContext = SpringApplication.run(StorageQueueIntegrationApplication.class, args);
            QueueSendConfiguration.StorageQueueOutboundGateway storageQueueOutboundGateway = applicationContext.getBeanQueueSendConfiguration.StorageQueueOutboundGateway.class);
            storageQueueOutboundGateway.send("Hello World");
        }
    
    }
    

    Návod

    Nezapomeňte přidat poznámku @EnableIntegration , která umožňuje infrastrukturu integrace Spring.

  5. Spusťte aplikaci. Po spuštění aplikace vytvoří protokoly podobné následujícímu příkladu:

    Message was sent successfully.
    Received message: Hello World
    

Nasazení do Azure Spring Apps

Teď, když máte aplikaci Spring Boot spuštěnou místně, je čas ji přesunout do produkčního prostředí. Azure Spring Apps usnadňuje nasazování aplikací Spring Boot do Azure bez jakýchkoli změn kódu. Služba spravuje infrastrukturu aplikací Spring, aby se vývojáři mohli soustředit na svůj kód. Azure Spring Apps poskytuje správu životního cyklu pomocí komplexního monitorování a diagnostiky, správy konfigurace, zjišťování služeb, integrace CI/CD, modrých zelených nasazení a dalších. Pokud chcete aplikaci nasadit do Azure Spring Apps, viz Nasazení první aplikace na Azure Spring Apps.

Další kroky

Viz také

Další informace o úvodních počátcích Spring Boot, které jsou k dispozici pro Microsoft Azure, najdete v tématu Co je Spring Cloud Azure?