浅析Quartz的集群配置

article/2025/10/7 16:27:43

1、基本信息:

     Quartz是一个开源的作业调度框架,它完全由java写成,并设计用于J2Se和J2EE应用中。它提供了巨大的灵活性而不牺牲简单性。你能够用它来为执行一个作业而创建简单的或复杂的调度。它有很多特征,如:数据库支持,集群,插件,EJB作业预构建,JavaMail及其它,支持cron-like表达式等等。其中集群配置一般比较复杂,那么在Quartz中如何配置它的集群特性呢?

 

2 Quartz的集群配置:

     2.1 实现集群的基本原理

 

1、原理:     

          集群通过故障切换和负载平衡的功能,能给调度器带来高可用性和伸缩性。目前集群只能工作在JDBC-JobStore(JobStore TX或者JobStoreCMT)方式下,从本质上来说,是使集群上的每一个节点通过共享同一个数据库来工作的(Quartz通过启动两个维护线程来维护数据库状态实现集群管理,一个是检测节点状态线程,一个是恢复任务线程)。

        负载平衡是自动完成的,集群的每个节点会尽快触发任务。当一个触发器的触发时间到达时,第一个节点将会获得任务(通过锁定),成为执行任务的节点。

                故障切换的发生是在当一个节点正在执行一个或者多个任务失败的时候。当一个节点失败了,其他的节点会检测到并且标 识在失败节点上正在进行的数据库中的任务。任何被标记为可恢复(任务详细信息的"requests recovery"属性)的任务都会被其他的节点重新执行。没有标记可恢复的任务只会被释放出来,将会在下次相关触发器触发时执行。

     2、集群管理用到的表:

          --任务详细信息表

                         

    CREATE TABLE qrtz_job_details
    (
    JOB_NAME VARCHAR2(80) NOT NULL,
    JOB_GROUP VARCHAR2(80) NOT NULL,
    DESCRIPTION VARCHAR2(120) NULL,
    JOB_CLASS_NAME VARCHAR2(128) NOT NULL,
    IS_DURABLE VARCHAR2(1) NOT NULL,
    IS_VOLATILE VARCHAR2(1) NOT NULL,
    IS_STATEFUL VARCHAR2(1) NOT NULL,
    REQUESTS_RECOVERY VARCHAR2(1) NOT NULL, --可恢复标记
    JOB_DATA BLOB NULL,
    PRIMARY KEY (JOB_NAME,JOB_GROUP)
    );

 


          --触发器与任务关联表


                         

     CREATE TABLE qrtz_fired_triggers
    (
    ENTRY_ID VARCHAR2(95) NOT NULL,
    TRIGGER_NAME VARCHAR2(80) NOT NULL,
    TRIGGER_GROUP VARCHAR2(80) NOT NULL,
    IS_VOLATILE VARCHAR2(1) NOT NULL,
    INSTANCE_NAME VARCHAR2(80) NOT NULL,
    FIRED_TIME NUMBER(13) NOT NULL,
    STATE VARCHAR2(16) NOT NULL,
    JOB_NAME VARCHAR2(80) NULL,
    JOB_GROUP VARCHAR2(80) NULL,
    IS_STATEFUL VARCHAR2(1) NULL,
    REQUESTS_RECOVERY VARCHAR2(1) NULL, --可恢复标记
    PRIMARY KEY (ENTRY_ID)
    );

 

                  --调度器状态表


                         

     CREATE TABLE qrtz_scheduler_state
    (
    INSTANCE_NAME VARCHAR2(80) NOT NULL, --调度器实例ID
    LAST_CHECKIN_TIME NUMBER(13) NOT NULL, --上次检查时间
    CHECKIN_INTERVAL NUMBER(13) NOT NULL, --检查时间间隔
    RECOVERER VARCHAR2(80) NULL, --恢复调度器
    PRIMARY KEY (INSTANCE_NAME)
    );

 

          

 

     2.2 集群配置

        通过设置"org.quartz.jobStore.isClustered"属性为"true"来激活集群特性。在集群中的每一个实例都必须有一 个唯一的"instance id" ("org.quartz.scheduler.instanceId" 属性), 但是应该有相同的"scheduler instance name" ("org.quartz.scheduler.instanceName"),也就是说集群中的每一个实例都必须使用相同的 quartz.properties 配置文件。除了以下几种例外,配置文件的内容其他都必须相同:

 不同的线程池大小,
 不同的"org.quartz.scheduler.instanceId"属性值(这个可以很容易做到,设定为"AUTO"即可)。
 注意: 永远不要在不同的机器上运行集群,除非他们的时钟是使用某种形式的同步服务(守护)非常有规律的运行(时钟必须在一分一秒内)来达到同步。还有: 永远不要触发一个非集群的实例,如果其他的实例正在同一个数据库表上运行。你将使你的数据严重腐蚀,出现非预期行为。
 示例及详细配置说明,请参照附录Quartz配置文件说明。

 

