A Queue Storage használata C++-szal

Tipp

Próbálja ki a Microsoft Azure Storage Explorert

A Microsoft Azure Storage Explorer egy ingyenes, önálló alkalmazás, amelynek segítségével vizuálisan dolgozhat Azure Storage-adatokkal Windows, macOS és Linux rendszereken.

Áttekintés

Ez az útmutató bemutatja, hogyan hajthat végre gyakori forgatókönyveket az Azure Queue Storage szolgáltatással. A minták C++ nyelven vannak megírva, és az Azure Storage C++ ügyfélkódtárát használják. A tárgyalt forgatókönyvek közé tartozik az üzenetsor-üzenetek beszúrása, betekintése, lekérése és törlése , valamint az üzenetsorok létrehozása és törlése.

Megjegyzés

Ez az útmutató az Azure Storage C++ 1.0.0-s vagy újabb verzióhoz készült ügyfélkódtárát célozza meg. Az ajánlott verzió az Azure Storage 2.2.0-s verziójú ügyfélkódtára, amely a NuGeten vagy a GitHubon keresztül érhető el.

Mi az a Queue Storage?

Az Azure Queue Storage szolgáltatás üzenetek nagy számban történő tárolására szolgál, amelyek HTTP- vagy HTTPS-kapcsolattal, hitelesített hívásokon keresztül a világon bárhonnan elérhetők. Egyetlen üzenetsor akár 64 KB méretű is lehet, és a tárfiók maximális kapacitásán belül több millió üzenetet tartalmazhat. A Queue Storage-ot gyakran használják a feladatok hátralékának létrehozására az aszinkron feldolgozáshoz.

Üzenetsor-szolgáltatással kapcsolatos fogalmak

Az Azure Queue szolgáltatás a következő összetevőket tartalmazza:

Az Azure Queue szolgáltatás összetevői

  • Tárfiók: Az Azure Storage-hoz való hozzáférés egy tárfiókon keresztül történik. További információ a tárfiókokról: Tárfiókok áttekintése.

  • Üzenetsor: Az üzenetsorok üzenetek készleteit tartalmazzák. Az összes üzenetnek üzenetsorban kell lennie. Vegye figyelembe, hogy az üzenetsor neve csak kisbetűket tartalmazhat. Az üzenetsorok elnevezésével kapcsolatos információkat lásd: Naming Queues and Metadata (Üzenetsorok és metaadatok elnevezése).

  • Üzenet: Egy legfeljebb 64 KB méretű, tetszőleges méretű üzenet. Egy üzenet legfeljebb 7 napig maradhat egy üzenetsorban. A 2017-07-29-es vagy újabb verzió esetén a maximális élettartam bármilyen pozitív szám lehet, vagy -1, amely azt jelzi, hogy az üzenet nem jár le. Ha ezt a paramétert nem adja meg, az alapértelmezett élettartam hét nap.

  • URL-formátum: Az üzenetsorok a következő URL-formátumban címezhetők: http://<storage account>.queue.core.windows.net/<queue>

    Az ábra egyik üzenetsora a következő URL-címmel érhető el:

    http://myaccount.queue.core.windows.net/incoming-orders

Azure-tárfiók létrehozása

Az első Azure Storage-fiók létrehozásának legegyszerűbb módja az Azure Portal használata. További tudnivalókért lásd: Create a storage account (Tárfiók létrehozása).

Ezenkívül az Azure PowerShell, az Azure CLI, illetve a .NET-keretrendszerhez készült Azure Storage erőforrás-szolgáltató használatával is létrehozhat egy Azure-tárfiókot.

Ha jelenleg nem szeretne tárfiókot létrehozni az Azure-ban, az Azurite Storage Emulator használatával helyi környezetben is futtathatja és tesztelheti a kódot. További információ: Az Azurite emulátor használata helyi Azure Storage-fejlesztéshez.

C++-alkalmazás létrehozása

Ebben az útmutatóban olyan tárolási funkciókat fog használni, amelyek egy C++ alkalmazáson belül futtathatók.

Ehhez telepítenie kell az Azure Storage C++ ügyfélkódtárát, és létre kell hoznia egy Azure Storage-fiókot az Azure-előfizetésében.

