从设计角度来看,在API中在后台拥有活动组件有多好

时间:2014-04-05 07:23:50

标签: java api-design

我有一个纯Java SE环境下的分布式软件系统。它有一个客户端用于访问服务的API。客户端可以是Web应用程序或桌面应用程序。

API使用对象流通过套接字与软件通信。

我想构建一个服务器推送类型的系统,以便近乎实时地通知客户端。

现在我需要一些API中的活动组件来接收这些通知并对它们进行操作。客户应该能够通过API

注册他们的行为
service.login();
service.addNotificationHandler(handler);

我的问题是,从设计角度看,在API中的后台有活动组件(线程)是多么好。

如果这是一个糟糕的选择,这个场景的正确选择是什么?

1 个答案:

答案 0 :(得分:2)

在API的实现中运行的后台线程没有任何问题,许多组件都这样做(例如,在某种程度上,您可以使用大量线程将Tomcat视为servlet-api实现)。请考虑组件运行的环境:像Java EE这样的环境通常不喜欢在服务器外部启动的线程(JBoss,Glassfish),并且需要服务器以某种方式提供线程。

在任何情况下,一旦客户端发出使用服务/组件完成信号(例如,通过service.logout()),请确保这些后台线程停止运行。 许多组件忘记这样做,这在使用实现时非常烦人。例如。 log4j有一个永不停止的watchdog线程,最近MySQL驱动程序添加了一个"废弃的连接线程" fails to stop。对于偶尔使用这些问题并不重要,但在服务器环境中(其中东西必须最好永远运行)这些问题严重到足以考虑替代实现(可能功能较少但不需要修复)