练习 - 将应用程序配置为通过事件中心发送或接收消息

已完成

现在,你已准备好为事件中心配置发布者和使用者应用程序。

在本单元中,你将配置应用程序以通过事件中心发送或接收消息。 一个应用程序充当消息发送方 (SimpleSend),另一个充当消息接收方 (EventProcessorSample)。 由于这些应用程序是以 Java 编写的,因此可以在浏览器中进行所有开发、测试和管理。 但是,每个平台(如 .NET)都必须使用相同的配置。 这些应用程序存储在 GitHub 存储库中。

创建通用的标准存储帐户

Java 接收方应用程序将消息存储在 Azure Blob 存储中,这需要存储帐户。 若要创建存储帐户(常规用途 V2),请使用 storage account create 命令。 我们将为此命令定义以下参数:

参数 说明
name(必需) 存储帐户的名称。
资源组(必填) 资源组所有者是沙盒资源组,已将其定义为默认值。
位置(可选) 已将区域定义为默认值,但如果想要从默认资源组位置设置不同的区域,则可以包括它。
sku 存储帐户的默认 SKU 值为 Standard_RAGRS。 但在本练习中,我们将指定该值。

在上一练习中,我们为资源组和位置定义了默认值,因此可以从命令中省略这些参数。

  1. 在 Azure Cloud Shell 中,将存储帐户名称设置为变量。 存储帐户名称在 Azure 中必须唯一,并且必须包含 3 到 24 个数字或小写字母。

    STORAGE_NAME=storagename$RANDOM
    
  2. 运行以下命令以创建存储帐户。

    az storage account create --name $STORAGE_NAME --sku Standard_RAGRS --encryption-service blob
    

    提示

    创建此存储帐户可能需要一些时间。 如果存储帐户创建失败,请更改环境变量,然后重试。

  3. 运行以下命令来获取与存储帐户关联的访问密钥。

    az storage account keys list --account-name $STORAGE_NAME
    
  4. 与存储帐户关联的两个密钥以 JSON 格式输出。 复制并保存“key1”的值供将来使用。 你需要此密钥来访问你的存储帐户。

  5. 运行以下命令,获取存储帐户的连接字符串。

    az storage account show-connection-string -n $STORAGE_NAME
    
  6. 输出包含存储帐户的连接详细信息。 复制并保存 connectionString 的值。 结果应如下所示:

    "DefaultEndpointsProtocol=https;EndpointSuffix=core.windows.net;AccountName=storage_account_name;AccountKey=xxxxxxxxxxx"
    
  7. 运行以下命令在存储帐户中创建一个名为“消息”的容器。 使用在上一步中复制的“connectionString”值。

    az storage container create --name messages --connection-string "<connection string here>"
    

克隆事件中心 GitHub 存储库

在 Cloud Shell 中,使用 git 克隆事件中心 GitHub 存储库。 在本单元中生成的应用程序的源文件位于 GitHub 存储库中。

  1. 运行以下命令,确保处于 Cloud Shell 的主目录中,然后克隆此存储库。

    cd ~
    git clone https://github.com/Azure/azure-event-hubs.git
    

将存储库克隆到主文件夹。

编辑 SimpleSend.java

在本练习中,你将使用内置的 Cloud Shell 编辑器修改 SimpleSend 应用程序。 你需要添加事件中心命名空间、事件中心名称、共享访问策略名称和主密钥。

  1. 更改为“SimpleSend”文件夹。

    cd ~/azure-event-hubs/samples/Java/Basic/SimpleSend/src/main/java/com/microsoft/azure/eventhubs/samples/SimpleSend
    
  2. 在当前文件夹中打开 Cloud Shell 编辑器。

    code .
    

    当前文件夹中的文件列在左侧菜单中,右侧的编辑器空间显示了标题栏中列出的文件名的内容。

  3. 如果尚未打开,请通过在文件列表中选择“SimpleSend.java”将其打开。

  4. 在编辑器中,找到并替换 ConnectionStringBuilder 下的以下字符串:

    • "Your Event Hubs namespace name" 替换为事件中心命名空间的名称。
    • "Your Event Hub" 替换为事件中心。
    • "Your policy name" 替换为 RootManageSharedAccessKey。
    • "Your primary SAS key" 替换为适用于先前所保存的事件中心命名空间的 primaryKey 密钥的值。

    如果忘记了这些值,可切换到编辑器下方的终端窗口,运行 echo 命令以列出环境变量。 例如:

    echo $NS_NAME
    echo $HUB_NAME
    echo $STORAGE_NAME
    

    对于主 SAS 密钥,创建事件中心命名空间时,会创建一个名为“RootManageSharedAccessKey”的 256 位 SAS 密钥,其中包括向命名空间授予发送、侦听和管理权限的主密钥和辅助密钥。 在本练习前面部分,你通过运行 Azure CLI 命令获取了该密钥;但也可以通过在 Azure 门户中选择事件中心命名空间来查找密钥和连接字符串,然后菜单中的“设置”下,选择“共享访问策略”;现在,请选择策略名称“RootManageSharedAccessKey”以显示 SAS 策略密钥。

  5. 保存“SimpleSend.java”文件,然后关闭编辑器。 在编辑器的右上角选择,并使用“保存”和“关闭编辑器”菜单项

    显示用于保存文件和关闭编辑器的菜单的屏幕截图。

使用 Maven 生成 SimpleSend.java

现在,你将通过运行 mvn 命令来生成 Java 应用程序。

  1. 在 Cloud Shell 中,输入以下命令以导航到主 SimpleSend 文件夹。

    cd ~/azure-event-hubs/samples/Java/Basic/SimpleSend
    
  2. 生成 Java SimpleSend 应用程序。 此命令使用事件中心的连接详细信息生成应用程序。

    mvn clean package -DskipTests
    

    生成过程可能需要几分钟才能完成。 确保看到“[INFO] BUILD SUCCESS”消息才能继续操作。

    发送方应用程序的生成结果。

编辑 EventProcessorSample.java

现在配置接收方(也称为订阅方或使用者)应用程序,从事件中心引入数据

对于接收方应用程序,有两个类可用:EventHubReceiver 和 EventProcessorHost。 EventProcessorHost 是在 EventHubReceiver 之上生成的,但提供比 EventHubReceiver 更简单的编程接口。 EventProcessorHost 可以使用同一存储帐户自动跨多个 EventProcessorHost 实例分配消息分区。

在此过程中,你将使用 EventProcessorHost 方法。 你编辑 EventProcessorSample 应用程序来添加以下值:你的事件中心命名空间、事件中心名称、共享访问策略名称和主密钥、存储帐户名称、连接字符串和容器名称。

  1. 通过运行以下命令,更改为 EventProcessorSample 文件夹。

    cd ~/azure-event-hubs/samples/Java/Basic/EventProcessorSample/src/main/java/com/microsoft/azure/eventhubs/samples/eventprocessorsample
    
  2. 打开 Cloud Shell 编辑器。

    code .
    
  3. 在左侧的文件资源管理器中选择 EventProcessorSample.java 文件。

  4. 在编辑器中,找到并替换以下字符串:

    • ----EventHubNamespaceName---- 替换为事件中心命名空间的名称。
    • ----EventHubName---- 替换为事件中心。
    • ----SharedAccessSignatureKeyName---- 替换为 RootManageSharedAccessKey。
    • ----SharedAccessSignatureKey---- 替换为适用于先前所保存的事件中心命名空间的 primaryKey 密钥的值。
    • ----AzureStorageConnectionString---- 替换为先前所保存的存储帐户连接字符串。
    • ----StorageContainerName----替换为消息。
    • ----HostNamePrefix---- 替换为存储帐户的名称。

    如果忘记了这些值,可切换到编辑器下方的终端窗口,运行 echo 命令以列出环境变量。 例如:

    echo $NS_NAME
    echo $HUB_NAME
    echo $STORAGE_NAME
    
  5. 通过“...”菜单或加速键(Windows 和 Linux 上的 Ctrl+S,macOS 上的 Cmd+S)保存 EventProcessorSample.java。

  6. 关闭编辑器。

