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

Quartz Job Scheduling Framework第10章翻译初稿 续

阅读更多
 

In the example in Listing 10.2, the helloWorld() method that was invoked on the EJB didn't defined any parameters. The EJBInvokedJob class enables you to pass arguments to an EJB method by specifying them using the EJB_ARGS_KEY and EJB_ARG_TYPES_KEY parameters shown in Table 10.1.

<o:p> </o:p>

列表10.2中定义的供EJB调用的helloWord()方法并没有定义任何参数。EJBInvokedJob类允许你想EJB方法中传递参数。方法是使用表10.1中的EJB_ARGS_KEY EJB_ARG_TYPES_KEY

<o:p> </o:p>

Listing 10.3 shows another simple example that passes an argument to a different version of helloWorld() EJB running on the Apache Geronimo J2EE server.

<o:p> </o:p>

列表 10.3 显示了另一个简单的示例,将参数传递给其他版本的运行在Apache Geronimo J2EE 服务器上的EJB helloWorld()

<o:p> </o:p>

Listing 10.3 is very similar to Listing 10.2, except that it includes the parameters EJB_ARGS_KEY and EJB_ARG_TYPES_KEY. Also, because it's running against the Geronimo J2EE application server, it needed to add the arguments for PRINCIPAL and CREDENTIALS.

<o:p> </o:p>

列表10.310.2非常类似除了10.3中包含参数EJB_ARGS_KEY EJB_ARG_TYPES_KEY。当然由于运行在Geronimo J2EE服务器上,它需要添加额外的参数(PRINCIPAL CREDENTIALS)。

<o:p> </o:p>

Listing 10.3. A Simple Example Using the EJBInvokerJob<o:p></o:p>

列表10.3 一个简单的使用EJBInvokerJob的例子<o:p></o:p>

 