A C++-hoz készült Azure Storage-ügyfélkódtár telepítéséhez az alábbi módszereket használhatja:

.\vcpkg.exe install azure-storage-cpp

A README fájlban talál egy útmutatót a forráskód létrehozásához és a NuGetbe való exportáláshoz.

Az alkalmazás konfigurálása a Queue Storage eléréséhez

Adja hozzá a következő belefoglalási utasításokat a C++ fájl elejéhez, ahol az Azure Storage API-kat szeretné használni az üzenetsorok eléréséhez:

#include <was/storage_account.h>
#include <was/queue.h>

Azure Storage kapcsolati sztring beállítása

Az Azure Storage-ügyfelek tárolási kapcsolati sztring használnak végpontok és hitelesítő adatok tárolására az adatkezelési szolgáltatások eléréséhez. Ügyfélalkalmazásban való futtatáskor a következő formátumban kell megadnia a tárolási kapcsolati sztring a tárfiók neve és a tárfiók tárelérési kulcsa használatával, amely a és AccountKey az értékek Azure PortalAccountName szerepel. További információ a tárfiókokról és a hozzáférési kulcsokról: Tudnivalók az Azure Storage-fiókokról. Ez a példa bemutatja, hogyan deklarálhat statikus mezőt a kapcsolati sztring tárolására:

// Define the connection-string with your values.
const utility::string_t storage_connection_string(U("DefaultEndpointsProtocol=https;AccountName=your_storage_account;AccountKey=your_storage_account_key"));

Az alkalmazás helyi Windows-számítógépen való teszteléséhez használhatja az Azurite storage emulátort. Az Azurite egy segédprogram, amely szimulálja a Azure Blob Storage és a Queue Storage-ot a helyi fejlesztői gépen. A következő példa bemutatja, hogyan deklarálhat statikus mezőt a helyi Storage Emulatorhoz használható kapcsolati sztring tárolására:

// Define the connection-string with Azurite.
const utility::string_t storage_connection_string(U("UseDevelopmentStorage=true;"));  

Az Azurite elindításához lásd : Az Azurite emulátor használata helyi Azure Storage-fejlesztéshez.

Az alábbi minták azt feltételezik, hogy az ezen két módszer egyikével kérte le a Storage kapcsolati sztringjét.

A kapcsolati sztring lekérése

A osztály használatával cloud_storage_account képviselheti a tárfiók adatait. A tárfiók adatainak a tárolási kapcsolati sztring való lekéréséhez használhatja a metódustparse.

// Retrieve storage account from connection string.
azure::storage::cloud_storage_account storage_account = azure::storage::cloud_storage_account::parse(storage_connection_string);

Útmutató: Üzenetsor létrehozása

Egy cloud_queue_client objektum lehetővé teszi az üzenetsorok referenciaobjektumainak lekérését. Az alábbi kód létrehoz egy objektumot cloud_queue_client .

// Retrieve storage account from connection string.
azure::storage::cloud_storage_account storage_account = azure::storage::cloud_storage_account::parse(storage_connection_string);

// Create a queue client.
azure::storage::cloud_queue_client queue_client = storage_account.create_cloud_queue_client();

cloud_queue_client Az objektum használatával lekérheti a használni kívánt üzenetsorra mutató hivatkozást. Ha nem létezik, létrehozhatja az üzenetsort.

// Retrieve a reference to a queue.
azure::storage::cloud_queue queue = queue_client.get_queue_reference(U("my-sample-queue"));

// Create the queue if it doesn't already exist.
queue.create_if_not_exists();  

Útmutató: Üzenet beszúrása üzenetsorba

Ha üzenetet szeretne beszúrni egy meglévő üzenetsorba, először hozzon létre egy újat cloud_queue_message. Ezután hívja meg a metódust add_message . Egy cloud_queue_message sztringből (UTF-8 formátumban) vagy bájttömbből hozható létre. Íme egy kód, amely létrehoz egy üzenetsort (ha nem létezik), és beszúrja az üzenetet Hello, World:

// Retrieve storage account from connection-string.
azure::storage::cloud_storage_account storage_account = azure::storage::cloud_storage_account::parse(storage_connection_string);

// Create the queue client.
azure::storage::cloud_queue_client queue_client = storage_account.create_cloud_queue_client();

