大概说一下业务场景。厂房里的摄像头实时监控相关的生产流程,通过图像识别技术判定有质量问题时将图片和问题信息上传到华为云OBS服务中。客户端实时获取并OBS里面的新数据,处理并发起相关整改流程、通知相关责任人等。
客户端实时获取OBS里的新数据,因为无法得知问题图片和信息在什么时候上传到OBS,最初的想法是通过定时任务调整合理的触发频率获取数据。这种方式有两个问题,一是无法真正做到实时,除非触发频率调到很高;二是没有新数据时定时任务空跑会浪费资源。
阅读了华为云OBS开发指南中的事件通知章节,觉得应该有更好的方式实现上述需求,经研究确实可行。开通了华为云账号并购买了ECS弹性云服务器、SMN和OBS服务,直接上步骤。
1、根据需要创建桶
1.1 选择区域,搜索OBS
1.2 创建桶
留意桶名称和Endpoint,代码里面会用到。
2、设置SMN
2.1 创建主题
创建主题选择的区域需要和OBS的区域相同。
2.2 设置主题策略
可发布消息的服务勾选OBS。
2.3 添加订阅
终端地址里的IP或域名必须是公网能访问的。
刚刚添加的订阅是未确认状态。
3、准备订阅终端(微服务)
微服务测试接口代码如下:
@RequestMapping("/smntest")
public void smnTest(HttpServletRequest request, @RequestBody Map<String, Object> paramMap) {
System.out.println("smn请求进来了!!!");
System.out.println("header如下:");
Enumeration<String> headers = request.getHeaderNames();
while (headers.hasMoreElements()) {
String s = headers.nextElement();
System.out.println( s + ":" + request.getHeader(s));
}
System.out.println("参数如下:");
System.out.println(paramMap.toString());
}
将服务部署到公网能访问到的服务器中。
4、确认订阅
4.1 发送确认订阅请求
在消息通知服务的订阅菜单中,锁定3.2中添加的订阅终端,点击请求订阅。
4.2 确认订阅
部署的测试服务里会受到请求订阅的请求。
将参数里面的subscribe_url参数值复制到浏览器的地址栏中,回车。
刷新订阅主题界面,发现订阅状态已更新。
5、编写DEMO
写一个demo向OBS桶里面创建对象,触发消息通知,SMN消息服务给订阅终端发送消息http消息触发相应的业务逻辑。
5.1 获取ak/sk
密钥创建后只能下载一次。
5.2 OBS桶里创建对象
public static void main(String[] args) throws IOException, ClassNotFoundException {
ObsClient obsClient = new ObsClient(ak, sk, endP);
BucketNotificationConfiguration bnc = new BucketNotificationConfiguration();
TopicConfiguration tc = new TopicConfiguration();
//设置配置id
tc.setId("test-create");
//设置主题RUN
tc.setTopic("urn:smn:cn-southwest-2:81670b4b98134c338810a791c8fad9f8:OBS-NOTIFICATION-TEST");
//设置触发事件-put对象时触发
tc.getEventTypes().add(EventTypeEnum.OBJECT_CREATED_PUT);
bnc.addTopicConfiguration(tc);
obsClient.setBucketNotification(bucketN, bnc);
//向桶里put一个对象
createObj(obsClient);
}
createObj(obsClient):
//添加对象
public static void createObj(ObsClient obsClient) {
PersonVO personVO = new PersonVO("张三", "南宁");
obsClient.putObject(bucketN, "XiaoZhang", new ByteArrayInputStream(personVO.toString().getBytes(StandardCharsets.UTF_8)));
}
6、运行main(..)方法
可以看到putObject事件成功触发了SMN向订阅终端发送消息。订阅终端接收的数据包括了新建对象所在的桶名称和对象名称。
OBS里新创建的对象:
根据桶名和对象名即可下载对象。