java 代码
<o:p>
  1. package org.cavaness.quartzbook.chapter10;   
  2.   
  3.     
  4.   
  5. import java.util.Date;   
  6.   
  7.     
  8.   
  9. import org.apache.commons.logging.Log;   
  10.   
  11. import org.apache.commons.logging.LogFactory;   
  12.   
  13. import org.quartz.JobDetail;   
  14.   
  15. import org.quartz.Scheduler;   
  16.   
  17. import org.quartz.SchedulerException;   
  18.   
  19. import org.quartz.Trigger;   
  20.   
  21. import org.quartz.TriggerUtils;   
  22.   
  23. import org.quartz.impl.StdSchedulerFactory;   
  24.   
  25. import org.quartz.jobs.ee.ejb.EJBInvokerJob;   
  26.   
  27.     
  28.   
  29. public class Listing_10_3 {   
  30.   
  31.      static Log logger = LogFactory.getLog(Listing_10_3.class);   
  32.   
  33.     
  34.   
  35.      public static void main(String[] args) {   
  36.   
  37.     
  38.   
  39.           Listing_10_3 example = new Listing_10_3();   
  40.   
  41.     
  42.   
  43.           try {   
  44.   
  45.     
  46.   
  47.               // Create a Scheduler and schedule the Job   
  48.   
  49.               Scheduler scheduler = example.createScheduler();   
  50.   
  51.               example.scheduleJob(scheduler);   
  52.   
  53.     
  54.   
  55.               // Start the Scheduler running   
  56.   
  57.               scheduler.start();   
  58.   
  59.     
  60.   
  61.               logger.info("Scheduler started at " + new Date());   
  62.   
  63.     
  64.   
  65.           } catch (SchedulerException ex) {   
  66.   
  67.                logger.error(ex);   
  68.   
  69.           }   
  70.   
  71.     
  72.   
  73.     
  74.   
  75.     
  76.   
  77.      }   
  78.   
  79.     
  80.   
  81.      // Schedule the EJBInvokerJob   
  82.   
  83.      private void scheduleJob(Scheduler scheduler)   
  84.   
  85.           throws SchedulerException {   
  86.   
  87.     
  88.   
  89.           // Create a JobDetail for the Job   
  90.   
  91.           JobDetail jobDetail = new JobDetail("HelloWorldJob",   
  92.   
  93.                     Scheduler.DEFAULT_GROUP,   
  94.   
  95.                     org.quartz.jobs.ee.ejb.EJBInvokerJob.class);   
  96.   
  97.     
  98.   
  99.           // Load all of the necessary EJB parameters   
  100.   
  101.           loadJobDataMap(jobDetail);   
  102.   
  103.     
  104.   
  105.           // Create a trigger that fires every 10 seconds, forever   
  106.   
  107.           Trigger trigger = TriggerUtils.makeSecondlyTrigger(10);   
  108.   
  109.     
  110.   
  111.           trigger.setName("helloWorldTrigger");   
  112.   
  113.           // Start the trigger firing from now   
  114.   
  115.           trigger.setStartTime(new Date());   
  116.   
  117.     
  118.   
  119.           // Associate the trigger with the job in the scheduler   
  120.   
  121.           scheduler.scheduleJob(jobDetail, trigger);   
  122.   
  123.     
  124.   
  125.      }   
  126.   
  127.     
  128.   
  129.      /*  
  130.  
  131.       * Configure the EJB parameters in the JobDataMap  
  132.  
  133.       * 在JobDataMap中配置EJB参数  
  134.  
  135.       */  
  136.   
  137.      public JobDetail loadJobDataMap(JobDetail jobDetail) {   
  138.   
  139.           jobDetail.getJobDataMap().put(   
  140.   
  141.                EJBInvokerJob.EJB_JNDI_NAME_KEY, "ejb/Test");   
  142.   
  143.     
  144.   
  145.           jobDetail.getJobDataMap().put(EJBInvokerJob.EJB_METHOD_KEY,   
  146.   
  147.                     "helloWorld");   
  148.   
  149.     
  150.   
  151.           Object[] args = new Object[1];   
  152.   
  153.           args[0] = " from Quartz";   
  154.   
  155.           jobDetail.getJobDataMap().put(   
  156.   
  157.                EJBInvokerJob.EJB_ARGS_KEY, args);   
  158.   
  159.     
  160.   
  161.           Class[] argTypes = new Class[1];   
  162.   
  163.           argTypes[0] = java.lang.String.class;   
  164.   
  165.           jobDetail.getJobDataMap().put(   
  166.   
  167.                EJBInvokerJob.EJB_ARG_TYPES_KEY, argTypes);   
  168.   
  169.     
  170.   
  171.           jobDetail.getJobDataMap().put(   
  172.   
  173.                EJBInvokerJob.PROVIDER_URL, "127.0.0.1:4201");   
  174.   
  175.     
  176.   
  177.           jobDetail.getJobDataMap().put(   
  178.   
  179.                EJBInvokerJob.INITIAL_CONTEXT_FACTORY,   
  180.   
  181.                          "org.openejb.client.RemoteInitialContextFactory");   
  182.   
  183.           jobDetail.getJobDataMap().put(   
  184.   
  185.                EJBInvokerJob.PRINCIPAL, "system");   
  186.   
  187.     
  188.   
  189.           jobDetail.getJobDataMap().put(   
  190.   
  191.                EJBInvokerJob.CREDENTIALS, "manager");   
  192.   
  193.     
  194.   
  195.           return jobDetail;   
  196.   
  197.      }   
  198.   
  199.     
  200.   
  201.      /*  
  202.  
  203.       * return an instance of the Scheduler from the factory  
  204.  
  205.       */  
  206.   
  207.      public Scheduler createScheduler() throws SchedulerException {   
  208.   
  209.           return StdSchedulerFactory.getDefaultScheduler();   
  210.   
  211.      }   
  212.   
  213. }   
  214.   
  215.     

 