使用 Maven 生成 EventProcessorSample.java

  1. 通过运行以下命令,更改为主 EventProcessorSample 文件夹。

    cd ~/azure-event-hubs/samples/Java/Basic/EventProcessorSample
    
  2. 通过运行以下命令来生成 Java SimpleSend 应用程序,以确保应用程序使用事件中心的连接详细信息。

    mvn clean package -DskipTests
    

    生成过程可能需要几分钟才能完成。 确保看到“[INFO] BUILD SUCCESS”消息后才能继续操作。

    接收方应用程序的生成结果。

启动发送方和接收方应用

  1. 通过从命令行运行以下 java 命令并指定 .jar 包,运行 Java 应用程序。 运行以下命令启动 SimpleSend 应用程序。

    cd ~/azure-event-hubs/samples/Java/Basic/SimpleSend
    java -jar ./target/simplesend-1.0.0-jar-with-dependencies.jar
    
  2. 当看到“发送完成...”时,按 Enter

    jar-with-dependencies.jar
    SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
    SLF4J: Defaulting to no-operation (NOP) logger implementation
    SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
    2018-09-18T19:42:15.146Z: Send Complete...
    
  3. 通过运行以下命令启动 EventProcessorSample 应用程序。

    cd ~/azure-event-hubs/samples/Java/Basic/EventProcessorSample
    java -jar ./target/eventprocessorsample-1.0.0-jar-with-dependencies.jar
    
  4. 当消息停止向控制台显示时,按 Enter 或按 Ctrl+C 结束程序。

    ...
    SAMPLE: Partition 0 checkpointing at 1064,19
    SAMPLE (3,1120,20): "Message 80"
    SAMPLE (3,1176,21): "Message 84"
    SAMPLE (3,1232,22): "Message 88"
    SAMPLE (3,1288,23): "Message 92"
    SAMPLE (3,1344,24): "Message 96"
    SAMPLE: Partition 3 checkpointing at 1344,24
    SAMPLE (2,1120,20): "Message 83"
    SAMPLE (2,1176,21): "Message 87"
    SAMPLE (2,1232,22): "Message 91"
    SAMPLE (2,1288,23): "Message 95"
    SAMPLE (2,1344,24): "Message 99"
    SAMPLE: Partition 2 checkpointing at 1344,24
    SAMPLE: Partition 1 batch size was 3 for host mystorageacct2018-46d60a17-7060-4b53-b0e0-cca70c970a47
    SAMPLE (0,1120,20): "Message 81"
    SAMPLE (0,1176,21): "Message 85"
    SAMPLE: Partition 0 batch size was 10 for host mystorageacct2018-46d60a17-7060-4b53-b0e0-cca70c970a47
    SAMPLE: Partition 0 got event batch
    SAMPLE (0,1232,22): "Message 89"
    SAMPLE (0,1288,23): "Message 93"
    SAMPLE (0,1344,24): "Message 97"
    SAMPLE: Partition 0 checkpointing at 1344,24
    SAMPLE: Partition 3 batch size was 8 for host mystorageacct2018-46d60a17-7060-4b53-b0e0-cca70c970a47
    SAMPLE: Partition 2 batch size was 9 for host mystorageacct2018-46d60a17-7060-4b53-b0e0-cca70c970a47
    SAMPLE: Partition 0 batch size was 3 for host mystorageacct2018-46d60a17-7060-4b53-b0e0-cca70c970a47
    

总结

在本单元中,你配置了一个发送方应用程序,可以向事件中心发送消息。 你还配置了一个接收方应用程序,可以从事件中心接收消息。