从 Web 服务安排 Java

Scheduling Java from a Web Service

我有网站编程背景,最近开始学习 Java,主要目的是能够创建后端 "Scheduling" 服务。这意味着用户应该能够 create/configure 方法在特定 date/times.

运行

该解决方案必须适用于 Windows OS。

我了解一些必需的概念;

计划是我的 PHP 前端需要与 Java SOAP/REST Web 服务进行通信,后者又会与 "Singleton Javabean" 进行通信, Javabean 必须在引导时启动。我需要另一个无限循环的 Bean,它将读取 SNMP(和其他网络消息传递系统)并将这些值读入 Web 服务。

将来我希望这些解决方案能够读入 Android 应用程序。

但是,我不知道如何 运行 从数据库更新的配置文件中侦听特定时间的方法,或者将 Bean 运行 作为服务来方便阅读SNMP.

我研究了一些 Java 服务器,例如 JBoss、Glassfish 和 Tomcat,但是文档非常庞大,以至于很难找到它们支持我需要的功能。

我不需要这里的分步指南,只需朝着正确的方向推动即可。

我如何配置一个 Javabean 来侦听特定时间?我如何将 Javabean 配置为 运行 作为服务以方便在无限循环中读取 SNMP?

我当然同意您关于文档非常庞大的说法。不幸的是,我认为您将不得不直面这个问题。至于安排任务,您可以使用 Spring's Task Scheduling 功能。这适用于任何网络应用程序,但它也可以在没有网络应用程序的情况下工作。

执行者

对于Java中任务的周期性执行,了解一下ScheduledExecutorService。在 Whosebug 中搜索许多示例和讨论。

除了class,你还会发现很多关于Timer class的讨论。但 Timer 较旧,灵活性较差,最重要的是,不应该在 Servlet 环境中使用。

棘手的事情是学习如何正确处理线程安全。根据定义,您有多个线程处理相同的数据。

Servlet

您提到的那些服务器,例如 Tomcat and Jetty are based on Java Servlet technology。 Servlet 是 PHP 的替代品。

如果您想保留您的 PHP,您可以将其中一个 Servlet 服务器仅用作 Web 服务服务器。所以你不需要掌握所有的文档。

启动

了解在 Java Servlet 容器中启动的 Web 应用程序的方法是制作一个 class 实现 ServletContextListener 接口。容器将调用一对方法,一个是在部署(启动)Web 应用程序时调用,另一个是在部署(关闭)Web 应用程序时调用。

同样,搜索 Whosebug 以获取许多示例和讨论。

不需要单例

不需要单例。正如某些人所说,单例 "are evil"(such as Miško Hevery), making testing difficult and keeping the instance in memory endlessly. Having a single instance is not the problem, it is the Java implementation of the Singleton Design Pattern 将实例保存在静态变量中,这就是问题所在。

ServletContext

您可以访问 ServletContext to store and retrieve instances for your entire web app. Call the setAttribute and getAttribute 方法来传递您想要的任何对象子class。

注释

一定要learn about annotations in Java. They can greatly reduce the configuration work of your server and web service. For example@WebService@SOAPBinding(style=Style.RPC)

Java企业版

Java版本号混乱,Java不止一种("edition")。

常规 "desktop" 或 "standard" Java 遵循特定的数字方案。 "enterprise" Java("Java Enterprise Edition" 或 "Java EE")建立在 标准 Java 之上 遵循其自己的编号方案。因此,目前截至 2015 年 1 月,我们有 Java Standard Edition 8 but Java Enterprise Edition 7 (tutorial)(基于 Java SE 7)。

一定要查看有关 Java EE 7 而不是 6 的信息。我不是使用 Java 发布 Web 服务的专家。但我相信您会在 Java EE 7 中发现许多可能更容易的进步。

此外,还有一个名为 "Web Profile" 的更轻量级的 Java EE 7 版本,它支持 Servlets and a handful of additional technologies. The full Java EE layers on dozens of other technologies as well. For a list of those Web Profile technologies, see my answer 另一个问题。

Tomcat & Jetty 都是优秀的产品。但是 Tomcat 和 Jetty 都主要针对 Servlet,它是 Web Profile 的子集,而 Web Profile 又是完整 Java EE 的子集。您可能会或可能不会发现 Web 配置文件或完整 Java EE 的附加功能对于发布 Web 服务很有用。在这种情况下,您可能希望使用完整的 Java EE 服务器,例如 TomEE 或 Glassfish 或其他服务器。或者,有时更轻松的方法是从 Tomcat 或 Jetty 开始,挑选一些额外的技术,然后将它们的 jar 文件添加到您的项目中。

尤其是,您可能会发现 JAX-WS 很有用 (tutorial, reference implementation). Or if you prefer REST style, look at Java API for RESTful Services, JAX-RS.