EJBInvokerJob Parameters and Serialization<o:p></o:p>

EJBInvokerJob参数与串行化<o:p></o:p>

Because of the typical serialization problems that are associated with Java and distributed applications, you should stick to passing Strings and primitives to your EJB methods. If you need to pass more complex types, your code must serialize the objects between client and server properly. For more in-depth information on Java serialization, check out Sun's Serialization specification at http://java.sun.com/j2se/1.5.0/docs/guide/serialization.

<o:p> </o:p>

由于典型的串行化问题都与JAVA分布式应用有关,所以你最好只传递字符串和基本类型到EJB方法中。如果你需要传递复杂类型你需要在客户端和服务器代码中恰当的串行化对象。更加深入的关于JAVA串行化的资料点击Sun的串行化规范:http://java.sun.com/j2se/1.5.0/docs/guide/serialization

<o:p> </o:p>

<o:p> </o:p>

Because Quartz needs to get a reference to the home and remote interfaces for the EJB, you need to deploy some J2EE client JARs with your external Quartz application. The JARs you need to add depend on which J2EE container you're using. If you're using WebLogic, for example, you'll probably just put the weblogic.jar with the Quartz application. For Geronimo, several are involved. Check with the server documentation to be sure.

<o:p> </o:p>

应为Quartz需要为EJB获取本地与远程的接口,你必须将一些J2EE客户端jar包导入到外部Quartz应用中。添加的Jar包依赖于你使用的J2EE容器。例如,如果你使用WebLogic你需要将weblogic.jar导入到Quartz应用中。如果使用Geronimo导入其他几个被调用的包。你需要查看服务器支持文档。

<o:p> </o:p>

Running Quartz Within the J2EE Application Server<o:p></o:p>

J2EE应用服务器中部署Quartz<o:p></o:p>

Running Quartz as a J2EE client is a little more involved than running Quartz as an external J2SE application. This is mostly because deploying applications within the container is somewhat more complicated. In addition, the J2EE specification puts some constraints on components within the container. One of the biggest guidelines that the specification gives involves who and what can create Java threads. Because it's the container's responsibility to manage all resources, it can't allow just anything or anyone to create threads. If it did, it would have a harder time managing the environment and keeping things stable. Quartz creates its own worker threads, so you need to follow some steps to make sure things work properly.

<o:p> </o:p>

与作为外部J2SE应用相比将Quartz作为一个J2EE客户端比较复杂。这是因为在容器中部署应用就比较复杂。另外J2EE规范对容器内的组件加以约束。影响最大的准则是规范规定了谁或者什么可以创建JAVA线程。因为容器通过创建线程管理资源。所以不允许任何人或物私自创建线程。如果这样做了容器将不能管理环境也不能保持容器中事务的稳定。Quartz创建自己的工作线程。这样你就必须按下面的步骤配置以保证Quartz正常运行。

<o:p> </o:p>

Assume that a stateless session bean such as the one from Listing 10.1 is already deployed in the container. The easiest way to deploy Quartz within the container is to build a WAR file that contains all the necessary files and then use the admin tools, or Eclipse, to deploy the Web application within the container.

<o:p> </o:p>

加入要向容器中部署一个列表10.1那样的无状态会话bean。最简单的方法是将Quartz建立一个包含所有必要文件的war文件使用管理员工具或EclipseWeb应用部署到容器中。

<o:p> </o:p>

The Web application directory structure is just like that of any other Web application. You need to add the following files to it:

<o:p> </o:p>

Web应用文件夹与其他Web应用相同。你需要相其中添加下面的文件。

<o:p> </o:p>

  • web.xml (put in WEB-INF)
  • quartz.properties (put in WEB-INF/classes)
  • quartz_jobs.xml (put in WEB-INF/classes)
  • Quartz binary (put in WEB-INF/lib)
  • Third-party libraries (put in WEB-INF/lib)

Because you are building a Web application, you need to add the requisite web.xml deployment descriptor. Listing 10.4 shows the web.xml for our client application that will be installed within the container.

<o:p> </o:p>

因为你要建立Web应用。你必须添加Web.xml文件。列表10.4显示了将要部署到容器中的客户端应用的web.xml

<o:p> </o:p>

Listing 10.4. The web.xml for the Quartz J2EE Client Application<o:p></o:p>

列表10.4 Quartz J2EE客户端应用的web.xml<o:p></o:p>

xml 代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.   
  3.     
  4.   
  5. <web-app>  
  6.   
  7.   <servlet>  
  8.   
  9.     <servlet-name>QuartzServlet</servlet-name>  
  10.   
  11.     <servlet-class>  
  12.   
  13.       org.quartz.ee.servlet.QuartzInitializerServlet   
  14.   
  15.     </servlet-class>  
  16.   
  17.     <load-on-startup>1</load-on-startup>  
  18.   
  19.   </servlet>  
  20.   
  21.     
  22.   
  23.   <servlet-mapping>  
  24.   
  25.     <servlet-name>QuartzServlet</servlet-name>  
  26.   
  27.     <url-pattern>/servlet/QuartzServlet</url-pattern>  
  28.   
  29.   </servlet-mapping>  
  30.   
  31. </web-app>  
  32.   
  33.     

The Quartz framework includes a Java servlet called QuartzInitializerServlet that, when invoked, initializes the Quartz Scheduler and loads job information. In Listing 10.4, we've set the <load-on-startup> parameter to have a value of 1 so the servlet will be loaded and initialized when the container is started. By using the servlet to start the Quartz Scheduler, we avoid the issues of thread permission because the container will allow servlets to create user threads.

<o:p> </o:p>

Quartz 包含一个Java ServletQuartzInitializerServlet)当它被用来初始化Quartz Scheduler并加载job信息。在列表10.4中我们设置<load-on-startup>参数为1,当容器初始化时这个servlet就会被加载并初始化。通过使用servlet启动Quartz Scheduler我们避免了线程权限问题,因为容器允许servlet创建用户权限。<o:p></o:p>

<o:p> </o:p>

QuartzInitializerListener Added to Quartz<o:p></o:p>

QuartzInitializerListener添加到Quartz<o:p></o:p>

Recently, a new class called QuartzInitializerListener was added to Quartz that implements the javax.servlet.ServletContextListener interface. This class can be used as an alternative to the QuartzInitializerServlet mentioned earlier.

最近一个新类QuartzInitializerListener被添加到Quartz中改类实现javax.servlet.ServletContextListener接口,QuartzInitializerListener可以作为刚刚提到的QuartzInitializerServlet替代方案。

<o:p> </o:p>

Next, you need to put the standard quartz.properties file into the WEB-INF/classes directory of the Web application. There's nothing special about this version of the properties file; it's essentially what we did in past chapters. However, here we use the JobInitializationPlugin (this was shown in Chapter 8, "Using Quartz Plug-Ins," and is designed to load job information from an XML file). By default, the plug-in looks for a file called quartz_jobs.xml and loads the jobs found in the file. As Chapter 8 described, using this particular plug-in keeps you from having to write job-loading code and be forced to recompile when changes occur. The quartz_jobs.xml file for this example is shown in Listing 10.5.

<o:p> </o:p>

下一步你需要将quartz.properties文件添加到WEB-INF/classes文件夹中。Properties文件没有版本限制与我们在前面章节讲解的配置文件没有区别。然而,这里我们使用了JobInitializationPlugin(在第8 使用Quartz插件 做详细讲解),它被设计用来从XML文件中加载Job信息。默认情况下,插件寻找quartz_jobs.xml文件并从中加载job信息。正如第8章描述的那样,这个特殊的插件使你不必编写job加载代码,也就不用在job发生改变时重新编译代码。这个例子的quartz_jobs.xml如列表10.5