3 附录

          3.1 Quartz配置文件说明

               3.1.1 Quartz配置文件基本说明

               3.1.2 Quartz配置文件详细说明

                    3.1.2.1  Scheduler主要属性的配置                       

    # Scheduler主要属性的一般定义模式如下:
    #
    # org.quartz.scheduler.instanceName = SCHED_NAME
    # org.quartz.scheduler.instanceId = INSTANCE_ID
    # org.quartz.scheduler.threadName = THREAD_NAME
    # org.quartz.scheduler.rmi.export = false
    # org.quartz.scheduler.rmi.proxy = false
    # org.quartz.scheduler.rmi.registryHost = localhost
    # org.quartz.scheduler.rmi.registryPort = 1099
    # org.quartz.scheduler.rmi.createRegistry = never
    # org.quartz.scheduler.userTransactionURL = USER_TX_LOCATION
    # org.quartz.scheduler.wrapJobExecutionInUserTransaction = JOBS_IN_USER_TX
    # org.quartz.scheduler.idleWaitTime = IDLE_WAIT_TIME
    # org.quartz.scheduler.dbFailureRetryInterval = DB_FAILURE_RETRY_INTERVAL
    # org.quartz.scheduler.classLoadHelper.class = CLASS_LOAD_HELPER_CLASS
    # org.quartz.context.key.SOME_KEY = SOME_VALUE

 3.1.2.2   线程池(ThreadPool)的配置


                        

    # 定制一个线程池的一般模式如下:
    #
    # org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
    # org.quartz.threadPool.threadCount = THREAD_COUNT
    # org.quartz.threadPool.threadPriority = THREAD_PRIO
    #
    # 简单线程池(SimpleThreadPool)的选项参数:
    #
    # org.quartz.threadPool.makeThreadsDaemons = DAEMON_THREADS
    # org.quartz.threadPool.threadsInheritGroupOfInitializingThread = INHERIT_GRP
    # org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = INHERIT_LDR
    #
    # or
    #
    # org.quartz.threadPool.class = com.mycompany.goo.FooThreadPool
    # org.quartz.threadPool.somePropOfFooThreadPool = someValue
    #

 

          

                     3.1.2.3 任务存储(JobStore)的配置

                        

    # 定义一个任务存储的一般模式如下:
    #
    # org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
    # org.quartz.jobStore.misfireThreshold = MISFIRE_THRESHOLD
    #
    # or
    #
    # org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.<JobStoreClass>
    # JobStoreClass 是下面其中的一个:
    # - JobStoreTX 用于单机(standalone-Quartz)实现
    # - JobStoreCMT 用于基于应用服务器容器管理事务(appserver-based container-managed transaction )的Quartz 实现
    #
    # org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.<DriverDelegateClass>
    # DriverDelegateClass 是下面其中的一个:
    # - StdJDBCDelegate (用于许多 JDBC-compliant drivers)
    # - MSSQLDelegate (用于 Microsoft SQL Server drivers)
    # - PostgreSQLDelegate (用于 PostgreSQL drivers)
    # - WebLogicDelegate (用于 WebLogic drivers)
    # - oracle.OracleDelegate (用于 Oracle drivers)
    #
    # org.quartz.jobStore.useProperties = USE_PROPERTIES
    # org.quartz.jobStore.dataSource = DS_NAME
    # org.quartz.jobStore.tablePrefix = TABLE_PREFIX
    # org.quartz.jobStore.isClustered = IS_CLUSTERED
    # org.quartz.jobStore.selectWithLockSQL = LOCKING_SELECT_STATEMENT
    # org.quartz.jobStore.dontSetAutoCommitFalse = DONT_TURN_OFF_AUTO_COMMIT
    # org.quartz.jobStore.maxMisfiresToHandleAtATime = MAX_MISFIRE_HANDLE
    # org.quartz.jobStore.txIsolationLevelSerializable = SERIALIZABLE_ISOLATION
    #
    # 如果你使用JobStoreCMT,你还需要下面的参数:
    #
    # org.quartz.jobStore.nonManagedTXDataSource = NON_MANAGED_TX_DS_NAME
    #
    # 并且如果你使用JobStoreCMT,下面的参数是可选的:
    #
    # org.quartz.jobStore.dontSetNonManagedTXConnectionAutoCommitFalse = DONT_TURN_OFF_AUTO_COMMIT
    # org.quartz.jobStore.txIsolationLevelReadCommitted = READ_COMMITTED_ISOLATION
    #
    #
    # 或者,使用一个用户自定义JobStore实现:
    #
    # org.quartz.jobStore.class = com.mycompany.goo.FooJobStore
    # org.quartz.jobStore.somePropOfFooJobStore = someValue
    #
    #

    

 3.1.2.4 数据源的配置  

                        

    # (只有当使用JDBCJobStore时需要, 或者一个插件需要JDBC)
    # -- 如果你的Scheduler非常忙碌,比如在一定的线程池内执行相同数目的任务,那么你应让数据源的连接数等于线程数 + 1
    #
    # 数据源定义的一般模式如下:
    #
    # org.quartz.dataSource.NAME.driver = DRIVER_CLASS_NAME
    # org.quartz.dataSource.NAME.URL = DB_URL
    # org.quartz.dataSource.NAME.user = DB_USER
    # org.quartz.dataSource.NAME.password = DB_PASSWORD
    # org.quartz.dataSource.NAME.maxConnections = DB_POOL_SIZE
    # org.quartz.dataSource.NAME.validationQuery= VALIDATION_QUERY
    #
    # or
    #
    # org.quartz.dataSource.NAME.jndiURL = DB_JNDI_URL
    #
    # or
    # org.quartz.dataSource.NAME.jndiURL = DB_JNDI_URL
    # org.quartz.dataSource.NAME.jndiAlwaysLookup = DB_JNDI_ALWAYS_LOOKUP
    # org.quartz.dataSource.NAME.java.naming.factory.initial = JNDI_CTXT_FACTORY
    # org.quartz.dataSource.NAME.java.naming.provider.url = JNDI_PROVIDER_URL
    # org.quartz.dataSource.NAME.java.naming.security.principal = JNDI_PRINCIPAL
    # org.quartz.dataSource.NAME.java.naming.security.credentials = JNDI_CREDENTIALS
    #
    #

 

      上面显示了两种数据源定义方式:一个数据源可以用给定的数据库连接信息创建,也可以是利用应用服务器管理生成的JNDI数据源的逻辑映射。 

 



            

 

                    3.1.2.5 Scheduler插件的配置

                        

    # SchedulerPlugin定义的一般模式如下:
    #
    # org.quartz.plugin.NAME.class = PLUGIN_CLASS_NAME
    #
    # 如果这个插件类有一些属性值需要通过"setter"方法设定, 名称和值的属性定义如下:
    #
    # org.quartz.plugin.NAME.propName = propValue
    #
    # ..."propName" 在插件类中会有一个"setPropName"方法.但是只支持原始数据类型(包括 Strings)。
    #

 

      配置插件的简单示例:    


                        

    org.quartz.plugin.triggHistory.class = org.quartz.plugins.history.LoggingTriggerHistoryPlugin
    org.quartz.plugin.triggHistory.triggerFiredMessage = Trigger {1}.{0} fired job {6}.{5} at: {4, date, HH:mm:ss MM/dd/yyyy}
    org.quartz.plugin.triggHistory.triggerCompleteMessage = Trigger {1}.{0} completed firing job {6}.{5} at {4, date, HH:mm:ss MM/dd/yyyy} with resulting trigger instruction code: {9}
    
    org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.JobInitializationPlugin
    org.quartz.plugin.jobInitializer.fileName = data/my_job_data.xml
    org.quartz.plugin.jobInitializer.overWriteExistingJobs = false
    org.quartz.plugin.jobInitializer.failOnFileNotFound = true
    
    org.quartz.plugin.shutdownhook.class = org.quartz.plugins.management.ShutdownHookPlugin
    org.quartz.plugin.shutdownhook.cleanShutdown = true

3.1.3 示例

 #============================================================
    # Configure Main Scheduler Properties
    #===========================================================
    
    org.quartz.scheduler.instanceName = MyClusteredScheduler
    org.quartz.scheduler.instanceId = AUTO
    
    #===========================================================
    # Configure ThreadPool
    #===========================================================
    
    org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
    org.quartz.threadPool.threadCount = 25
    org.quartz.threadPool.threadPriority = 5
    
    #===========================================================
    # Configure JobStore
    #===========================================================
    
    org.quartz.jobStore.misfireThreshold = 60000
    
    org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
    org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.oracle.OracleDelegate
    org.quartz.jobStore.useProperties = false
    org.quartz.jobStore.dataSource = myDS
    org.quartz.jobStore.tablePrefix = QRTZ_
    
    org.quartz.jobStore.isClustered = true
    org.quartz.jobStore.clusterCheckinInterval = 20000
    
    #===========================================================
    # Configure Datasources
    #===========================================================
    
    org.quartz.dataSource.myDS.driver = oracle.jdbc.driver.OracleDriver
    org.quartz.dataSource.myDS.URL = jdbc:oracle:thin:@cluster:1521:dev
    org.quartz.dataSource.myDS.user = quartz
    org.quartz.dataSource.myDS.password = quartz
    org.quartz.dataSource.myDS.maxConnections = 5
    org.quartz.dataSource.myDS.validationQuery=select 0 from dual
 

DROP TABLE IF EXISTS QRTZ_JOB_LISTENERS;
DROP TABLE IF EXISTS QRTZ_TRIGGER_LISTENERS;
DROP TABLE IF EXISTS QRTZ_FIRED_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_PAUSED_TRIGGER_GRPS;
DROP TABLE IF EXISTS QRTZ_SCHEDULER_STATE;
DROP TABLE IF EXISTS QRTZ_LOCKS;
DROP TABLE IF EXISTS QRTZ_SIMPLE_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_CRON_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_BLOB_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_JOB_DETAILS;
DROP TABLE IF EXISTS QRTZ_CALENDARS;CREATE TABLE QRTZ_JOB_DETAILS
(
JOB_NAME VARCHAR(200) NOT NULL,
JOB_GROUP VARCHAR(200) NOT NULL,
DESCRIPTION VARCHAR(250) NULL,
JOB_CLASS_NAME VARCHAR(250) NOT NULL,
IS_DURABLE VARCHAR(1) NOT NULL,
IS_VOLATILE VARCHAR(1) NOT NULL,
IS_STATEFUL VARCHAR(1) NOT NULL,
REQUESTS_RECOVERY VARCHAR(1) NOT NULL,
JOB_DATA BLOB NULL,
PRIMARY KEY (JOB_NAME,JOB_GROUP)
);CREATE TABLE QRTZ_JOB_LISTENERS
(
JOB_NAME VARCHAR(200) NOT NULL,
JOB_GROUP VARCHAR(200) NOT NULL,
JOB_LISTENER VARCHAR(200) NOT NULL,
PRIMARY KEY (JOB_NAME,JOB_GROUP,JOB_LISTENER),
FOREIGN KEY (JOB_NAME,JOB_GROUP)
REFERENCES QRTZ_JOB_DETAILS(JOB_NAME,JOB_GROUP)
);CREATE TABLE QRTZ_TRIGGERS
(
TRIGGER_NAME VARCHAR(200) NOT NULL,
TRIGGER_GROUP VARCHAR(200) NOT NULL,
JOB_NAME VARCHAR(200) NOT NULL,
JOB_GROUP VARCHAR(200) NOT NULL,
IS_VOLATILE VARCHAR(1) NOT NULL,
DESCRIPTION VARCHAR(250) NULL,
NEXT_FIRE_TIME BIGINT(13) NULL,
PREV_FIRE_TIME BIGINT(13) NULL,
PRIORITY INTEGER NULL,
TRIGGER_STATE VARCHAR(16) NOT NULL,
TRIGGER_TYPE VARCHAR(8) NOT NULL,
START_TIME BIGINT(13) NOT NULL,
END_TIME BIGINT(13) NULL,
CALENDAR_NAME VARCHAR(200) NULL,
MISFIRE_INSTR SMALLINT(2) NULL,
JOB_DATA BLOB NULL,
PRIMARY KEY (TRIGGER_NAME,TRIGGER_GROUP),
FOREIGN KEY (JOB_NAME,JOB_GROUP)
REFERENCES QRTZ_JOB_DETAILS(JOB_NAME,JOB_GROUP)
);CREATE TABLE QRTZ_SIMPLE_TRIGGERS
(
TRIGGER_NAME VARCHAR(200) NOT NULL,
TRIGGER_GROUP VARCHAR(200) NOT NULL,
REPEAT_COUNT BIGINT(7) NOT NULL,
REPEAT_INTERVAL BIGINT(12) NOT NULL,
TIMES_TRIGGERED BIGINT(7) NOT NULL,
PRIMARY KEY (TRIGGER_NAME,TRIGGER_GROUP),
FOREIGN KEY (TRIGGER_NAME,TRIGGER_GROUP)
REFERENCES QRTZ_TRIGGERS(TRIGGER_NAME,TRIGGER_GROUP)
);CREATE TABLE QRTZ_CRON_TRIGGERS
(
TRIGGER_NAME VARCHAR(200) NOT NULL,
TRIGGER_GROUP VARCHAR(200) NOT NULL,
CRON_EXPRESSION VARCHAR(200) NOT NULL,
TIME_ZONE_ID VARCHAR(80),
PRIMARY KEY (TRIGGER_NAME,TRIGGER_GROUP),
FOREIGN KEY (TRIGGER_NAME,TRIGGER_GROUP)
REFERENCES QRTZ_TRIGGERS(TRIGGER_NAME,TRIGGER_GROUP)
);CREATE TABLE QRTZ_BLOB_TRIGGERS
(
TRIGGER_NAME VARCHAR(200) NOT NULL,
TRIGGER_GROUP VARCHAR(200) NOT NULL,
BLOB_DATA BLOB NULL,
PRIMARY KEY (TRIGGER_NAME,TRIGGER_GROUP),
FOREIGN KEY (TRIGGER_NAME,TRIGGER_GROUP)
REFERENCES QRTZ_TRIGGERS(TRIGGER_NAME,TRIGGER_GROUP)
);CREATE TABLE QRTZ_TRIGGER_LISTENERS
(
TRIGGER_NAME VARCHAR(200) NOT NULL,
TRIGGER_GROUP VARCHAR(200) NOT NULL,
TRIGGER_LISTENER VARCHAR(200) NOT NULL,
PRIMARY KEY (TRIGGER_NAME,TRIGGER_GROUP,TRIGGER_LISTENER),
FOREIGN KEY (TRIGGER_NAME,TRIGGER_GROUP)
REFERENCES QRTZ_TRIGGERS(TRIGGER_NAME,TRIGGER_GROUP)
);CREATE TABLE QRTZ_CALENDARS
(
CALENDAR_NAME VARCHAR(200) NOT NULL,
CALENDAR BLOB NOT NULL,
PRIMARY KEY (CALENDAR_NAME)
);CREATE TABLE QRTZ_PAUSED_TRIGGER_GRPS
(
TRIGGER_GROUP VARCHAR(200) NOT NULL,
PRIMARY KEY (TRIGGER_GROUP)
);CREATE TABLE QRTZ_FIRED_TRIGGERS
(
ENTRY_ID VARCHAR(95) NOT NULL,
TRIGGER_NAME VARCHAR(200) NOT NULL,
TRIGGER_GROUP VARCHAR(200) NOT NULL,
IS_VOLATILE VARCHAR(1) NOT NULL,
INSTANCE_NAME VARCHAR(200) NOT NULL,
FIRED_TIME BIGINT(13) NOT NULL,
PRIORITY INTEGER NOT NULL,
STATE VARCHAR(16) NOT NULL,
JOB_NAME VARCHAR(200) NULL,
JOB_GROUP VARCHAR(200) NULL,
IS_STATEFUL VARCHAR(1) NULL,
REQUESTS_RECOVERY VARCHAR(1) NULL,
PRIMARY KEY (ENTRY_ID)
);CREATE TABLE QRTZ_SCHEDULER_STATE
(
INSTANCE_NAME VARCHAR(200) NOT NULL,
LAST_CHECKIN_TIME BIGINT(13) NOT NULL,
CHECKIN_INTERVAL BIGINT(13) NOT NULL,
PRIMARY KEY (INSTANCE_NAME)
);CREATE TABLE QRTZ_LOCKS
(
LOCK_NAME VARCHAR(40) NOT NULL,
PRIMARY KEY (LOCK_NAME)
);INSERT INTO QRTZ_LOCKS values('TRIGGER_ACCESS');
INSERT INTO QRTZ_LOCKS values('JOB_ACCESS');
INSERT INTO QRTZ_LOCKS values('CALENDAR_ACCESS');
INSERT INTO QRTZ_LOCKS values('STATE_ACCESS');
INSERT INTO QRTZ_LOCKS values('MISFIRE_ACCESS');commit; 

 

 

 


http://chatgpt.dhexx.cn/article/sG6Q9lfi.shtml

相关文章

SpringBoot2集成Quartz配置独立数据源

需求说明 Quartz配置需要部署独立的表结构&#xff0c;但是经常存于业务表之间&#xff0c;有些时候可能需要与业务表分开配置&#xff0c;所以在此给Quartz配置独立的数据源 一.版本介绍 Springboot版本为2.1.6 多数据源配置使用druid进行配置,数据库使用的为Oracle11g,如果使…

Quartz配置和运用详解

本文转自&#xff1a;http://topmanopensource.iteye.com/blog/1123824 最近工作需要学习quartz&#xff0c;那么必须首先了解三个概念&#xff1a; 调度器&#xff1a;负责调度作业和触发器&#xff1b; 触发器&#xff1a;设置作业执行的时间、参数、条件等&#xff1b;&…

Springboot——quartz简单配置和使用

文章目录 简单maven项目配置依赖配置编写处理类编写测试类 Springboot 项目配置依赖引入编写任务具体处理类编写配置类注意事项测试 简单maven项目配置 依赖配置 springboot项目中增加如下的quartz依赖信息&#xff1a; <!-- https://mvnrepository.com/artifact/org.qua…

Quartz配置文件quartz.properties加载

Quartz配置文件quartz.properties加载 前天&#xff0c;同事来问我&#xff0c;quatz任务调度的qurtaz.properties配置文件是如何加载的&#xff0c;项目是老大写的&#xff0c;我没看过代码&#xff0c;于是去翻了一遍源码&#xff0c;终于找到了配置的加载地方&#xff0c;让…

quartz mysql 配置_Quartz配置

1. Quartz主要配置 属性名称是否必选类型默认值说明 org.quartz.scheduler.instanceName 否 String QuartzScheduler Schedule调度器的实体名字 org.quartz.scheduler.instanceId 否 String NON_CLUSTERED Schedule调度器的实体的Id,必须唯一。 1. 当你想生成intanceId的时候可…

(AnyWhere-)安卓版“捷径”

下载 久闻酷安大名&#xff0c;下了酷安App&#xff0c;真是发现了新大陆。可以的&#xff0c;看上了AnyWhere-&#xff0c;下载试试 AnyWhere-下载地址 - 酷安 使用教程 一开始看的是这篇文章入坑的 真的不用羡慕iOS&#xff01;神奇APP“AnyWhere”让安卓也能玩“捷径” …

Anywhere,一个随启随用的静态服务器

现在用webpack也很少用到这种启动服务&#xff0c;偶尔做个小demo还是可以用用 Anywhere是一个随启随用的静态服务器&#xff0c;它可以随时随地将你的当前目录变成一个静态文件服务器的根目录。 一、首先得有node 如果没有的话&#xff0c;直接去官网下载安装包或者用brew …

Anywhere 随启随用的静态文件服务器

1.Anywhere 随启随用的静态文件服务器 ----利用nodeJs anywhere搭建本地服务器环境一&#xff1a;首先去nodeJs官网下载最新版nodeJs https://nodejs.org/en/ 安装成功后winr打开cmd 输入node -help 或者node -v查看是否安装成功 二&#xff1a;装好后输入 npm install anywhe…

快速搭建本地WebServer环境--anywhere

方式1. Nodejs anywhere 命令快速搭建 (需要nodejs环境) ● 安装anywhere包 npm install -g anywhere ● 在目录地址栏输入cmd, 打开命令提示符窗口, 输入命令 anywhere -p 8000 ● 将会自动在浏览器打开, 或者手动输入 本机ip:8000 打开 方式2. 使用 PhpStudy 软件 下载链…

如何连接到Sybase SQL Anywhere数据库

