Jak používat Queue Storage z Javy
Přehled
V tomto průvodci se dozvíte, jak kódovat běžné scénáře pomocí služby Azure Queue Storage. Ukázky jsou napsané v Javě a využívají sadu SDK služby Azure Storage pro Javu. Mezi scénáře patří vkládání, náhledování, získávání a odstraňování zpráv ve frontě. Probíraný je také kód pro vytváření a odstraňování front. Další informace o frontách najdete v části Další kroky .
Co je Queue Storage?
Azure Queue Storage je služba pro ukládání velkého počtu zpráv, ke které můžete získat přístup z jakéhokoli místa na světě prostřednictvím ověřených volání s využitím protokolu HTTP nebo HTTPS. Zpráva s jednou frontou může mít velikost až 64 kB a jedna fronta můžete obsahovat miliony zpráv, až do dosažení celkové kapacity účtu úložiště. Queue Storage se často používá k vytvoření backlogu práce, která se má zpracovat asynchronně.
Koncepty služby Fronta
Služba Azure Queue obsahuje následující komponenty:
Účet úložiště: Veškerý přístup ke službě Azure Storage se provádí prostřednictvím účtu úložiště. Další informace o účtech úložiště najdete v tématu Přehled účtu úložiště.
Fronta: Fronta obsahuje sadu zpráv. Všechny zprávy musí být ve frontě. Upozorňujeme, že název fronty musí být psaný malými písmeny. Informace o pojmenování front najdete v tématu Pojmenování front a metadata.
Zpráva: Zprávu v libovolném formátu o velikosti až 64 kB. Maximální doba, po kterou může zpráva zůstat ve frontě, je 7 dní. Pro verzi 2017-07-29 nebo novější může být maximální hodnota time-to-live libovolné kladné číslo nebo -1 označující, že platnost zprávy nevyprší. Pokud je tento parametr vynechán, výchozí hodnota time-to-live je sedm dní.
Formát adresy URL: Fronty lze adresovat pomocí následujícího formátu adresy URL: http://
<storage account>
.queue.core.windows.net/<queue>
Následující adresa URL odkazuje na frontu v diagramu:
http://myaccount.queue.core.windows.net/incoming-orders
Vytvoření účtu úložiště Azure
Nejjednodušší způsob, jak vytvořit první účet úložiště Azure, je použít Azure Portal. Další informace najdete v tématu Vytvoření účtu úložiště.
Účet úložiště Azure můžete vytvořit také pomocí prostředí Azure PowerShell, rozhraní příkazového řádku Azure nebo pomocí poskytovatele prostředků služby Azure Storage pro .NET.
Pokud nechcete v tuto chvíli vytvořit účet úložiště v Azure, můžete také použít emulátor úložiště Azurite ke spuštění a testování kódu v místním prostředí. Další informace najdete v tématu Použití emulátoru Azurite pro místní vývoj služby Azure Storage.
Vytvoření aplikace Java
Nejprve ověřte, že váš vývojový systém splňuje požadavky uvedené v klientské knihovně Azure Queue Storage verze 12 pro Javu.
Vytvoření aplikace Java s názvem queues-how-to-v12
:
V okně konzoly (například cmd, PowerShell nebo Bash) pomocí Mavenu vytvořte novou konzolovou aplikaci s názvem
queues-how-to-v12
. Zadáním následujícíhomvn
příkazu vytvořte projekt "hello world" v Javě.mvn archetype:generate \ --define interactiveMode=n \ --define groupId=com.queues.howto \ --define artifactId=queues-howto-v12 \ --define archetypeArtifactId=maven-archetype-quickstart \ --define archetypeVersion=1.4
mvn archetype:generate ` --define interactiveMode=n ` --define groupId=com.queues.howto ` --define artifactId=queues-howto-v12 ` --define archetypeArtifactId=maven-archetype-quickstart ` --define archetypeVersion=1.4
Výstup z vygenerování projektu by měl vypadat přibližně takto:
[INFO] Scanning for projects... [INFO] [INFO] ------------------< org.apache.maven:standalone-pom >------------------- [INFO] Building Maven Stub Project (No POM) 1 [INFO] --------------------------------[ pom ]--------------------------------- [INFO] [INFO] >>> maven-archetype-plugin:3.1.2:generate (default-cli) > generate-sources @ standalone-pom >>> [INFO] [INFO] <<< maven-archetype-plugin:3.1.2:generate (default-cli) < generate-sources @ standalone-pom <<< [INFO] [INFO] [INFO] --- maven-archetype-plugin:3.1.2:generate (default-cli) @ standalone-pom --- [INFO] Generating project in Batch mode [INFO] ---------------------------------------------------------------------------- [INFO] Using following parameters for creating project from Archetype: maven-archetype-quickstart:1.4 [INFO] ---------------------------------------------------------------------------- [INFO] Parameter: groupId, Value: com.queues.howto [INFO] Parameter: artifactId, Value: queues-howto-v12 [INFO] Parameter: version, Value: 1.0-SNAPSHOT [INFO] Parameter: package, Value: com.queues.howto [INFO] Parameter: packageInPathFormat, Value: com/queues/howto [INFO] Parameter: version, Value: 1.0-SNAPSHOT [INFO] Parameter: package, Value: com.queues.howto [INFO] Parameter: groupId, Value: com.queues.howto [INFO] Parameter: artifactId, Value: queues-howto-v12 [INFO] Project created from Archetype in dir: C:\queues\queues-howto-v12 [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 6.775 s [INFO] Finished at: 2020-08-17T15:27:31-07:00 [INFO] ------------------------------------------------------------------------
Přepněte do nově vytvořeného
queues-howto-v12
adresáře.cd queues-howto-v12
Instalace balíčku
Otevřete soubor v textovém pom.xml
editoru. Do skupiny závislostí přidejte následující prvek závislostí.
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-storage-queue</artifactId>
<version>12.6.0</version>
</dependency>
Konfigurace aplikace pro přístup ke službě Queue Storage
Přidejte následující příkazy importu na začátek souboru Java, kde chcete používat rozhraní API služby Azure Storage pro přístup k frontám:
// Include the following imports to use queue APIs
import com.azure.core.util.*;
import com.azure.storage.queue.*;
import com.azure.storage.queue.models.*;
Nastavení připojovacího řetězce služby Azure Storage
Klient Služby Azure Storage používá pro přístup ke službám správy dat připojovací řetězec úložiště. Získejte název a primární přístupový klíč pro váš účet úložiště uvedený v Azure Portal. Použijte je jako AccountName
hodnoty a AccountKey
v připojovacím řetězci. Tento příklad ukazuje deklaraci statického pole pro uložení připojovacího řetězce:
// Define the connection-string with your values
final String connectStr =
"DefaultEndpointsProtocol=https;" +
"AccountName=your_storage_account;" +
"AccountKey=your_storage_account_key";
Následující ukázky předpokládají, že máte String
objekt obsahující připojovací řetězec úložiště.
Postupy: Vytvoření fronty
Objekt QueueClient
obsahuje operace pro interakci s frontou. Následující kód vytvoří QueueClient
objekt. Pomocí objektu QueueClient
vytvořte frontu, kterou chcete použít.
public static String createQueue(String connectStr)
{
try
{
// Create a unique name for the queue
String queueName = "queue-" + java.util.UUID.randomUUID();
System.out.println("Creating queue: " + queueName);
// Instantiate a QueueClient which will be
// used to create and manipulate the queue
QueueClient queue = new QueueClientBuilder()
.connectionString(connectStr)
.queueName(queueName)
.buildClient();
// Create the queue
queue.create();
return queue.getQueueName();
}
catch (QueueStorageException e)
{
// Output the exception message and stack trace
System.out.println("Error code: " + e.getErrorCode() + "Message: " + e.getMessage());
return null;
}
}
Postupy: Přidání zprávy do fronty
Pokud chcete vložit zprávu do existující fronty, zavolejte metodu sendMessage
. Zpráva může být řetězec (ve formátu UTF-8) nebo pole bajtů. Tady je kód, který odešle řetězcovou zprávu do fronty.
public static void addQueueMessage
(String connectStr, String queueName, String messageText)
{
try
{
// Instantiate a QueueClient which will be
// used to create and manipulate the queue
QueueClient queueClient = new QueueClientBuilder()
.connectionString(connectStr)
.queueName(queueName)
.buildClient();
System.out.println("Adding message to the queue: " + messageText);
// Add a message to the queue
queueClient.sendMessage(messageText);
}
catch (QueueStorageException e)
{
// Output the exception message and stack trace
System.out.println(e.getMessage());
e.printStackTrace();
}
}
Postupy: Náhled na další zprávu
Můžete zobrazit zprávu před frontou, aniž byste ji z fronty odebrali voláním peekMessage
.
public static void peekQueueMessage
(String connectStr, String queueName)
{
try
{
// Instantiate a QueueClient which will be
// used to create and manipulate the queue
QueueClient queueClient = new QueueClientBuilder()
.connectionString(connectStr)
.queueName(queueName)
.buildClient();
// Peek at the first message
PeekedMessageItem peekedMessageItem = queueClient.peekMessage();
System.out.println("Peeked message: " + peekedMessageItem.getMessageText());
}
catch (QueueStorageException e)
{
// Output the exception message and stack trace
System.out.println(e.getMessage());
e.printStackTrace();
}
}
Postupy: Změna obsahu zprávy ve frontě
Podle potřeby můžete změnit obsah zprávy přímo ve frontě. Pokud zpráva představuje pracovní úkol, můžete tuto funkci použít k aktualizaci stavu. Následující kód aktualizuje zprávu fronty novým obsahem a nastaví časový limit viditelnosti tak, aby se prodloužil o dalších 30 sekund. Prodloužení časového limitu viditelnosti dává klientovi dalších 30 sekund, aby pokračoval v práci na zprávě. Můžete si také nechat počet opakování. Pokud se zpráva opakuje vícekrát než nkrát , odstraníte ji. Tento scénář chrání před zprávou, která při každém zpracování aktivuje chybu aplikace.
Následující ukázka kódu prohledá frontu zpráv, vyhledá první obsah zprávy, který odpovídá vyhledávacímu řetězci, upraví obsah zprávy a ukončí.
public static void updateQueueMessage
(String connectStr, String queueName,
String searchString, String updatedContents)
{
try
{
// Instantiate a QueueClient which will be
// used to create and manipulate the queue
QueueClient queueClient = new QueueClientBuilder()
.connectionString(connectStr)
.queueName(queueName)
.buildClient();
// The maximum number of messages to retrieve is 32
final int MAX_MESSAGES = 32;
// Iterate through the queue messages
for (QueueMessageItem message : queueClient.receiveMessages(MAX_MESSAGES))
{
// Check for a specific string
if (message.getMessageText().equals(searchString))
{
// Update the message to be visible in 30 seconds
queueClient.updateMessage(message.getMessageId(),
message.getPopReceipt(),
updatedContents,
Duration.ofSeconds(30));
System.out.println(
String.format("Found message: \'%s\' and updated it to \'%s\'",
searchString,
updatedContents)
);
break;
}
}
}
catch (QueueStorageException e)
{
// Output the exception message and stack trace
System.out.println(e.getMessage());
e.printStackTrace();
}
}
Následující ukázka kódu aktualizuje jenom první viditelnou zprávu ve frontě.
public static void updateFirstQueueMessage
(String connectStr, String queueName, String updatedContents)
{
try
{
// Instantiate a QueueClient which will be
// used to create and manipulate the queue
QueueClient queueClient = new QueueClientBuilder()
.connectionString(connectStr)
.queueName(queueName)
.buildClient();
// Get the first queue message
QueueMessageItem message = queueClient.receiveMessage();
// Check for a specific string
if (null != message)
{
// Update the message to be visible in 30 seconds
UpdateMessageResult result = queueClient.updateMessage(message.getMessageId(),
message.getPopReceipt(),
updatedContents,
Duration.ofSeconds(30));
System.out.println("Updated the first message with the receipt: " +
result.getPopReceipt());
}
}
catch (QueueStorageException e)
{
// Output the exception message and stack trace
System.out.println(e.getMessage());
e.printStackTrace();
}
}
Postupy: Získání délky fronty
Podle potřeby můžete získat odhadovaný počet zpráv ve frontě.
Metoda getProperties
vrátí několik hodnot, včetně počtu zpráv aktuálně ve frontě. Počet je pouze přibližný, protože zprávy je možné přidat nebo odebrat po vaší žádosti. Metoda getApproximateMessageCount
vrátí poslední hodnotu načtenou voláním getProperties
metody bez volání služby Queue Storage.
public static void getQueueLength(String connectStr, String queueName)
{
try
{
// Instantiate a QueueClient which will be
// used to create and manipulate the queue
QueueClient queueClient = new QueueClientBuilder()
.connectionString(connectStr)
.queueName(queueName)
.buildClient();
QueueProperties properties = queueClient.getProperties();
long messageCount = properties.getApproximateMessagesCount();
System.out.println(String.format("Queue length: %d", messageCount));
}
catch (QueueStorageException e)
{
// Output the exception message and stack trace
System.out.println(e.getMessage());
e.printStackTrace();
}
}
Postupy: Zrušení zařazení další zprávy
Kód ve dvou krocích odřadí zprávu z fronty. Když zavoláte receiveMessage
, zobrazí se další zpráva ve frontě. Zpráva vrácená z receiveMessage
se stane neviditelnou pro jakýkoli jiný kód, který čte zprávy z této fronty. Ve výchozím nastavení tato zpráva zůstává neviditelná po dobu 30 sekund. Pokud chcete dokončit odebrání zprávy z fronty, musíte také volat deleteMessage
. Pokud se vašemu kódu nepodaří zpracovat zprávu, tento dvoustupňový proces zajistí, že můžete získat stejnou zprávu a zkusit to znovu. Váš kód volá deleteMessage
hned po zpracování zprávy.
public static void dequeueMessage(String connectStr, String queueName)
{
try
{
// Instantiate a QueueClient which will be
// used to create and manipulate the queue
QueueClient queueClient = new QueueClientBuilder()
.connectionString(connectStr)
.queueName(queueName)
.buildClient();
// Get the first queue message
QueueMessageItem message = queueClient.receiveMessage();
// Check for a specific string
if (null != message)
{
System.out.println("Dequeing message: " + message.getMessageText());
// Delete the message
queueClient.deleteMessage(message.getMessageId(), message.getPopReceipt());
}
else
{
System.out.println("No visible messages in queue");
}
}
catch (QueueStorageException e)
{
// Output the exception message and stack trace
System.out.println(e.getMessage());
e.printStackTrace();
}
}
Další možnosti pro vyřazení zpráv z fronty
Existují dva způsoby, jak přizpůsobit načítání zpráv z fronty. Nejprve získejte dávku zpráv (až 32). Za druhé nastavte delší nebo kratší časový limit neviditelnosti, který kódu umožní více či méně času na úplné zpracování každé zprávy.
Následující příklad kódu používá metodu receiveMessages
k získání 20 zpráv v jednom volání. Každou zprávu pak zpracuje pomocí smyčky for
. Nastaví také časový limit neviditelnosti na pět minut (300 sekund) pro každou zprávu. Časový limit začíná u všech zpráv najednou. Když od volání receiveMessages
uplyne pět minut, všechny zprávy, které nebyly odstraněny, se znovu zobrazí.
public static void dequeueMessages(String connectStr, String queueName)
{
try
{
// Instantiate a QueueClient which will be
// used to create and manipulate the queue
QueueClient queueClient = new QueueClientBuilder()
.connectionString(connectStr)
.queueName(queueName)
.buildClient();
// The maximum number of messages to retrieve is 20
final int MAX_MESSAGES = 20;
// Retrieve 20 messages from the queue with a
// visibility timeout of 300 seconds (5 minutes)
for (QueueMessageItem message : queueClient.receiveMessages(MAX_MESSAGES,
Duration.ofSeconds(300), Duration.ofSeconds(1), new Context("key1", "value1")))
{
// Do processing for all messages in less than 5 minutes,
// deleting each message after processing.
System.out.println("Dequeing message: " + message.getMessageText());
queueClient.deleteMessage(message.getMessageId(), message.getPopReceipt());
}
}
catch (QueueStorageException e)
{
// Output the exception message and stack trace
System.out.println(e.getMessage());
e.printStackTrace();
}
}
Postupy: Výpis front
Pokud chcete získat seznam aktuálních front, zavolejte metodu QueueServiceClient.listQueues()
, která vrátí kolekci QueueItem
objektů.
public static void listQueues(String connectStr)
{
try
{
// Instantiate a QueueServiceClient which will be
// used to list the queues
QueueServiceClient queueServiceClient = new QueueServiceClientBuilder()
.connectionString(connectStr)
.buildClient();
// Loop through the collection of queues.
for (QueueItem queue : queueServiceClient.listQueues())
{
// Output each queue name.
System.out.println(queue.getName());
}
}
catch (QueueStorageException e)
{
// Output the exception message and stack trace
System.out.println(e.getMessage());
e.printStackTrace();
}
}
Postupy: Odstranění fronty
Chcete-li odstranit frontu a všechny zprávy v ní obsažené, zavolejte metodu delete
objektu QueueClient
.
public static void deleteMessageQueue(String connectStr, String queueName)
{
try
{
// Instantiate a QueueClient which will be
// used to create and manipulate the queue
QueueClient queueClient = new QueueClientBuilder()
.connectionString(connectStr)
.queueName(queueName)
.buildClient();
System.out.println("Deleting queue: " + queueClient.getQueueName());
// Delete the queue
queueClient.delete();
}
catch (QueueStorageException e)
{
// Output the exception message and stack trace
System.out.println(e.getMessage());
e.printStackTrace();
}
}
Tip
Projděte si úložiště s ukázkami kódu pro Azure Storage
Snadno použitelné a úplné ukázky kódu pro Azure Storage, které si můžete stáhnout a použít, jsou shrnuté v seznamu ukázky pro Azure Storage.
Další kroky
Teď, když jste se seznámili se základy služby Queue Storage, použijte tyto odkazy a seznamte se se složitějšími úlohami úložiště.
- Sada SDK služby Azure Storage pro Javu
- Referenční informace ke klientské sadě SDK služby Azure Storage
- Rozhraní REST API služby Azure Storage
- Blog týmu Azure Storage
Související ukázky kódu s využitím zastaralých sad Java verze 8 SDK najdete v tématu Ukázky kódu s využitím Javy verze 8.