<o:p> </o:p>

Listing 10.5. The quartz_jobs.xml Used Within the J2EE Client<o:p></o:p>

列表10.5 J2EE客户端使用的quartz_jobs.xml<o:p></o:p>

xml 代码
  1. <?xml version='1.0' encoding='utf-8'?>  
  2.   
  3.     
  4.   
  5. <quartz>  
  6.   
  7.   <job>  
  8.   
  9.     <job-detail>  
  10.   
  11.         <name>HelloWorldJob</name>  
  12.   
  13.         <group>DEFAULT</group>  
  14.   
  15.         <job-class>org.quartz.jobs.ee.ejb.EJBInvokerJob</job-class>  
  16.   
  17.         <volatility>false</volatility>  
  18.   
  19.         <durability>false</durability>  
  20.   
  21.         <recover>false</recover>  
  22.   
  23.     
  24.   
  25.         <job-data-map allows-transient-data="true">  
  26.   
  27.           <entry>  
  28.   
  29.             <key>ejb</key>  
  30.   
  31.             <value>ejb/Test</value>  
  32.   
  33.           </entry>  
  34.   
  35.           <entry>  
  36.   
  37.             <key>java.naming.factory.initial</key>  
  38.   
  39.             <value>org.openejb.client.RemoteInitialContextFactory</value>  
  40.   
  41.           </entry>  
  42.   
  43.           <entry>  
  44.   
  45.             <key>java.naming.provider.url</key>  
  46.   
  47.             <value>127.0.0.1:4201</value>  
  48.   
  49.           </entry>  
  50.   
  51.           <entry>  
  52.   
  53.             <key>method</key>  
  54.   
  55.      &nb
分享到:
评论

