Java'dan Kuyruk Depolama kullanma
Genel Bakış
Bu kılavuzda Azure Kuyruk depolama hizmetini kullanarak yaygın senaryolar için nasıl kod Depolama gösterebilirsiniz. Örnekler Java dilinde yazılır ve Java için Azure Depolama SDK’sı kullanır. Senaryolar arasında ekleme, göz atma, alma ve kuyruk iletilerini silme yer almaktadır. Kuyruk oluşturma ve silme kodu da ele almaktadır. Kuyruklar hakkında daha fazla bilgi için Sonraki adımlar bölümüne bakın.
Kuyruk depolama nedir?
Azure Kuyruk depolama, HTTP veya HTTPS kullanan kimlik doğrulaması yapılmış çağrılar aracılığıyla dünyanın her yerinden erişilebilen çok sayıda iletinin depolanması için bir hizmettir. Tek bir kuyruk iletisinin boyutu 64 KB’ye kadar olabilir ve bir kuyrukta, depolama hesabının toplam kapasite sınırına kadar milyonlarca ileti bulunabilir. Kuyruk depolama genellikle zaman uyumsuz olarak işlenecek iş biriktirme listesi oluşturmak için kullanılır.
Kuyruk hizmeti kavramlar
Azure Kuyruk hizmeti aşağıdaki bileşenleri içerir:

Depolama hesabı: Tüm Azure depolama erişimi bir depolama hesabı üzerinden yapılır. Depolama hesapları hakkında daha fazla bilgi için bkz. depolama hesabına genel bakış.
Kuyruk: Kuyrukta bir dizi ileti vardır. Tüm iletiler bir kuyrukta olmalıdır. Kuyruk adının tamamen küçük harfli olması gerektiğini unutmayın. Kuyrukların adlandırılması hakkında daha fazla bilgi için bkz. Kuyrukları ve Meta Verileri Adlandırma.
İleti: İleti, biçimi ne olursa olsun en çok 64 KB büyüklüktedir. Bir iletinin kuyrukta kalabileceği en uzun süre 7 gündür. Sürüm 2017-07-29 veya üzeri için, en fazla yaşam süresi herhangi bir pozitif sayı veya iletinin süresinin dolmadığını belirten-1 olabilir. Bu parametre atlanırsa, varsayılan yaşam süresi yedi gündür.
URL biçimi: Kuyruklar şu URL biçimi kullanılarak adreslenebilir: http://
<storage account>. Queue.Core.Windows.net/<queue>Aşağıdaki URL diyagramdaki bir kuyruğun adresini belirtir:
http://myaccount.queue.core.windows.net/incoming-orders
Azure depolama hesabı oluşturma
İlk Azure depolama hesabınızı oluşturmanın en kolay yolu Azure Portalı’nı kullanmaktır. Daha fazla bilgi için bkz. Depolama hesabı oluşturma.
Azure PowerShell, Azure CLI veya .NET için Azure Depolama Kaynak Sağlayıcısı’nı da kullanarak Azure depolama hesabı oluşturabilirsiniz.
Şu anda Azure 'da bir depolama hesabı oluşturmayı tercih ediyorsanız, kodunuzu yerel bir ortamda çalıştırmak ve test etmek için Azurite depolama öykünücüsünü da kullanabilirsiniz. Daha fazla bilgi için bkz. Yerel Azure depolama geliştirmesi Için Azurite öykünücüsünü kullanma.
Java uygulaması oluşturma
İlk olarak, geliştirme sisteminizin Java için istemci kitaplığı v12 için Azure Kuyruğu'Depolama önkoşulları karşılar.
adlı bir Java uygulaması oluşturmak queues-how-to-v12 için:
Konsol penceresinde (cmd, PowerShell veya Bash gibi) Maven kullanarak adıyla yeni bir konsol uygulaması
queues-how-to-v12oluşturun. Birmvn"hello world" Java projesi oluşturmak için aşağıdaki komutu yazın.mvn archetype:generate \ --define interactiveMode=n \ --define groupId=com.queues.howto \ --define artifactId=queues-howto-v12 \ --define archetypeArtifactId=maven-archetype-quickstart \ --define archetypeVersion=1.4mvn archetype:generate ` --define interactiveMode=n ` --define groupId=com.queues.howto ` --define artifactId=queues-howto-v12 ` --define archetypeArtifactId=maven-archetype-quickstart ` --define archetypeVersion=1.4Projeyi oluşturmanın çıktısı aşağıdakine benzer şekilde çalışmalı:
[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] ------------------------------------------------------------------------Yeni oluşturulan dizine
queues-howto-v12geçiş.cd queues-howto-v12
Paketi yükleme
Dosyayı pom.xml metin düzenleyicide açın. Aşağıdaki bağımlılık öğesini bağımlılıklar grubuna ekleyin.
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-storage-queue</artifactId>
<version>12.6.0</version>
</dependency>
Kuyruk ayarlarına erişmek için Depolama
Kuyruklara erişmek için Azure Depolama API'lerini kullanmak istediğiniz Java dosyasının en üstüne aşağıdaki içeri aktarma deyimlerini ekleyin:
// Include the following imports to use queue APIs
import com.azure.core.util.*;
import com.azure.storage.queue.*;
import com.azure.storage.queue.models.*;
Azure Depolama bağlantı dizesini ayarlama
Azure Depolama istemcisi, veri yönetimi hizmetlerine erişmek için bir depolama bağlantı dizesi kullanır. depolama hesabınız için ad ve birincil erişim anahtarını Azure portal. Bunları bağlantı AccountName dizesinde AccountKey ve değerleri olarak kullanın. Bu örnekte bağlantı dizesini tutmak için nasıl statik bir alan bildirebileceğiniz gösterilmektedir:
// Define the connection-string with your values
final String connectStr =
"DefaultEndpointsProtocol=https;" +
"AccountName=your_storage_account;" +
"AccountKey=your_storage_account_key";
Aşağıdaki örnekler, depolama bağlantı dizesini String içeren bir nesneye sahip olduğunu varsaymanızı sağlar.
Nasıl kullanılır: Kuyruk oluşturma
Nesnesi, QueueClient bir kuyrukla etkileşime yönelik işlemleri içerir. Aşağıdaki kod bir nesnesi QueueClient oluşturur. Kullanmak QueueClient istediğiniz kuyruğu oluşturmak için nesnesini kullanın.
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;
}
}
Nasıl kullanılır: Kuyruğa ileti ekleme
Var olan bir kuyruğa ileti eklemek için yöntemini sendMessage çağırabilirsiniz. İleti bir dize (UTF-8 biçiminde) veya bir byte dizisi olabilir. Kuyruğa dize iletisi gönderen kod şu şekildedir.
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();
}
}
Nasıl iletiyi: Sonraki iletiye göz atın
çağırarak kuyruktan kaldırmadan kuyruğun önündeki iletiye göz peekMessage atabilirsiniz.
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();
}
}
Nasıl kullanılır: Kuyruğa alınan iletinin içeriğini değiştirme
Kuyrukta yer alan bir iletinin içeriğini değiştirebilirsiniz. İleti bir iş görevini temsil ediyorsa, durumu güncelleştirmek için bu özelliği kullanabilirsiniz. Aşağıdaki kod, bir kuyruk iletisini yeni içeriklerle birlikte günceller ve görünürlük zaman aşımını 30 saniye daha uzatacak şekilde ayarlar. Görünürlük zaman aşımını genişletmek istemciye ileti üzerinde çalışmaya devam etmek için 30 saniye daha verir. Yeniden deneme sayısını da tutarak devam etmek de mümkün olabilir. İleti n'den fazla kez yeniden denense silebilirsiniz. Bu senaryo, her işlendiğinde uygulama hatasını tetikleyen bir iletiye karşı koruma sağlar.
Aşağıdaki kod örneği ileti kuyruğunda arama yapmakta, bir arama dizesiyle eşleşen ilk ileti içeriğini bulmakta, ileti içeriğini değiştiren ve çıkışta yer almaktadır.
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();
}
}
Aşağıdaki kod örneği, kuyrukta yalnızca ilk görünür iletiyi güncelleştirmeye devam eder.
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();
}
}
Nasıl kullanılır: Kuyruk uzunluğunu al
Bir kuyruktaki ileti sayısı ile ilgili bir tahmin alabilirsiniz.
yöntemi, getProperties kuyrukta bulunan ileti sayısı da dahil olmak üzere birkaç değer döndürür. İstekten sonra iletiler eklenene veya kaldırılaya kadar bu sayı yaklaşıkdır. yöntemi, getApproximateMessageCount Kuyruk Çağrısı çağrılmadan çağrısı tarafından getProperties alınan son değeri Depolama.
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();
}
}
Nasıl iletiyi açıklama: Sonraki iletiyi açıklama
Kodunuz iki adımda kuyruktan bir iletiyi kuyruğa alır. receiveMessageçağrısında, kuyrukta bir sonraki iletiyi alırsınız. 'den döndürülen receiveMessage ileti, bu kuyruktan iletileri okuyan diğer kodlar için görünmez hale gelir. Varsayılan olarak bu ileti 30 saniye görünmez kalır. İletiyi kuyruktan kaldırmayı tamamlamak için ayrıca çağrısı da deleteMessage gerekir. Kodunuz bir iletiyi işleyemezse, bu iki adımlı işlem aynı iletiyi alalıp yeniden denemenizi sağlar. Kodunuz, deleteMessage ileti işlendikten hemen sonra çağrır.
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();
}
}
İletileriqueuyma için ek seçenekler
Kuyruktan ileti alımını özelleştirmenin iki yolu vardır. İlk olarak, toplu ileti (en fazla 32) alır. İkincisi, kodunuzun her iletiyi tamamen işlemesi için daha fazla veya daha az zaman sağlayarak daha uzun veya daha kısa bir görünmezlik zaman aşımı ayarlayın.
Aşağıdaki kod örneği, bir receiveMessages çağrıda 20 ileti almak için yöntemini kullanır. Ardından döngü kullanarak her iletiyi for işler. Ayrıca her ileti için görünmezlik zaman aşımını beş dakika (300 saniye) olarak ayarlar. Zaman aşımı tüm iletiler için aynı anda başlar. çağrısından bu yana beş dakika receiveMessages geçilen, silinmemiş tüm iletiler yeniden görünür hale gelir.
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();
}
}
Nasıl kullanılır: Kuyrukları listele
Geçerli kuyrukların listesini almak için, bir QueueServiceClient.listQueues() nesne koleksiyonu döndürür yöntemini QueueItem çağırabilirsiniz.
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();
}
}
Nasıl kullanılır: Kuyruk silme
Bir kuyruğu ve içinde yer alan tüm iletileri silmek için delete nesnesinde yöntemini QueueClient çağırmanız gerekir.
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();
}
}
İpucu
Azure Depolama kod örnekleri havuzuna göz atın
İndirip çalıştırabileceğiniz kullanımı kolay uçtan uca Azure Depolama kod örnekleri lütfen Azure Depolama Örnekleri listemize bakın.
Sonraki adımlar
Kuyruk oluşturma ile ilgili temel bilgileri Depolama, daha karmaşık depolama görevleri hakkında bilgi edinmek için bu bağlantıları izleyin.