Sybase SQL Anywhere数据库具有许多非常有用的功能,与竞争对手相比,它具有很高的竞争力。首先,它允许您处理大量数据。其次,它具有很高的生产率,也就是说,可以快速提供大量数据。第三,它需要最少的管理。最后,它几乎完全自动化地集成到自定义应用程序中,不需要支持。 …

使用cors-anywhere-master 解决VUE+AXIOS跨域问题

在VUE框架中&#xff0c;用AXIOS加载微信文章&#xff0c;遇到跨域问题&#xff01; 解决方案&#xff1a; 1、去GITHUB下载 cors-anywhere-master GitHub - Rob--W/cors-anywhere: CORS Anywhere is a NodeJS reverse proxy which adds CORS headers to the proxied reques…

InstallAnywhere项目,安装开发解决方案

InstallAnywhere项目,安装开发解决方案 InstallAnywhere 是面向应用程序生产商的领先安装开发解决方案。它允许您为物理、虚拟和云环境提供一致、专业的多平台安装。您可以为本地平台(Windows、Linux、Apple、Solaris、AIX、HP-UX 和 IBM)创建可靠的安装。将现有的和新的软件产…

InstallAnywhere 2020 下载安装

InstallAnywhere 2020 InstallAnywhere 2020 提供专业且可靠的多平台安装 无论使用什么平台&#xff0c;InstallAnywhere均可使开发人员轻松创建性能相同的专业安装软件。 您将能够为Windows&#xff0c;Linux&#xff0c;Apple&#xff0c;Solaris&#xff0c;AIX&#xff0c…

Automation Anywhere视频教程

Automation Anywhere视频教程12 - 如何从CSV或文本命令读取数据1 https://www.bilibili.com/video/BV1DT4y1G7aK Automation Anywhere视频教程13 - 如何使用Excel命令&#xff08;详细信息&#xff09;1 https://www.bilibili.com/video/BV1of4y1U7Mv Automation Anywhere视频…

前端anywhere——前端应用启动服务

有时候我们在js里需要使用模块化&#xff0c;将项目打包后&#xff0c;用浏览器直接打开dist文件夹下的index.html会报错。 这个时候我们就可以安装一个 nodejs 的第三方模块&#xff1a;anywhere&#xff0c;以服务器方式打开项目。 全局安装 需要提前安装 nodejs npm inst…

nodejs服务器Anywhere使用

https://www.jianshu.com/p/3f0b7ea9df53 nodejs服务器Anywhere Anywhere是一个随启随用的静态服务器&#xff0c;它可以随时随地将你的当前目录变成一个静态文件服务器的根目录。 一&#xff0c;安装node 在nodejs官网下载&#xff0c;安装后打开cmd命令行&#xff0c;输入n…

InstallAnywhere 2022

InstallAnywhere 2022 增强的获取用户输入面板 - 高级- 在获取用户输入面板中添加了“如果必填字段为空则禁用下一步按钮”复选框选项&#xff0c;以启用/禁用通知未填写的必填字段的“下一步”按钮。 选中后&#xff0c;“获取用户输入”面板中的“下一步”按钮将被禁用&#…

pythonanywhere 如何创建虚拟环境?

本章教程介绍如何在pythonanywhere 上创建虚拟环境。 目录 1、打开控制台&#xff0c;指定python版本 2、填写你的虚拟环境路径 3、查看日志&#xff0c;安装依赖 1、打开控制台&#xff0c;指定python版本 mkvirtualenv myvirtualenv --python/usr/bin/python3.10 不指定-…

Anywhere:静态服务器的神器

Anywhere是一个静态服务器的神器&#xff0c;用它可以将dist文件放在本地跑&#xff0c;流程如下&#xff1a; 一&#xff1a;安装好了node&#xff0c;监测node安装是否成功 二&#xff1a;全局安装anywhere&#xff0c;npm install anywhere -g&#xff1b; 三、在打包好的的…

中文自动文本摘要生成指标计算,Rouge/Bleu/BertScore/QA代码实现

本部分讲述下如何计算生成摘要与参考摘要的指标&#xff0c;指标方面分为两类&#xff0c;一类基于n-grams计算&#xff0c;如Rouge-1&#xff0c;Rouge-2&#xff0c;Rouge-L&#xff0c;BLEU&#xff0c;主要衡量摘要的句法的连贯性&#xff0c;不能衡量生成摘要的真实性与忠…