Proxy Class API’s
proxy class类提供类(静态)方法来FindService() 实例,服务是动态的,因此,AUTOSAR提供了两个方法来提供发现服务。
- StartFindService():是一个类方法,它在后台启动一个周期性的“FindService”活动,在没有找到服务之前,一直周期的运行。这个周期是可以用户自定义的,一般来讲,系统服务会先发送三此find 服务,直到寻找到服务,然后返回已找到服务的反馈。
- FindService()是一次性的响应,用户调用一次就会返回一次结果,是实时性的。
注意这两种方式的实例标识符不一样:
- ara::com::InstanceIdentifier
- ara::core::InstanceSpecifier
FindService 返回匹配服务实例的句柄容器,如果没有发现实例,该容器为空。
与此相反,StartFindService返回一个FindServiceHandle,他提供方法来停止监视服务实例的后台活动。每当绑定的实例检测到时,证明服务实例的可用性,这个服务句柄的列表就会更新。
在被调用后,StartFindService的行为与FindService相似,它将使用当前可用的服务触发用户提供的处理程序函数。
无论使用一次性的 FindService 还是 StartFindService,在这两种情况下,都会获得一个用于标识(可能是远程)服务实例的句柄,这个句柄就能创建proxy的实例对象。
考虑这样的情况:如果服务实例出现故障,然后再次出现,会发生什么情况,例如由于某些生命周期状态的变化?服务中的现有代理实例是否可以当服务实例再次可用时,proxy端能不能被重用?这是大部分工程师都会困扰的地方,也是bug很多的地方,需要知道原理,在解bug的时候才能游刃有余,有理论依据。
AUTOSAR为了解决这个问题,当FindService在其生命周期,发现有问题以后,会在客户端进行(重新)订阅的动作。SOMEI/IP SD服务发现的功能会重新发现服务,知道服务能正常提供。
- GetSubscriptionState()会返回当前的订阅状态
- 重新调用FindService()得到实例句柄
- 或者
- 注册 FindServiceHandler,在服务实例获得时调用向下或向上使用新手柄。然后从新句柄重新创建代理实例(注意这需要重新订阅event服务)。
如果已经注册了 FindServiceHandler,它还提供了“自动更新”的功能。
应用程序开发人员可以调用FindServiceHandler查找服务处理程序中的现有proxy实例,当proxy实例的句柄在调用中可以返回结果,表明服务实例是又起来了。