java应用servlt_关于Java:将Servlet用于非Servlet应用程序

我知道"普通的" Java,但是对于servlet,容器等世界是陌生的。因此,我不确定哪种方法最明智。

情况:我创建了一个Servlet,用于接收信息并将其存储在数据库中。该数据库被其他应用程序读取。

现在,我需要一个可以接收完全相同的信息并将其存储在相同数据库中的应用程序。但是,此新应用程序需要从另一台服务器(我将使用httpClient)中提取此信息,而不是将其推送到该服务器。这两个应用程序将共存。

对于这个新应用程序,我看到以下两个选项:

制作一个独立的应用程序。为此,我可以复制粘贴很多现有的后端代码,但是我将需要进行一些修改(servlet容器提供了上下文,易于进行数据库连接池等)。此外,我可能需要使用一些包装器,以便像我可以启动的适当守护程序一样工作,但也可以优雅地停止/重新启动等。

使新应用程序成为Servlet的一部分。也就是说:只需在将运行新应用程序的servlet的init()中启动一个新线程即可。这将允许我重用我已经拥有的所有后端代码,而无需重写任何后端代码。我只需要编写对其他服务器执行HTTP-GET请求的代码。使用这种方法,启动和停止服务也将更加容易,因为我可以为此使用Servlet容器。

有关项目的一些信息:用于将数据解析并将其写入数据库的后端代码有几个线程,但并不是很复杂。为原始servlet编写代码大约需要一周的时间。使用现有的代码库,我觉得这个新应用程序可能最多需要1、2天的工作时间。

我看到选项2的方式比较容易。但是感觉有点像我会"滥用" servlet。

所以我的问题是:不是应该处理请求的应用程序的servlet,而不是发出请求的应用程序的servlet?我在这里看不到一些巨大的缺点吗?哪个选项最有意义?

tl; dr:我可以编写不将请求用作Servlet的应用程序吗?

不要复制和粘贴代码。

编写一个可重用的类/模块,该类/模块负责将信息存储在数据库中,供1)Servlet和2)从HttpClient检索信息的独立代码使用。

这样,同一段代码可以处理相同的逻辑-如何将信息存储在数据库中-无论相关信息是被推送到servlet还是从远程URL提取。

Servlet容器是线程管理的环境。通常,不要在servlet中启动自己的线程,否则可能会发生坏事……例如,启动和停止应用程序上下文-应用服务器不知道您可能已经启动的线程,因此不会停止他们与您的应用...(此问题中的更多详细信息)

我将尝试从Servlet中提取所需的逻辑到不依赖Servlet API的类中,然后重新设计Servlet以使用这些类。 (重构)。正如您所注意到的,servlet API完全是关于接收请求和发送响应的。

我可以在任何喜欢的地方重用新的非servlet类中的逻辑,包括轮询应用程序的非servlet部分以提取该信息。

跟进问题:我不应该启动自己的线程,否则会发生不好的事情。您能详细说明一下吗?现在,现有的servlet使用两个后台线程将数据写入两个数据库。这些线程使用BlockingQueue连接到servlet。我在不同线程中使用它的原因是因为写入数据库非常耗时(因为数据库中有很多触发器),并且数据可能会突然进入。因此,这不是建议的设计吗?这会给您带来什么麻烦?

抱歉,我正在按照您的评论进行更新。

@Brabster可能是指大多数Web /应用服务器更喜欢在servlet容器中管理线程的事实,从理论上讲,您自己启动的线程并不会很安??全,因为容器可能会破坏它们。

如果您需要运行自己的线程,则应该在ServletContextListener中启动和停止线程,以便在上下文启动时以及在关键时刻停止时获得回调,以便您可以整理自己所做的一切-因此,方式,但是您必须非常小心。

@brasilt请参阅我的答案stackoverflow.com/questions/3873158/thread-running-in-web-page/了解其他说明

感谢您的回答和有趣的链接。我确实清理了servlet destroy()方法中的所有线程,但是不确定是否足够?

如果要重用代码,请将此代码作为"服务"或"业务逻辑"层的一部分,将由您的servlet和非servlet应用程序同时使用。

将代码打包为jar并在两个应用程序中使用。

您可以使用,但不应该使用,这是一个非常糟糕的设计。

如果您有两种不同的访问应用程序的方式(一种通过servlet,另一种是独立的),则应至少创建三个类:

一类负责与数据库等有关的所有工作。

一个调用第一类的servlet

一个称为头等舱的独立舱(或其他)

这样,您就不会复制/粘贴,并且可以重用代码(即使您可以通过第三种方式来调用需要繁重工作的类)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值