IDE:Vistual Studio 2022 Community版本
+
.NET Core 3.1
创建项目时,没有什么特别的,还是附图做一下说明吧!

打开Vistual Studio正常套路创建,选择Azure Functions

填写项目名称,路径,解决方案名称同项目名称

- 选择.NET版本,这里我选择的是.NET Core 3.1
- Function下面选择Event Hub trigger,在这个选项下面,Use Azurite for runtime storage account (AzureWebJobsStorage)这一项保持默认选中,这个非常重要,这里强调一下:本身Azure Function这个PaSS服务有自己的运行逻辑在这里,它在运行的时候,它自身的一些配置和其它Azure服务集成时所用到一些服务管理,像触发机制,日志管理等等,还有一个对于EventHub集成最重要的:checkpoint这个信息,都需要保存到一个地方,那这个地方在哪里呢?一种情况:如果是本地调试,跑Azure Function with Event Hub trigger,刚才勾选保持默认就行,因为Azurite这个工具Vistual Studio 2022这个版本自带这个功能,之前发布过一篇文章,里面有详细点的介绍。这里就不再赘述了。另外一种情况:如果发布到Azure云上,部署的时候你也需要指定一下,配置一个StorageAccount
- Connection string setting name: 注意这个地方是connection string的变量名!!!
- Event Hub name:注意这个地方是真实的Event Hub instance名字,不是变量名,也不是Event Hub Namespace的名字。如果你设置成变量名,也可以,只不过在代码里引用这个变量名的时候,必须用%%把变量名括起来。
点击Create按钮,上个厕所回来应该能创建好了。
默认VS帮你创建了下面一坨代码,正常情况下呢,参数填对,然后在local.settings.json里把connection string配置正确,就可以跑了。
local.settings.json配置

我们来看看默认创建的代码用的eventhub依赖包:
using Microsoft.Azure.EventHubs;

那我们再用NuGet这个包管理工具搜一下:Microsoft.Azure.EventHubs,发现这个包已经deprecated了,已经被废弃了。从2020年开始就有一个新包:Azure.Messaging.EventHubs,微软也墙裂建议使用新包。

所以如果是老项目,之前用的老包,现在需要升级到新包。如果用VS打开项目,在Dependencies下就会看到最简单的Azure Function with Event Hub trigger的项目,只有两个依赖包:
- Microsoft.Azure.WebJobs.Extensions.EventHubs(4.1.1)
- Microsoft.NET.Sdk.Functions(3.0.13)
这两个依赖包其实是上层依赖包,各自分别还依赖其它的包,只不过如果你不用VS这个工具,可能看不出里面的依赖关系而已。详见下图。

从上面的依赖关系可以看出,里面的Microsoft.Azure.WebJobs.Extensions.EventHubs(4.1.1)这个版本的包用到的Microsoft.Azure.EventHubs版本是3.0.0,从包名可以看出就是老包了。那如何升级呢?
在VS里比较简单,项目的Dependencies->Packages右键打开Manage NuGet Packages


然后在Installed下,
选中Microsoft.Azure.WebJobs.Extensions.EventHubs,右边窗口中在Version下拉菜单中找到比较新的版本,然后点击Update按钮,然后跳出来的窗口点击OK,接受,稍等片刻即可。详见下图

包升级后,下面的Error List窗口就会报一些错误,因为依赖包有升级,代码里有些变量,语法用法也发生了改变,所以VS就会报错。

回到代码文件,首先就是引用的命名空间报错,因为依赖包升级了,根据之前介绍的,这个Microsoft.Azure.Eventhubs包已经废弃了,没有了。

为了确认一下,我们再去看看包管理工具里面的依赖包详细信息:

可以看到,现在的包已经换成了Azure.Messaging.EventHubs,并且版本是5.7.0
所以在代码中把using Microsoft.Azure.Eventhubs;这行删掉,鼠标放在EventData[]那里,然后按Alt + Enter键导入新包。
导入新包后,第23行代码,eventData.Body.Array, Offset等都会报错。因为新包eventData中没有Body这个属性了

代替Body的是EventBody,是BinaryData数据类型,直接有ToString方法。

所以想要查看数据里面的内容,直接改成下面的格式即可。

最后点击Debug按钮开始运行你的Azure Function app即可。

调试窗口出来之后,稍等片刻,如果你的Eventhub里有消息,应该就会显示出来了。
如果一直停留在下面这个信息状态,那么这个不是什么错误,这个是正常的一个log输出。相信我,跟微软确认过了,我也吐槽了一下,就不能换个让人能看懂的提示信息麽?
为什么停留在这里,原因有:
- Eventhub里里没有新的消息进来,老的消息已经读过了。
- Eventhub有consumer group,如果你和其他人共用同一个consumer group,也会出现这种情况。因为Eventhub里的consumer group类似于一个view的概念,也就是不同的consumer group是不同的view,但是同一个consumer group,如该consumer group被A和B共同使用时,A如果消费了里面的消息,那么B再消费时就没有信息可消费了,也就读不到消息。

好了,今天的分享就到这里!有任何问题,欢迎关注公众号,后台留言!
本文对你有帮助?点击关注公众号:BPShare,不错过任何分享!




