Java'dan Kuyruk Depolama'yı kullanma
Genel Bakış
Bu kılavuzda, Azure Kuyruk Depolama hizmetini kullanarak yaygın senaryolar için kod oluşturma adımları gösterilir. Örnekler Java dilinde yazılır ve Java için Azure Depolama SDK’sı kullanır. Senaryolar kuyruk iletilerini ekleme, gözatma, alma ve silmeyi içerir. Kuyruk oluşturma ve silme kodu da ele alınmıştı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şlenmek üzere bir iş kapsamı oluşturmak için kullanılır.
Kuyruk hizmeti kavramları
Azure Kuyruk hizmeti aşağıdaki bileşenleri içerir:
Depolama Hesabı: Azure Depolama'ya tüm erişim bir depolama hesabı üzerinden gerçekleştirilir. 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 yaşam süresi üst sınırı 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 depolama hesabı oluşturmamayı tercih ediyorsanız, kodunuzu yerel bir ortamda çalıştırmak ve test etmek için Azurite depolama öykünücüsü de kullanabilirsiniz. Daha fazla bilgi için bkz. Yerel Azure Depolama geliştirmesi için Azurite öykünücüsü kullanma.
Java uygulaması oluşturma
İlk olarak, geliştirme sisteminizin Java için Azure Kuyruk Depolama istemci kitaplığı v12'de listelenen önkoşulları karşıladığını doğrulayın.
adlı queues-how-to-v12
bir Java uygulaması oluşturmak için:
Konsol penceresinde (cmd, PowerShell veya Bash gibi) Maven kullanarak adıyla
queues-how-to-v12
yeni bir konsol uygulaması oluşturun. Bir "hello world" Java projesi oluşturmak için aşağıdakimvn
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.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
Projeyi oluşturma çıktısı şuna benzer olmalıdır:
[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
queues-howto-v12
dizine geçin.cd queues-howto-v12
Paketi yükleme
pom.xml
Dosyayı metin düzenleyicinizde açın. Aşağıdaki bağımlılık öğesini bağımlılık grubuna ekleyin.
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-storage-queue</artifactId>
<version>12.6.0</version>
</dependency>
Uygulamanızı Kuyruk Depolama'ya erişecek şekilde yapılandırma
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.
Azure portal listelenen depolama hesabınızın adını ve birincil erişim anahtarını alın. Bunları bağlantı dizesinde ve AccountKey
değerleri olarak AccountName
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 örneklerde depolama bağlantı dizesini içeren bir String
nesneniz olduğu varsayılır.
Nasıl yapılır: Kuyruk oluşturma
Nesnesi QueueClient
, bir kuyrukla etkileşime yönelik işlemleri içerir. Aşağıdaki kod bir QueueClient
nesnesi oluşturur.
QueueClient
Kullanmak 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 yapılır: Kuyruğa ileti ekleme
Mevcut kuyruğa ileti eklemek için yöntemini çağırın sendMessage
. İleti bir dize (UTF-8 biçiminde) veya bayt dizisi olabilir. Kuyruğa bir dize iletisi gönderen kod aşağıdadır.
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 yapılır: Sonraki iletiye göz atma
çağrısı peekMessage
yaparak kuyruktan kaldırmadan kuyruğun önündeki iletiye göz 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 yapı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 güncelleştirir 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ın genişletilmesi, istemciye ileti üzerinde çalışmaya devam etmesi için 30 saniye daha verir. Yeniden deneme sayısını da tutabilirsiniz. İleti n kereden fazla yeniden denenirse, iletiyi silersiniz. 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 yapar, arama dizesiyle eşleşen ilk ileti içeriğini bulur, ileti içeriğini değiştirir ve çıkar.
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, kuyruktaki yalnızca ilk görünür iletiyi güncelleştirir.
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 yapılır: Kuyruk uzunluğunu alma
Bir kuyruktaki ileti sayısı ile ilgili bir tahmin alabilirsiniz.
yöntemi, getProperties
kuyruktaki iletilerin sayısı da dahil olmak üzere çeşitli değerler döndürür. İletiler isteğinizden sonra eklenebileceği veya kaldırılabildiği için sayı yalnızca yaklaşıktır. yöntemi, getApproximateMessageCount
Kuyruk Depolama çağırmadan çağrısı getProperties
tarafından alınan son değeri döndürür.
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 yapılır: Sonraki iletiyi sıralama
Kodunuz iki adımda kuyruktaki bir iletiyi kuyruğa alır. çağrısı receiveMessage
yaptığınızda kuyruktaki bir sonraki iletiyi alırsınız. tarafından receiveMessage
döndürülen bir ileti, bu kuyruktan gelen 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 öğesini de çağırmanız deleteMessage
gerekir. Kodunuz bir iletiyi işleyemezse, bu iki adımlı işlem aynı iletiyi alıp yeniden denemenizi sağlar. İleti işlendikten hemen sonra kodunuz çağrılar deleteMessage
.
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();
}
}
İletileri sıralamak için ek seçenekler
Kuyruktan ileti almayı özelleştirmenin iki yolu vardır. İlk olarak, bir grup ileti alın (en fazla 32). İkincisi, kodunuzun her iletiyi tam olarak işlemesine daha fazla veya daha az zaman tanıyarak daha uzun veya daha kısa bir görünmezlik zaman aşımı ayarlayın.
Aşağıdaki kod örneği, bir çağrıda receiveMessages
20 ileti almak için yöntemini kullanır. Ardından her iletiyi bir for
döngü kullanarak işler. Ayrıca her ileti için görünmezlik zaman aşımını beş dakika (300 saniye) olarak ayarlar. Tüm iletiler için zaman aşımı aynı anda başlar. çağrısından receiveMessages
bu yana beş dakika geçtikten sonra silinmeyen 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 yapılır: Kuyrukları listeleme
Geçerli kuyrukların listesini almak için nesnesinin koleksiyonunu döndürecek olan yöntemini çağırın QueueServiceClient.listQueues()
QueueItem
.
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 yapılır: Kuyruk silme
Bir kuyruğu ve içindeki tüm iletileri silmek için nesnesinde delete
yöntemini çağırın 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();
}
}
İ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 Depolama'nın temellerini öğrendiğinize göre, daha karmaşık depolama görevleri hakkında bilgi edinmek için bu bağlantıları izleyin.
- Java için Azure Depolama SDK'sı
- Azure Depolama istemci SDK'sı başvurusu
- Azure Depolama hizmetleri REST API'si
- Azure Depolama ekibi blogu
Kullanım dışı bırakılan Java sürüm 8 SDK'larını kullanan ilgili kod örnekleri için bkz. Java sürüm 8'i kullanan kod örnekleri.