我正在使用Restlet 2.2.1并构建Rest服务。如您所知,Router用于将Restlet或Resource作为目标附加。
Router router = new Router( getContext() );
router.attach("/healthcheck1",HealthCheckResource.class );
router.attach("/healthcheck2", new HealthCheckRestlet() );
然后,您可以在 handle()
中实现您的逻辑想知道哪一个最好用?我知道Resource有一个非常明确的生命周期(doInit,handle,release ...)和实现初始化等一次性逻辑的好地方。
答案 0 :(得分:1)
在可行的情况下,附上ServerResource
子类而不是Restlet
实例,原因有几个:
资源是构建RESTful API的自然方法。在资源类上使用@Get
,@Put
等批注时,您正在有效地记录RESTful API的该部分,并且有一些工具可以提取该信息以自动创建在线文档。 。如果您使用Restlet
实例,它对GET
,PUT
等的响应行为就不会立即显现出来。具有讽刺意味的是,使用Restlet
使编写非 RESTful的API更容易。
为每个请求创建一个资源类的单独实例,这意味着实例通常限于单个线程,从而简化了有关线程安全性的推理。相反,相同的Restlet
实例将用于所有handle(...)
调用,可能导致复杂的线程安全要求。
由于每个请求都有自己的资源实例,因此资源方法可能需要吸引通过应用程序上下文传递或注入到资源中的内部服务(请参见this Restlet extension)。
顺便说一句,您对“像初始化这样的一次性逻辑”的评论可能是一种误解。对于每个实例化的资源(即对该资源的每个请求一次)调用doInit
方法,不是仅一次。
请注意,我建议不要直接将Restlet
子类化为资源URL的最终目标,也许对于琐碎的资源除外。使用Restlet
的子类是另一回事:附加一个{strong>包装资源的Filter
很好。