Hromadný export a import registrací služby Azure Notification Hubs
Existují scénáře, ve kterých je potřeba vytvořit nebo upravit velký počet registrací v centru oznámení. Některé z těchto scénářů jsou aktualizace značek po dávkových výpočtech nebo migrace existující implementace nabízených oznámení tak, aby používala Azure Notification Hubs.
Tento článek vysvětluje, jak v centru oznámení provádět velký počet operací nebo hromadně exportovat všechny registrace.
POZNÁMKA: Hromadný import/export je k dispozici pouze pro cenovou úroveň Standard.
Tok na vysoké úrovni
Podpora služby Batch je navržená tak, aby podporovala dlouhotrvající úlohy zahrnující miliony registrací. K dosažení tohoto škálování používá podpora služby Batch k ukládání podrobností a výstupu úlohy službu Azure Storage. Pro operace hromadné aktualizace musí uživatel vytvořit soubor v kontejneru objektů blob, jehož obsahem je seznam operací aktualizace registrace. Při spuštění úlohy uživatel poskytne adresu URL vstupního objektu blob spolu s adresou URL výstupního adresáře (také v kontejneru objektů blob). Po spuštění úlohy může uživatel zkontrolovat stav dotazem na umístění adresy URL zadané při spuštění úlohy. Konkrétní úloha může provádět pouze operace určitého druhu (vytvoření, aktualizace nebo odstranění). Operace exportu se provádějí analogicky.
Import
Nastavení
V této části se předpokládá, že máte následující entity:
- Zřízené centrum oznámení.
- Kontejner objektů blob služby Azure Storage.
- Odkazy na balíček NuGet služby Azure Storage a balíček NuGet notification Hubs.
Vytvoření vstupního souboru a jeho uložení do objektu blob
Vstupní soubor obsahuje seznam registrací serializovaných v XML, jeden na řádek. Následující příklad kódu pomocí sady Azure SDK ukazuje, jak serializovat registrace a nahrát je do kontejneru objektů blob:
private static async Task SerializeToBlobAsync(BlobContainerClient container, RegistrationDescription[] descriptions)
{
StringBuilder builder = new StringBuilder();
foreach (var registrationDescription in descriptions)
{
builder.AppendLine(registrationDescription.Serialize());
}
var inputBlob = container.GetBlobClient(INPUT_FILE_NAME);
using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(builder.ToString())))
{
await inputBlob.UploadAsync(stream);
}
}
Důležité
Předchozí kód serializuje registrace v paměti a pak nahraje celý datový proud do objektu blob. Pokud jste nahráli soubor o více než několika megabajtech, přečtěte si pokyny k těmto krokům v tématu Azure Blob. například objekty blob bloku.
Vytváření tokenů adres URL
Po nahrání vstupního souboru vygenerujte adresy URL, které budou centru oznámení poskytovat vstupní soubor i výstupní adresář. Pro vstup a výstup můžete použít dva různé kontejnery objektů blob.
static Uri GetOutputDirectoryUrl(BlobContainerClient container)
{
Console.WriteLine(container.CanGenerateSasUri);
BlobSasBuilder builder = new BlobSasBuilder(BlobSasPermissions.All, DateTime.UtcNow.AddDays(1));
return container.GenerateSasUri(builder);
}
static Uri GetInputFileUrl(BlobContainerClient container, string filePath)
{
Console.WriteLine(container.CanGenerateSasUri);
BlobSasBuilder builder = new BlobSasBuilder(BlobSasPermissions.Read, DateTime.UtcNow.AddDays(1));
return container.GenerateSasUri(builder);
}
Odeslání úlohy
Pomocí dvou vstupních a výstupních adres URL teď můžete spustit dávkovou úlohu.
NotificationHubClient client = NotificationHubClient.CreateClientFromConnectionString(CONNECTION_STRING, HUB_NAME);
var job = await client.SubmitNotificationHubJobAsync(
new NotificationHubJob {
JobType = NotificationHubJobType.ImportCreateRegistrations,
OutputContainerUri = outputContainerSasUri,
ImportFileUri = inputFileSasUri
}
);
long i = 10;
while (i > 0 && job.Status != NotificationHubJobStatus.Completed)
{
job = await client.GetNotificationHubJobAsync(job.JobId);
await Task.Delay(1000);
i--;
}
Kromě vstupních a výstupních adres URL tento příklad vytvoří NotificationHubJob
objekt, který obsahuje JobType
objekt, což může být jeden z následujících typů:
ImportCreateRegistrations
ImportUpdateRegistrations
ImportDeleteRegistrations
Po dokončení volání pokračuje úloha centrem oznámení a její stav můžete zkontrolovat voláním GetNotificationHubJobAsync.
Po dokončení úlohy můžete zkontrolovat výsledky zobrazením následujících souborů ve výstupním adresáři:
/<hub>/<jobid>/Failed.txt
/<hub>/<jobid>/Output.txt
Tyto soubory obsahují seznam úspěšných a neúspěšných operací z vaší dávky. Formát souboru je .cvs
, ve kterém každý řádek obsahuje číslo řádku původního vstupního souboru a výstup operace (obvykle vytvořený nebo aktualizovaný popis registrace).
Úplný ukázkový kód
Následující ukázkový kód importuje registrace do centra oznámení.
using Microsoft.Azure.NotificationHubs;
using Azure.Storage.Blobs;
using Azure.Storage.Sas;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
private static string CONNECTION_STRING = "namespace";
private static string HUB_NAME = "demohub";
private static string INPUT_FILE_NAME = "CreateFile.txt";
private static string STORAGE_ACCOUNT_CONNECTIONSTRING = "connectionstring";
private static string CONTAINER_NAME = "containername";
static async Task Main(string[] args)
{
var descriptions = new[]
{
new MpnsRegistrationDescription(@"http://dm2.notify.live.net/throttledthirdparty/01.00/12G9Ed13dLb5RbCii5fWzpFpAgAAAAADAQAAAAQUZm52OkJCMjg1QTg1QkZDMkUxREQFBlVTTkMwMQ"),
new MpnsRegistrationDescription(@"http://dm2.notify.live.net/throttledthirdparty/01.00/12G9Ed13dLb5RbCii5fWzpFpAgAAAAADAQAAAAQUZm52OkJCMjg1QTg1QkZDMjUxREQFBlVTTkMwMQ"),
new MpnsRegistrationDescription(@"http://dm2.notify.live.net/throttledthirdparty/01.00/12G9Ed13dLb5RbCii5fWzpFpAgAAAAADAQAAAAQUZm52OkJCMjg1QTg1QkZDMhUxREQFBlVTTkMwMQ"),
new MpnsRegistrationDescription(@"http://dm2.notify.live.net/throttledthirdparty/01.00/12G9Ed13dLb5RbCii5fWzpFpAgAAAAADAQAAAAQUZm52OkJCMjg1QTg1QkZDMdUxREQFBlVTTkMwMQ"),
};
// Get a reference to a container named "sample-container" and then create it
BlobContainerClient container = new BlobContainerClient(STORAGE_ACCOUNT_CONNECTIONSTRING, CONTAINER_NAME);
await container.CreateIfNotExistsAsync();
await SerializeToBlobAsync(container, descriptions);
// TODO then create Sas
var outputContainerSasUri = GetOutputDirectoryUrl(container);
BlobContainerClient inputcontainer = new BlobContainerClient(STORAGE_ACCOUNT_CONNECTIONSTRING, STORAGE_ACCOUNT_CONNECTIONSTRING + "/" + INPUT_FILE_NAME);
var inputFileSasUri = GetInputFileUrl(inputcontainer, INPUT_FILE_NAME);
// Import this file
NotificationHubClient client = NotificationHubClient.CreateClientFromConnectionString(CONNECTION_STRING, HUB_NAME);
var job = await client.SubmitNotificationHubJobAsync(
new NotificationHubJob {
JobType = NotificationHubJobType.ImportCreateRegistrations,
OutputContainerUri = outputContainerSasUri,
ImportFileUri = inputFileSasUri
}
);
long i = 10;
while (i > 0 && job.Status != NotificationHubJobStatus.Completed)
{
job = await client.GetNotificationHubJobAsync(job.JobId);
await Task.Delay(1000);
i--;
}
}
private static async Task SerializeToBlobAsync(BlobContainerClient container, RegistrationDescription[] descriptions)
{
StringBuilder builder = new StringBuilder();
foreach (var registrationDescription in descriptions)
{
builder.AppendLine(registrationDescription.Serialize());
}
var inputBlob = container.GetBlobClient(INPUT_FILE_NAME);
using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(builder.ToString())))
{
await inputBlob.UploadAsync(stream);
}
}
static Uri GetOutputDirectoryUrl(BlobContainerClient container)
{
Console.WriteLine(container.CanGenerateSasUri);
BlobSasBuilder builder = new BlobSasBuilder(BlobSasPermissions.All, DateTime.UtcNow.AddDays(1));
return container.GenerateSasUri(builder);
}
static Uri GetInputFileUrl(BlobContainerClient container, string filePath)
{
Console.WriteLine(container.CanGenerateSasUri);
BlobSasBuilder builder = new BlobSasBuilder(BlobSasPermissions.Read, DateTime.UtcNow.AddDays(1));
return container.GenerateSasUri(builder);
}
}
}
Export
Export registrace je podobný importu s následujícími rozdíly:
- Potřebujete jenom výstupní adresu URL.
- Vytvoříte NotificationHubJob typu ExportRegistrations.
Ukázkový fragment kódu
Následuje ukázkový fragment kódu pro export registrací v Javě:
// Submit an export job
NotificationHubJob job = new NotificationHubJob();
job.setJobType(NotificationHubJobType.ExportRegistrations);
job.setOutputContainerUri("container uri with SAS signature");
job = hub.submitNotificationHubJob(job);
// Wait until the job is done
while(true){
Thread.sleep(1000);
job = hub.getNotificationHubJob(job.getJobId());
if(job.getJobStatus() == NotificationHubJobStatus.Completed)
break;
}
Další kroky
Další informace o registracích najdete v následujících článcích: