谈谈商业场景。工厂摄像头实时监控相关生产过程,通过图像识别技术将图片和问题信息上传到华为云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里新创建的对象:
可以根据桶名和对象名下载对象。