// Retrieve a reference to a queue.
azure::storage::cloud_queue queue = queue_client.get_queue_reference(U("my-sample-queue"));

// Create the queue if it doesn't already exist.
queue.create_if_not_exists();

// Create a message and add it to the queue.
azure::storage::cloud_queue_message message1(U("Hello, World"));
queue.add_message(message1);  

Útmutató: Betekintés a következő üzenetbe

A metódus meghívásával betekinthet az üzenetsor elejére anélkül, hogy eltávolítaná azt az peek_message üzenetsorból.

// Retrieve storage account from connection-string.
azure::storage::cloud_storage_account storage_account = azure::storage::cloud_storage_account::parse(storage_connection_string);

// Create the queue client.
azure::storage::cloud_queue_client queue_client = storage_account.create_cloud_queue_client();

// Retrieve a reference to a queue.
azure::storage::cloud_queue queue = queue_client.get_queue_reference(U("my-sample-queue"));

// Peek at the next message.
azure::storage::cloud_queue_message peeked_message = queue.peek_message();

// Output the message content.
std::wcout << U("Peeked message content: ") << peeked_message.content_as_string() << std::endl;

Útmutató: Üzenetsorba helyezett üzenet tartalmának módosítása

Egy üzenetet tartalmát helyben, az üzenetsorban módosíthatja. Ha az üzenet munkafeladatot jelöl, ezzel a funkcióval frissítheti a munkafeladat állapotát. Az alábbi kód frissíti az üzenetsorban található üzenetet az új tartalommal, és a láthatósági időkorlátot további 60 másodperccel bővíti. Elmenti az üzenethez társított feladat állapotát, és az ügyfél számára további egy percet biztosít az üzenet használatának folytatására. Ezzel a technikával nyomon követheti a többlépéses munkafolyamatokat az üzenetsor-üzeneteken anélkül, hogy elölről kellene kezdenie, ha egy feldolgozási lépés hardver- vagy szoftverhiba miatt meghiúsul. A rendszer általában nyilván tartja az újrapróbálkozások számát, és ha az üzenettel n alkalomnál többször próbálkoznak, akkor törlődik. Ez védelmet biztosít az ellen, hogy egy üzenetet minden feldolgozásakor kiváltson egy alkalmazáshibát.

// Retrieve storage account from connection-string.
azure::storage::cloud_storage_account storage_account = azure::storage::cloud_storage_account::parse(storage_connection_string);

// Create the queue client.
azure::storage::cloud_queue_client queue_client = storage_account.create_cloud_queue_client();

// Retrieve a reference to a queue.
azure::storage::cloud_queue queue = queue_client.get_queue_reference(U("my-sample-queue"));

// Get the message from the queue and update the message contents.
// The visibility timeout "0" means make it visible immediately.
// The visibility timeout "60" means the client can get another minute to continue
// working on the message.
azure::storage::cloud_queue_message changed_message = queue.get_message();

changed_message.set_content(U("Changed message"));
queue.update_message(changed_message, std::chrono::seconds(60), true);

// Output the message content.
std::wcout << U("Changed message content: ") << changed_message.content_as_string() << std::endl;  

Útmutató: A következő üzenet törlése

A kód két lépésben töröl egy üzenetet egy üzenetsorból. A hívásakor get_messagea következő üzenet egy üzenetsorba kerül. A visszaadott get_message üzenetek láthatatlanná válnak az üzenetsorból érkező üzeneteket olvasó többi kód számára. Az üzenet üzenetsorból való eltávolításának befejezéséhez meg kell hívnia a következőt delete_messageis: . Az üzenetek kétlépéses eltávolítása lehetővé teszi, hogy ha a kód hardver- vagy szoftverhiba miatt nem tud feldolgozni egy üzenetet, a kód egy másik példánya megkaphassa ugyanazt az üzenetet, és újra megpróbálkozhasson a feldolgozásával. A kód közvetlenül az üzenet feldolgozása után hív delete_message .

// Retrieve storage account from connection-string.
azure::storage::cloud_storage_account storage_account = azure::storage::cloud_storage_account::parse(storage_connection_string);

// Create the queue client.
azure::storage::cloud_queue_client queue_client = storage_account.create_cloud_queue_client();