相关推荐

    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

    起点小说解锁.js

    起点小说解锁.js

    299-煤炭大数据智能分析解决方案.pptx

    299-煤炭大数据智能分析解决方案.pptx

    299-教育行业信息化与数据平台建设分享.pptx

    299-教育行业信息化与数据平台建设分享.pptx

    基于Springboot+Vue酒店客房入住管理系统-毕业源码案例设计.zip

    网络技术和计算机技术发展至今,已经拥有了深厚的理论基础,并在现实中进行了充分运用,尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代,所以对于信息的宣传和管理就很关键。系统化是必要的,设计网上系统不仅会节约人力和管理成本,还会安全保存庞大的数据量,对于信息的维护和检索也不需要花费很多时间,非常的便利。 网上系统是在MySQL中建立数据表保存信息,运用SpringBoot框架和Java语言编写。并按照软件设计开发流程进行设计实现。系统具备友好性且功能完善。 网上系统在让售信息规范化的同时,也能及时通过数据输入的有效性规则检测出错误数据,让数据的录入达到准确性的目的,进而提升数据的可靠性,让系统数据的错误率降至最低。 关键词:vue;MySQL;SpringBoot框架 【引流】 Java、Python、Node.js、Spring Boot、Django、Express、MySQL、PostgreSQL、MongoDB、React、Angular、Vue、Bootstrap、Material-UI、Redis、Docker、Kubernetes

    时间复杂度的一些相关资源

    时间复杂度是计算机科学中用来评估算法效率的一个重要指标。它表示了算法执行时间随输入数据规模增长而变化的趋势。当我们比较不同算法的时间复杂度时,实际上是在比较它们在不同输入规模下的执行效率。 时间复杂度通常用大O符号来表示,它描述了算法执行时间上限的增长率。例如,O(n)表示算法执行时间与输入数据规模n呈线性关系,而O(n^2)则表示算法执行时间与n的平方成正比。当n增大时,O(n^2)算法的执行时间会比O(n)算法增长得更快。 在比较时间复杂度时,我们主要关注复杂度的增长趋势,而不是具体的执行时间。这是因为不同计算机硬件、操作系统和编译器等因素都会影响算法的实际执行时间,而时间复杂度则提供了一个与具体实现无关的评估标准。 一般来说,时间复杂度越低,算法的执行效率就越高。因此,在设计和选择算法时,我们通常希望找到时间复杂度尽可能低的方案。例如,在排序算法中,冒泡排序的时间复杂度为O(n^2),而快速排序的时间复杂度在平均情况下为O(nlogn),因此在处理大规模数据时,快速排序通常比冒泡排序更高效。 总之,时间复杂度是评估算法效率的重要工具,它帮助我们了解算法在不同输入规模下的性

    安全承诺书-施工(单位版).docx

    5G通信行业、网络优化、通信工程建设资料

    基于Springboot+Vue人口老龄化社区服务与管理平台-毕业源码案例设计.zip

    网络技术和计算机技术发展至今,已经拥有了深厚的理论基础,并在现实中进行了充分运用,尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代,所以对于信息的宣传和管理就很关键。系统化是必要的,设计网上系统不仅会节约人力和管理成本,还会安全保存庞大的数据量,对于信息的维护和检索也不需要花费很多时间,非常的便利。 网上系统是在MySQL中建立数据表保存信息,运用SpringBoot框架和Java语言编写。并按照软件设计开发流程进行设计实现。系统具备友好性且功能完善。 网上系统在让售信息规范化的同时,也能及时通过数据输入的有效性规则检测出错误数据,让数据的录入达到准确性的目的,进而提升数据的可靠性,让系统数据的错误率降至最低。 关键词:vue;MySQL;SpringBoot框架 【引流】 Java、Python、Node.js、Spring Boot、Django、Express、MySQL、PostgreSQL、MongoDB、React、Angular、Vue、Bootstrap、Material-UI、Redis、Docker、Kubernetes

    node-v12.22.6-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提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    通信工程施工作业现场高危险源控制图集.docx

    5G通信行业、网络优化、通信工程建设资料

    毕设绝技《基于小程序的交友系统的设计与实现》

    《基于小程序的交友系统的设计与实现》是一个融合了小程序技术和社交功能的毕业设计项目。该项目旨在通过开发一款小程序,为用户提供一个便捷、有趣的交友平台,满足用户寻找新朋友、拓展社交圈的需求。 一、项目背景与目标 随着移动互联网的普及,小程序以其轻便、易用的特性受到了广大用户的喜爱。本项目旨在利用小程序技术开发一款交友系统,通过简洁明了的界面设计和丰富多样的社交功能,吸引用户参与并提升用户体验。通过实现这一系统,旨在帮助用户拓展社交圈,增进人际关系,并推动社交领域的创新与发展。 二、系统设计与功能实现 用户注册与登录:系统提供用户注册与登录功能,确保用户信息的真实性和安全性。用户可以通过手机号或第三方社交账号进行注册和登录。 个人资料展示:用户可以在个人资料页面展示自己的基本信息、兴趣爱好、照片等,以便其他用户了解并产生互动。 附近的人:系统通过定位功能展示附近的其他用户,用户可以浏览附近的人的信息,并主动发起聊天或交友请求。 聊天功能:系统提供一对一的聊天功能,用户可以与感兴趣的人进行实时交流,增进彼此的了解。 活动组织:用户可以发起或参与各类线下活动,如聚会、运动、旅行

    安全生产教育培训制度.doc

    5G通信行业、网络优化、通信工程建设资料

    shampoo-sales.csv

    shampoo-sales.csv

    59-《煤矿测量规程(1989版)》150.pdf

    59-《煤矿测量规程(1989版)》150.pdf

    node-v12.18.1-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-v12.22.3-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提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    项目代维费报价书.doc

    5G通信行业、网络优化、通信工程建设资料。

Global site tag (gtag.js) - Google Analytics