`
adamed
  • 浏览: 181074 次
社区版块
存档分类
最新评论

Quartz Job Scheduling Framework第8章翻译初稿

阅读更多
 

Chapter 8. Using Quartz Plug-Ins

8 使用Quartz插件

The Quartz framework offers several ways to extend the capabilities of the platform. By using various "hooks" (commonly referred to as extension points), Quartz becomes very easy to extend and customize to suit your needs. One of the easiest methods for extending the framework is to use Quartz plug-ins. This chapter looks at how to use the plug-in mechanism to make Quartz go where no Quartz user has gone before.

<o:p> </o:p>

Quartz框架提供多种方法拓展平台能力。通过使用不同的钩子(hooks)-俗称拓展点,Quartz可以非常简单的拓展定制以满足你的需求。拓展框架最简单的方法就是使用Quartz插件。这一章看一下如何使用插件机制使Quartz达到以前Quartz用户达不到的地方(原文:make Quartz go where no Quartz user has gone before.)。(译者注:此处的意思是使Quartz整合到其他框架中)

<o:p> </o:p>

What Is a Plug-In?<o:p></o:p>

什么是插件<o:p></o:p>

If you have used other open source frameworks such as Apache Struts, you're already familiar with concept of plug-ins and their use. Quite simply, a Quartz plug-in is a Java class that implements the org.quartz.spi.SchedulerPlugin interface and is registered as a plug-in with the Scheduler. The plug-in interface contains three methods and is shown in Listing 8.1.

如果你曾经使用其他开源框架如ApacheStruts,你应该已经熟悉插件这个概念并使用过它了。非常简单的,一个Quartz插件就是一个实现了org.quartz.spi.SchedulerPlugin接口的JAVA类,它在Scheduler中注册为插件。插件的接口包含列表8.1显示的3个方法。

Listing 8.1. A Quartz Plug-In Must Implement the SchedulerPlugin Interface<o:p></o:p>

列表8.1 一个Quartz插件必须实现SchedulerPlugin接口

java 代码
  1. public interface SchedulerPlugin {   
  2.   
  3.      public void initialize(String name, Scheduler scheduler)   
  4.                throws SchedulerException;   
  5.   
  6.      public void start();   
  7.      public void shutdown();   
  8.   
  9. }   
  10.   

 

The methods of the SchedulerPlugin are called during the initialization and startup of a Scheduler. The Scheduler calls these methods on every plug-in that is registered. The following sections describe when each method of the plug-in is called.

<o:p> </o:p>

SchedulerPlugin的方法在Scheduler被初始化和启动时被调用。Scheduler依次调用每个注册插件的这些方法。下一段描述了插件中的每个方法在什么时间被调用。

<o:p> </o:p>

The initialize() Method<o:p></o:p>

initialize()方法<o:p></o:p>

The initialize() method is called during the creation of the Scheduler. When the getScheduler() method is called on the StdSchedulerFactory, the factory calls the initialize() method on all the registered plug-ins.

<o:p> </o:p>

initialize()在创建Scheduler时被调用。在StdSchedulerFactorygetScheduler()方法被调用的时候,工厂调用所有注册插件的initialize()方法。

<o:p> </o:p>

Plug-Ins Don't Work with the DirectSchedulerFactory<o:p></o:p>

插件不工作在DirectSchedulerFactory模式下<o:p></o:p>

Plug-ins are designed to be used only with the StdSchedulerFactory. It's a limitation within the framework. If you want to use plug-ins, then you'll need to use the StdSchedulerFactory to retrieve your Scheduler instance.

<o:p> </o:p>

插件被设计为只在StdSchedulerFactory下使用。这是框架的限制。如果你使用插件那么你必须使用StdSchedulerFactory获取Scheduler的实例。

<o:p> </o:p>

<o:p> </o:p>

Each plug-in is registered with a unique name. This given name and Scheduler instance is included in the call to the initialize() method. You should take whatever action is necessary to initialize your plug-in. For example, your plug-in might need to read and parse data from a file or database.

<o:p> </o:p>

每个注册的插件都有一个唯一的名字。这个名字与Scheduler实例会包含在调用的initialize()方法中。你应该采取任何必要的操作初始化插件。例如你的插件需要读取并解析文件或数据库中的数据。

<o:p> </o:p>

Scheduler Is Not Fully Set Up at initialize() Time<o:p></o:p>

initialize()中Scheduler并没有全部设置<o:p></o:p>

The Scheduler has not been fully initialized when this method is called, so interaction with the Scheduler should be kept to a minimum. For example, you should not attempt to schedule any jobs during the initialize() method.

当这个方法被调用的时候Scheduler并没有完全被初始化,所以与Scheduler的交互应该保持在最小。例如你不应该在initialize()方法中调度任何Job

<o:p> </o:p>

If there is a problem initializing your plug-in, you should throw an org.quartz.SchedulerConfigException, which is a subclass of SchedulerException. This prevents the plug-in from being loaded and stops any further interaction with the Scheduler.

<o:p> </o:p>

如果在初始化的过程中发生了问题,程序会抛出org.quartz.SchedulerConfigException异常,他是SchedulerException的子类。它防止插件被加载并停止与Scheduler的进一步交互。

<o:p> </o:p>

The start() Method<o:p></o:p>

Start()方法<o:p></o:p>

The Scheduler instance calls the start() method to let the plug-in know that it can perform any startup actions it needs. For example, if you have jobs to schedule, this is the time to schedule them.

<o:p> </o:p>

Scheduler的实例调用start()方法让插件知道它可以完成任何它需要的启动操作。例如如果你有Job需要调度,那么就在这个时候去调度它。

<o:p> </o:p>

The shutdown() Method<o:p></o:p>

<o:p> </o:p>

Shutdown()方法<o:p></o:p>

<o:p> </o:p>

The shutdown() method is called to inform the plug-in that the Scheduler is shutting down. This is an opportunity for the plug-in to clean up any open resources that are open. For example, database connections or open files should be closed.

<o:p> </o:p>

Shutdown()方法通知插件Scheduler已经停止了。这个时候插件可以清理任何开放的资源。例如,数据库连接或关闭打开的文件。

<o:p> </o:p>

Scheduler Instance Not Passed in start() or shutdown()<o:p></o:p>

不要将Scheduler实例传递给start()或shutdown()方法<o:p></o:p>

<o:p> </o:p>

Notice that the Scheduler instance is not passed as an argument to the start() or shutdown() methods. If your plug-in needs access to the Scheduler during start() or shutdown(), you need to store the Scheduler in an instance variable in the plug-in.

注意,Scheduler实例不能作为参数传递给start()shutdown()方法。如果你的插件需要在start()shutdown()方法中访问Scheduler,你需要将Scheduler存储到插件中的实例变量中。

<o:p> </o:p>

Creating a Quartz Plug-In<o:p></o:p>

创建一个Quartz插件<o:p></o:p>

Creating a new plug-in is very simple. All you have to do is create a Java class (or reuse an existing one) that implements the org.quartz.spi.SchedulerPlugin interface. The Scheduler will create an instance of the plug-in during startup. The plug-in must have a no-argument constructor and obviously not be abstract.

<o:p> </o:p>

创建一个插件非常简单。你仅仅需要创建一个JAVA类(或重用已经存在的类),该类需要实现org.quartz.spi.SchedulerPlugin接口。Scheduler将会在启动时创建一个插件的实例。插件必须含有一个无参数的构造函数并且不能是虚函数。

<o:p> </o:p>

The JobInitializationPlugin<o:p></o:p>

JobInitializationPlugin插件<o:p></o:p>

The Quartz framework includes a plug-in for loading job and trigger information from an XML file. The plug-in is org.quartz.plugins.xml.JobInitializationPlugin and was discussed briefly back in Chapter 3, "Hello, Quartz." When you use this plug-in, the Quartz framework searches for a file called quartz_jobs.xml and attempts to load job and trigger information from this file.

<o:p> </o:p>

Quartz包含一个从XML文件读取Job和触发器信息的插件。这个插件就是org.quartz.plugins.xml.JobInitializationPlugin并且在第3 HelloQuartz中临时讨论了一下。当你使用这个插件的时候,Quartz将查找quartz_jobs.xml文件并且尝试从该文件中读取job和触发器信息。

<o:p> </o:p>

Changing the XML File That the JobInitializationPlugin Loads From<o:p></o:p>

改变JobInitializationPlugin读取的XML文件<o:p></o:p>

The plug-in enables you to change the name of the jobs file that it looks for to load job and trigger information. You change it by setting a different filename in the quartz.properties file. We talk more about setting parameters for plug-ins later in this chapter.

插件允许你改变寻找job和触发器信息的文件名。你可以在quartz.properties文件中设置其他的名字。在这章中我们更多的讨论在插件中设置参数。

<o:p> </o:p>

As Chapter 3 explained, this plug-in is very convenient when your application requirements don't involve loading job information from a database. It's also very useful during development and testing because you can quickly configure which jobs and triggers are to be fired. That is, arguably, it's easier to modify an XML file than a set of database tables.

<o:p> </o:p>

正如第3章阐述的那样,如果你的应用程序不想从数据库读取job信息时,使用该插件就非常方便。当然,在开发和测试时候也是非常有用的,因为你可能想快速的配置那些job和触发器被执行。综上可知修改XML文件比设置数据库表要简单的多。

<o:p> </o:p>

A nice extension to this idea of loading job and trigger information from an XML file would be to have a directory where you can store job XML files, and, by using a plug-in, the Scheduler would load whatever job files were present. This would enable you to conveniently add or remove jobs at Scheduler startup by simply adding or removing them from the specified directory. In the rest of this chapter, we show you how to build this plug-in.

<o:p> </o:p>

XML文件加载Job和触发器信息的一个比较好的拓展思想时,你可以建立一个目录存储jobXML文件。通过使用一个插件Scheduler不管job文件是否存在都可以进行加载。这种方式使你方便地通过简单地从目录中添加移除Scheduler启动时加载的Job信息。本章剩下的部分将讲解如何建立这个插件。

<o:p> </o:p>

Creating the JobLoaderPlugin<o:p></o:p>

创建JobLoaderPlugin<o:p></o:p>

<o:p> </o:p>

We call this new plug-in the JobLoaderPlugin. Listing 8.2 shows the JobLoaderPlugin class.

<o:p> </o:p>

我们调用这个新插件(JobLoaderPlugin)列表8.2显示了这个类。

<o:p> </o:p>

Listing 8.2. A Quartz SchedulerPlugin that Loads Multiple Job Files from a Directory<o:p></o:p>

列表8.2一个Quartz 的SchedulerPlugin插件从一个目录中加载多任务文件<o:p></o:p>

java 代码
  1. package org.cavaness.quartzbook.chapter8;   
  2.   
  3. import java.io.File;   
  4.   
  5. import org.apache.commons.logging.Log;   
  6. import org.apache.commons.logging.LogFactory;   
  7. import org.quartz.Scheduler;   
  8. import org.quartz.SchedulerConfigException;   
  9. import org.quartz.SchedulerException;   
  10. import org.quartz.spi.SchedulerPlugin;   
  11. import org.quartz.xml.JobSchedulingDataProcessor;   
  12.   
  13. public class JobLoaderPlugin implements SchedulerPlugin {   
  14.   
  15.      private static Log logger =   
  16.           LogFactory.getLog(JobLoaderPlugin.class);   
  17.      
  18.      // The directory to load jobs from   
  19.      private String jobsDirectory;   
  20.      
  21.      // An array of File objects   
  22.      private File[] jobFiles = null;   
  23.      
  24.      private String pluginName;   
  25.     
  26.      private Scheduler scheduler;   
  27.   
  28.      private boolean validateXML = true;   
  29.   
  30.      private boolean validateSchema = true;   
  31.   
  32.      public JobLoaderPlugin() {   
  33.      }   
  34.   
  35.      public File[] getJobFiles() {   
  36.           return jobFiles;   
  37.      }   
  38.   
  39.      public void setJobFiles(File[] jobFiles) {   
  40.           this.jobFiles = jobFiles;   
  41.      }   
  42.   
  43.      public boolean isValidateSchema() {   
  44.           return validateSchema;   
  45.      }   
  46.     
  47.      public void setValidateSchema(boolean validatingSchema) {   
  48.           this.validateSchema = validatingSchema;   
  49.      }   
  50.     
  51.      public void initialize(String name, final Scheduler scheduler)   
  52.                throws SchedulerException {   
  53.   
  54.           this.pluginName = name;   
  55.           this.scheduler = scheduler;   
  56.     
  57.           logger.debug("Registering Plugin " + pluginName);   
  58.           // Load the job definitions from the specified directory   
  59.       loadJobs();   
  60. }   
  61. private void loadJobs() throws SchedulerException {   
  62.   
  63.      File dir = null;   
  64.   
  65.      // Check directory   
  66.      if (getJobsDirectory() == null  
  67.                || !(dir =   
  68.                new File(getJobsDirectory())).exists()) {   
  69.           throw new SchedulerConfigException(   
  70.                     "The jobs directory was missing "  
  71.                               + jobsDirectory);   
  72.   
  73.      }   
  74.      logger.info("Loading jobs from " + dir.getName());   
  75.   
  76.      // Only XML files, filtering out any directories   
  77.      this.jobFiles = dir.listFiles(new XMLFileOnlyFilter());   
  78. }   
  79.   
  80. public void start() {   
  81.      processJobs();   
  82. }   
  83.   
  84. public void shutdown() {   
  85.      // nothing to clean up   
  86. }   
  87.   
  88. public void processJobs() {   
  89.      // There should be at least one job   
  90.      if (getJobFiles() == null || getJobFiles().length == 0) {   
  91.           return;   
  92.      }   
  93.   
  94.      JobSchedulingDataProcessor processor =   
  95.           new JobSchedulingDataProcessor(   
  96.                true, isValidateXML(), isValidateSchema());   
  97.   
  98.      int size = getJobFiles().length;   
  99.      for (int i = 0; i < size; i++) {   
  100.           File jobFile = getJobFiles()[i];   
  101.   
  102.           String fileName = jobFile.getAbsolutePath();   
  103.           logger.debug("Loading job file: " + fileName);   
  104.   
  105.           try {   
  106.   
  107.               processor.processFileAndScheduleJobs(   
  108.                    fileName, scheduler, true);   
  109.   
  110.           } catch (Exception ex) {   
  111.                logger.error("Error loading jobs: " + fileName);   
  112.                logger.error(ex);   
  113.           }   
  114.       }   
  115.    }   
  116.   
  117.    public String getJobsDirectory() {   
  118.         return jobsDirectory;   
  119.    }   
  120.   
  121.    public void setJobsDirectory(String jobsDirectory) {   
  122.         this.jobsDirectory = jobsDirectory;   
  123.    }   
  124.   
  125.    public String getPluginName() {   
  126.         return pluginName;   
  127.    }   
  128.   
  129.    public void setPluginName(String pluginName) {   
  130.         this.pluginName = pluginName;   
  131.    }   
  132.   
  133.    public boolean isValidateXML() {   
  134.         return validateXML;   
  135.    }   
  136.   
  137.    public void setValidateXML(boolean validateXML) {   
  138.         this.validateXML = validateXML;   
  139.    }   
  140. }   
  141.   

 

The real work of the JobLoaderPlugin in Listing 8.2 is done in just two methods: initialize() and start(). Both are required by the SchedulerPlugin interface. The rest of the methods are just setXXX and getXXX methods to fulfill the JavaBean contract because private properties have been declared.

列表8.2JobLoaderPlugin插件真正工作的只有2个方法:initialize() start()2个方法都是SchedulerPlugin接口中定义的。剩下的方法都是JavaBeangetset方法操作私有属性。

<o:p> </o:p>

The JobLoaderPlugin initialize() Method<o:p></o:p>

JobLoaderPlugin的initialize()方法<o:p></o:p>

<o:p> </o:p>

As you can see, the initialize() method, which is called by the Scheduler, calls the private loadJobs() method. The loadJobs() method uses the jobsDirectory that was passed in from the quartz.properties file to retrieve all XML files stored in that directory. The plug-in doesn't try to schedule the jobs yet because the Scheduler isn't fully instantiated when the plug-in's initialize() method is called. The JobLoaderPlugin simply holds on to an array of File objects, waiting for the start() method to be called. We also hold on to the instance of the Scheduler so that we have access to it when the start() method is called.

<o:p> </o:p>

正如你所见Scheduler调用的initialize()方法调用了私有方法loadJobs()loadJobs()方法使用从quartz.properties中所有来的储存在Job文件夹中的所有XML文件。暂时插件并不会试图调度job因为在插件的initialize()方法被调用的时候Scheduler还没有完全被初始化。JobLoaderPlugin简单的保存文件对象的数组,等待start()方法被调用。我们也保存了Scheduler的实例这样当start()方法被调用的时候可以访问它。

<o:p> </o:p>

The JobLoaderPlugin start() Method<o:p></o:p>

JobLoaderPlugin的start()方法<o:p></o:p>

When the Scheduler calls the start() method in the JobLoaderPlugin, the start() method calls processJobs(). The processJobs() method loops through the array of job files and loads each one into the Scheduler instance.

<o:p> </o:p>

ShedulerJobLoaderPlugin插件中调用start()<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-

评论

相关推荐

    Quartz Job Scheduling Framework第2章翻译初稿

    Quartz Job Scheduling Framework第2章翻译初稿 博文链接:https://adamed.iteye.com/blog/135880

    Quartz Job Scheduling Framework第11章翻译初稿

    博文链接:https://adamed.iteye.com/blog/135883

    Quartz Job Scheduling Framework第5章翻译初稿

    博文链接:https://adamed.iteye.com/blog/135881

    Quartz Job Scheduling Framework第7章翻译初稿

    博文链接:https://adamed.iteye.com/blog/135882

    248ssm-mysql-jsp 校园外卖管理系统.zip(可运行源码+数据库文件+文档)

    此次设计的外卖订单管理系统的登录角色一共分为四个,消费者、商户、管理员以及骑手。设计的系统为前端网页和后台管理系统。 消费者主要有以模块的需求:(1)购物车,(2)订单中心,(3)收藏夹,(4)收货地址,(5)个人信息管理,(6)站内咨询浏览,(7)在线留言。 商户的用例包括了一下几个模块设计:(1)商品管理,(2)库存管理,(3)订单管理,(4)销量统计,(5)收藏统计(6)销售额统计,(7)订单量统计 管理员系统结构中的功能设计比较多,分为三个大类分别是基础信息、业务功能和统计信息,基础信息主要是对消费者、商户以及骑手进行信息的维护工作,维护网站内的资讯信息等。业务功能是对网站内的商家进行分类管理,对于商品以及库存进行管理,对订单进行管理以及留言管理。统计信息包括对于商品销量的统计、订单走势图的分析等。 此次使用了java web技术线进行网页端的开发,开发工具采用idea.工具,数据库采用了MySQL进行设计开发,服务器采用了Tomcat服务器技术。该网站系统能够将学校周围商家的外卖产品在网站上向用户进行展示

    MyBatis 动态 SQL 示例

    MyBatis 是一个持久层框架,它允许用户在 XML 文件中编写动态 SQL 语句。MyBatis 的动态 SQL 功能非常强大,它允许开发者根据运行时的条件动态地生成 SQL 语句。这使得 MyBatis 能够灵活地处理各种复杂的查询需求。 MyBatis 动态 SQL 通过使用 <if>、<choose>、<when>、<otherwise>、<trim>、<set> 等标签来实现。附件中是一些常见的动态 SQL 标签及其用法,通过组合使用这些标签,可以编写出非常灵活和强大的 SQL 语句,以适应不同的查询和更新需求

    华为数据治理方法论,包括:数据治理框架、数据治理组织架构、数据治理度量评估体系以及华为数据治理案例分享

    华为数据治理方法论,包括:数据治理框架、数据治理组织架构、数据治理度量评估体系以及华为数据治理案例分享。 1目的 1 2面向的读者 2 3数据治理框架 3 3.1数据治理框架 3 3.2数据治理模块域 3 3.3数据治理各模块域之间的关系 4 4数据治理组织架构 7 4.1数据治理组织架构框架 7 4.2数据治理组织职责 7 5数据治理度量评估体系 10 5.1数据治理实施方法论 10 5.2数据治理度量维度 11 5.3数据治理度量评分规则 11 6华为数据治理案例 13 6.1华为数据治理思考 13 6.2华为数据治理实践 14 6.3华为数据治理效果 15 7新冠疫情数据治理思考 16 8DAYU 方法论产品落地 17

    毕业设计:基于SSM的mysql-羽毛球馆管理系统(源码 + 数据库 + 说明文档)

    毕业设计:基于SSM的mysql_羽毛球馆管理系统(源码 + 数据库 + 说明文档) 第二章 需求分析 3 2.1需求调研 3 2.2可行性分析 3 2.2.1技术的可行性 3 2.2.2经济的可行性 3 2.2.3操作可行性 3 2.2.4法律的可行性 4 2.3开发工具及技术 4 2.3.1网站开发环境 4 2.3.2 PHP语言简介 4 2.3.3 JavaScript技术 4 2.3.4 MySQL数据库 4 2.3.5 PHPstorm平台 5 2.3.6 工作环境 5 第三章 网站系统设计 5 3.1系统功能研究 5 3.1.1系统功能需求 5 3.2功能模块分析 6 3.3 设计的基本思想 7 3.4 性能要求 8 3.4.1 网站的安全性 8 3.4.2 数据的完整性 8 3.4.3界面要求 8 第四章 网站功能实现 8 4.1系统实现 8 4.1.1 管理员登录界面 9 4.1.2 后台用户管理 9 4.1.3 球场管理 10 4.1.4 物资管理 11 4.1.5 预定管理 12 4.2数据库的分析与设计 13 4.2.1数据库的概念结构设计 13 4.2.2数据库

    搜索链接相见欢友情链接系统ASPX版 v1.0-xjlinkaspxv1.0.rar

    相见欢友情链接系统ASPX版 v1.0_xjlinkaspxv1.0.rar,这是一个专为计算机专业人士设计的JSP源码资料包。这款系统是基于ASPX技术构建的,旨在为用户提供一个高效、便捷的友情链接管理平台。它能够帮助网站管理员轻松地管理和控制网站上的友情链接,提高网站的互动性和用户体验。这个资料包包含了完整的源代码和相关的文档,使得用户可以轻松地进行二次开发和定制。它提供了丰富的功能,包括友情链接的添加、删除、修改、审核等,以及链接分类、排序、搜索等功能。此外,它还支持多种链接样式和模板,可以根据用户的喜好和需求进行个性化设置。相见欢友情链接系统ASPX版 v1.0不仅功能强大,而且操作简便。它的界面设计简洁明了,用户可以快速上手,无需专业的计算机知识。同时,它还具有良好的兼容性和稳定性,可以在不同的环境和平台上运行,满足各种规模的网站建设需求。总的来说,相见欢友情链接系统ASPX版 v1.0是一个实用、高效、易用的友情链接管理工具。无论是对计算机专业人士,还是对普通用户,都是一个很好的选择。通过使用这个系统,可以大大提高网站管理的工作效率,提升网站的专业性和用户体验。重新回答||

    node-v8.12.0-linux-armv7l.tar.gz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    最新UI站长引流工具箱 带后台+安装说明.rar

    最新UI站长引流工具箱 带后台+安装说明.rar最新UI站长引流工具箱 带后台+安装说明.rar最新UI站长引流工具箱 带后台+安装说明.rar

    上市公司-企业要素密集度数据集(2000-2022年).txt

    数据存放网盘,txt文件内包含下载链接及提取码,永久有效。 样例数据及详细介绍参见文章:https://blog.csdn.net/li514006030/article/details/138294086

    node-v6.12.3.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    乐趣大型购物系统 v1.1(jsp+servlet+mysql)130223.rar

    这个文件名为"乐趣大型购物系统 v1.1(jsp+servlet+mysql)130223.rar",是一个计算机专业的JSP源码资料包。它包含了一个使用JSP、Servlet和MySQL技术实现的大型购物系统的源代码。该系统的设计理念是以用户为中心,提供便捷、高效的购物体验。系统采用了模块化的设计方法,将不同的功能划分为不同的模块,提高了代码的可读性和可维护性。同时,系统使用了MVC设计模式,将业务逻辑、数据访问和用户界面进行了分离,使得系统具有更好的扩展性和灵活性。在数据库设计方面,系统使用了MySQL数据库,对商品信息、用户信息、订单信息等进行了合理的设计和存储。通过使用数据库的事务管理机制,保证了数据的一致性和完整性。在用户界面设计上,系统提供了简洁明了的页面布局,使用户能够快速上手并完成购物操作。系统还提供了搜索功能,方便用户快速找到自己需要的商品。此外,系统还提供了购物车功能,用户可以将选购的商品加入购物车,并在合适的时间进行结算。总的来说,这个"乐趣大型购物系统 v1.1(jsp+servlet+mysql)130223.rar"是一个功能齐全、设计合理的购物系统,对于学

    node-v8.15.0-x64.msi

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    记账管理系统的设计与实现

    近年来由于生活节奏的加快,好像每个人都被很多难以启齿的问题困惑,然而关于随意消费是大多数人头疼的问题,没有任何计划和筹备的情况下随意消费,导致现实生活中我们所称为的“月光族”。 当你逐渐了解自己的财务状况,就可以学着做简单的收支规划。大部分月光族的根源其实是缺乏规划,想买什么的时候就买了。并不是说规划不能随意买东西,规划的价值在于让你使用资金的效率最高。无论你用金钱换取的必需品,满足感或者快乐,都可以通过规划获得比较高的效率。 本记账系统是一个基于国内外电子商务网站的发展现状,采用B2C(Business to Consumers)模式开发的电子商务平台,它的价值所在对于那些随意消费性的人群能起到一个很大的警示作用,而且系统扩张性很强,能根据客户的不同需求进行快速改进。该系统采用B/S三层结构,服务器是Tomcat同时运用JSp技术进行动态页面设计,后台数据库是Oracle。

    Linux 0.01版,经典中的经典

    大名鼎鼎的Linux源码,最经典的第一版

    node-v12.5.0-sunos-x64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v8.3.0-win-x64.zip

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v0.10.48.tar.gz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

Global site tag (gtag.js) - Google Analytics