// Retrieve a reference to a queue.
azure::storage::cloud_queue queue = queue_client.get_queue_reference(U("my-sample-queue"));

// Get the next message.
azure::storage::cloud_queue_message dequeued_message = queue.get_message();
std::wcout << U("Dequeued message: ") << dequeued_message.content_as_string() << std::endl;

// Delete the message.
queue.delete_message(dequeued_message);

Útmutató: További lehetőségek használata az üzenetek törléséhez

Két módon szabhatja testre az üzenetek lekérését egy üzenetsorból. Az első lehetőség az üzenetkötegek (legfeljebb 32) lekérése. A második lehetőség az, hogy beállít egy hosszabb vagy rövidebb láthatatlansági időkorlátot, így a kódnak lehetősége van hosszabb vagy rövidebb idő alatt teljesen feldolgozni az egyes üzeneteket. Az alábbi példakód a get_messages metódust használja 20 üzenet lekérésére egy hívásban. Ezután az egyes üzeneteket egy for hurok használatával dolgozza fel. Mindemellett a láthatatlansági időkorlátot minden üzenethez öt percre állítja be. Vegye figyelembe, hogy az öt perc az összes üzenetnél egy időben kezdődik, így a hívás get_messagesóta eltelt öt perc elteltével a nem törölt üzenetek ismét láthatóvá válnak.

// Retrieve storage account from connection-string.
azure::storage::cloud_storage_account storage_account = azure::storage::cloud_storage_account::parse(storage_connection_string);

// Create the queue client.
azure::storage::cloud_queue_client queue_client = storage_account.create_cloud_queue_client();

// Retrieve a reference to a queue.
azure::storage::cloud_queue queue = queue_client.get_queue_reference(U("my-sample-queue"));

// Dequeue some queue messages (maximum 32 at a time) and set their visibility timeout to
// 5 minutes (300 seconds).
azure::storage::queue_request_options options;
azure::storage::operation_context context;

// Retrieve 20 messages from the queue with a visibility timeout of 300 seconds.
std::vector<azure::storage::cloud_queue_message> messages = queue.get_messages(20, std::chrono::seconds(300), options, context);

for (auto it = messages.cbegin(); it != messages.cend(); ++it)
{
    // Display the contents of the message.
    std::wcout << U("Get: ") << it->content_as_string() << std::endl;
}

Útmutató: Az üzenetsor hosszának lekérése

Megbecsülheti egy üzenetsorban található üzenetek számát. A download_attributes metódus üzenetsor-tulajdonságokat ad vissza, beleértve az üzenetszámot is. A approximate_message_count metódus lekéri az üzenetsorban lévő üzenetek hozzávetőleges számát.

// Retrieve storage account from connection-string.
azure::storage::cloud_storage_account storage_account = azure::storage::cloud_storage_account::parse(storage_connection_string);

// Create the queue client.
azure::storage::cloud_queue_client queue_client = storage_account.create_cloud_queue_client();

// Retrieve a reference to a queue.
azure::storage::cloud_queue queue = queue_client.get_queue_reference(U("my-sample-queue"));

// Fetch the queue attributes.
queue.download_attributes();

// Retrieve the cached approximate message count.
int cachedMessageCount = queue.approximate_message_count();

// Display number of messages.
std::wcout << U("Number of messages in queue: ") << cachedMessageCount << std::endl;  

Útmutató: Üzenetsor törlése

Ha törölni szeretne egy üzenetsort és az abban található összes üzenetet, hívja meg a metódust delete_queue_if_exists az üzenetsor-objektumon.

// Retrieve storage account from connection-string.
azure::storage::cloud_storage_account storage_account = azure::storage::cloud_storage_account::parse(storage_connection_string);

// Create the queue client.
azure::storage::cloud_queue_client queue_client = storage_account.create_cloud_queue_client();

// Retrieve a reference to a queue.
azure::storage::cloud_queue queue = queue_client.get_queue_reference(U("my-sample-queue"));

// If the queue exists and delete it.
queue.delete_queue_if_exists();  

Következő lépések

Most, hogy megismerte a Queue Storage alapjait, kövesse ezeket a hivatkozásokat, hogy többet tudjon meg az Azure Storage-ról.