我知道'正常'的Java,但对于servlet,容器等世界来说是新手。因此我不确定哪种方法最明智。
情况:我创建了一个Servlet,它接收信息并将其存储在数据库中。其他应用程序会读取此数据库。
现在我需要的是一个接收完全相同信息并将其存储在同一数据库中的应用程序。但是,这个新的应用程序需要从另一个服务器(我将使用httpClient)中提取此信息,而不是将其推送到它。这两个应用程序将共存。
对于这个新应用程序,我看到以下两个选项:
单独申请。为此,我可以复制粘贴许多现有的后端代码,但我需要进行一些修改(servlet容器提供上下文,简单的数据库连接池等)。此外,我可能需要使用一些包装器,所以这可以像我可以开始的正确守护进程一样工作,但也优雅地停止/重启等。
使新应用程序成为Servlet的一部分。那就是:只需在将运行新应用程序的servlet的init()中启动一个新的Thread。这将允许我重用我已经拥有的所有后端代码,而无需重写任何代码。我只需要将执行HTTP-GET请求的代码写入其他服务器。使用这种方法,启动和停止服务也会更容易,因为我可以使用Servlet容器。
有关项目的一些信息:解析数据并将数据写入数据库的后端代码有几个线程,但不是很复杂。编写原始servlet的代码大约需要一周的时间。使用现有的代码库,我觉得这个新应用程序可能应该是最多工作1,2天
我看到选项2的方式更容易。但感觉有点像我会“滥用”servlet。 所以我的问题是:对于应该处理请求的应用程序而不是提出请求的应用程序,不是servlet吗?我有没有看到一些巨大的缺点?哪个选项最有意义?
tl; dr:我可以编写一个不作为Servlet提交请求的应用程序吗?
答案 0 :(得分:6)
请勿复制和粘贴代码。
编写一个可重用的类/模块,用于处理数据库中存储的信息,1)servlet和2)从HttpClient检索信息的独立代码可以使用。
这样,同一段代码处理相同的逻辑 - 如何将信息存储在数据库中 - 是否将有问题的信息推送到servlet或从远程URL获取。
答案 1 :(得分:3)
Servlet容器是线程管理的环境。一般情况下,不要在servlet中启动自己的线程,否则会发生不好的事情......例如,启动和停止应用程序上下文 - 应用程序服务器不知道您可能已启动的线程,因此不会停止它们与您的应用...(this SO question中的更详细信息)
我会尝试将我需要的逻辑从servlet中提取到不依赖于Servlet API的类中,并重新设计servlet以使用这些类。 (重构)。正如您所注意到的,servlet API就是接收请求和发送响应。
我可以在我喜欢的任何地方重新使用新的非servlet类中的逻辑,包括轮询拉出该信息的应用程序的非servlet部分。
答案 2 :(得分:0)
你可以使用,但你不应该,这是一个非常糟糕的设计。
如果您有两种不同的方式来访问您的应用程序(一种是通过servlet而另一种是独立的),您应该在leats创建三个类:
通过这种方式,您不需要复制/粘贴,并且可以重复使用您的代码(即使您可以通过第三种方式调用执行繁重工作的类
答案 3 :(得分:0)
如果要重用代码,请将此代码作为“服务”或“业务逻辑”层的一部分,将由servlet和非servlet应用程序使用。
将代码打包为jar并在两个应用程序中使用它。