开服表源码
‘壹’ 开私服 是不是要获取游戏的源代码
不仅要获取,而且还要修改代码。很麻烦的
‘贰’ 如果修改一下一个网页游戏的源码再开服,赚钱了算犯法吗多严重谢谢,,
这个问题 你问的比较简单 但并不是简单的问题
这里至少会涉及三个情况
你所谓的修改一下源码 这个源码是谁的 自己心里要有数
如果你修改的是官方原版程序,这就涉及盗取商业机密,然后才是影响运营平衡的问题
不要试图跟任何人说明,不是你拿来的...东西在你手里就算是第三者花钱买也是犯罪
如果你所修改的源码只是仿官方,但是基本一致,那首先担心的是盗版侵犯知识产权
对于你个人而言 有没有资质去运营商业游戏?有没有文化许可和相关专项备案手续
这些是基本的行为准则...无证经营甚至有经济利益或谋取暴利 都是法律不允许的
而且包括你是自己原创你的程序也没资质去商业运营.何况还是盗版的...
这个时代是网络时代...是比较容易获得金钱利益的工具时代
但是更多年轻人在这个时代迷失本性,毫无章程毫无准则,没分寸没原则
总是认为只要赚到钱就是自己的,越来越失去基本的做人做事应有的尺度把握
也造成了以后别人侵犯你的权益却无人为你辩护,失去良性的发展方向
切记一句.因果报应,你现在不顾别人,将来会有无数人弃你于不顾...
‘叁’ 网站源码怎么用
问题一:网站源码怎么使用 一般下载的网站源码,都有后台管理系统的。没必要在本地修改。
你直接去不复制上传到你的空间上去。进入后台添加文章类的管理。你想做动态的话要看你的源码支持不支持。
问题二:怎么用源码建立网站 源码建站的具体操作步骤:
申请虚拟主机(即空间)成功后,就会从官网得到ftp主机名、FTP用户名和FTP密码信息,该信息将是上传网站至内容的唯一凭证;
在网络中搜索“FTP”上传工具;
安装并运行“ftpzilla”程序,在程序主界面顶端输入虚拟主机相关信息,然后点击“快速连接”按钮;
此时进行与FTP服务器之间的通信工作,待连接成功后,就会显示“连接成功”的提示,同时在“远程”窗口乱笑中会显示远程FTP服务器目录结构及文件列表信息;
接下来根据FTP服务器存储网站文件的相关声明,进入远程FTP服务器“Public-html”目录,并将该目录下的所有文件删除;
在“本地站点”哗陵含窗口中,定位到网站源码所在的上传目录,选中所有待上传的文件,右击从弹出的右键菜单中选择“上传”项;
此时所有的网站源码文件将排队上传至远程服务器“Public-html”目录下,且可以在状态窗口中查看当前文件传输情况;
当文件上传完成后,整个上传网站源码至空间操作完成,当本地网站源码被更新后,为了第一时间实现远程服务器端数据的同步更新。
问题三:下载的网站源码怎么用 30分 网站源码到空间首目录。这样就可以使用了。(触:index.asp/php是首页文件)采纳给分
问题四:网站源码怎么用, 可以直接拿来修改使用,
源代码就是程序和软件的一切,
问题五:后台源码是什么啊?怎么用它做网站? 以下是我自己的理解,并不是什么标准答案!
一般企业里用的行业软件都有一台服务器有若干台客户机。每台客户机都可以分不同的权限去更新服务器上的内容,这是所谓的C/S的软件!而我刚才所说的成套的系统是指网站,也就是B/S的软件!C/S软件由客户端和服务器组成,B/S软件由浏览器和服务器组成!到这里应该就能明白B/S/C这些分别代表什么……browser(浏览器)/server(服务器)/client(客户端)。
网站就是B/S软件,而所谓的软件应该还具备一些管理功能,如更新,添加,删除等。后台源码,其实不应该叫后台源码,应该说是后台程序,这个后台程序就是实再整个网站的更新,添加,删除等常用的管理功能!但有一点不得不提一下,两个反义词,前/后。前台同样也具备了这些功能,与后台所不同的只是权限。如用户注册模块,新用户注册时其实是添加数据,注册完后修改资料这是修改数据……所以说前台也同样具备管理功能……
至于前台和后台具体的定义是什么我也不能很肯定的说,在我的理解当中后台只是面对的对象是管理员,前台面对的对象是所以网站的浏览者,但是有些网站就没有我所说的那种后台,或者说前后台根本就很难区分!
如果硬是要说前台跟后台的区别,我只能说,前台像硬件,看得见,后台像程序,是的,程序,而不是软件!因为软件还有界面,这个界面对于软件来说就是前台!
那么或者可以这么理解哗前对是面对客户的,后台是面对管理员的!
问题六:我自己有网站 请问下怎么用网站源码建网站 就是在后台怎么操作 谁有源码的网站给分享下 谢谢啦 可以将此模板加在dedecms上,这个需要修改一下html文件,将相关信息替换为dede的标签调用。具体操作可以网上搜一下dedecms添加模板和dedecms仿站教程。
问题七:怎么改网站源码里的图片 可以在源码里面的图片文件夹里找到对应图片直接替换,或找到源码里面找到图片位置直接修改数据调用路径。
网站源码里面有一个专门的文件夹是用来放图片的,网站里面用的图片基本上都是从这个文件夹调用。
替换的时候,请注意图片的属性要完全相同才能进行替换。
问题八:我在网上下载了一个html代码 我的网站怎么使用? 那把相对应的文件上传到你的空间里面,然后那个无标题文档是调用的部分,可以把订码拷贝出来,放到你想放置的页面底部就行了。
问题九:如何编写汪氏网站源码 HTML是最基本的,其次也需要javascript用于校验,css用于设置统一样式,PhotoShop也必不要少,你不可能永远都用网上down的图片吧,总得自己做个整体柜架模板,然后生成个html静态页面,再对其进行修改,刚开始你可以弄弄FrontPage,因为它跟Office一样简单,充分理解怎么用表格来定位,然后再用Dreamweaver,理解怎么用表格和层来定位,主要还是用表格定位,还有其它很多知识,像Fireworks和Flash都是起辅助作用的,以上说的都是静态页面,像动态就更多了,asp asp jsp php等技术至少会一样,推荐jsp,基于java语言,还有一些其它技术像servlet javabean ejb 柜架有struts j2ee hibernate等,不说那么多了,你先把静态弄明白吧!
来看一下HTML基本概念
1、标记
HTML用于描述功能的符号称为“标记”。如“HTML”、“BODY”、“TABLE”等。标记在使用是必须用方括号“”括起来,而且是成对出现,无斜杠的标记表示该标记的作用开始,有斜杠的标记表示该标记的作用结束。如表示一个表格的开始,表标一个表格的结束。在HTML中,标记的大小写作用相同,如和都是表示一个表格的开始。
标记可以包含标记,如:表格中包含表格或其它标记,如下面这样的HTML代码结构是正确的:
hjk
但是标记不能交叉嵌套,如下面这样的代码是错误的:
这是不正确的代码
2、特殊字符
由于方括号和英文双引号被用来提示HTML的标记及参数值,那么在网页中要显示方括号和英文引号只能用其它的符号来代替,下面是常见特殊字符所代表的正常字符:
或>对应字符 >
或――对应字符
à――对应字符 A
3、语法
一个标记,为了明确它的功能,往往用一些属性参数来描述......>>
问题十:网站源码怎么用phpstady 提供 php 某个源码下载地址,此处我们以thinkphp 框架为例
注意:通过其他途径下载,可能会因为文件不全,致使源码部署运行之后出现异常错误。所以推荐您使用我为您提供的软件和源码。
php 源码 thinkphp_3.2.3_full.zip下载之后,解压并改文件名为:thinkphp。
phpstudy.zip 下载之后,解压得到:phpStudy2014.exe,manual.chm,使用说明.txt 等文件,请双击打开解压到D:\phpstudy 即可,
完成之后,phpstudy会自动开启mysql,apache系统服务,此时可用360加速求查看正在运行的服务
双击打开桌面上的 phpstudy 图标,即可开启php运行环境。
如果 你的 apache mysql 显示红色按钮,那么表示没有启动成功,请点击 启动或者重启 按钮,直到全部绿色为止。如果一直启动不了。这是属于apache mysql系统服务器异常, 请尝试使用注册表清理软件清理之后,再重新解压phpstudy 软件。
完成以上步骤之后,phpstudy+php源码 基础情况已经OK,接下来 进行 部署代码 和 运行代码。
把前面的源码文件夹thinkphp 复制到D:\phpStudy\WWW 下
根据如下图。点击:My HomePage ,我们打开网站根目录和mysql数据库(点击:phpMyAdmin)。
欢迎使用 ThinkPHP!
版本 V3.2.3
那么表示 部署成功
之后,您可以通过修改 D:\phpStudy\WWW\thinkphp 目录下的 php文件代码,实现php程序 的运行。
7
【10】,如果您的程序是需要连接mysql数据库的,那么您必须创建相应的数据库。
(1)首先是登录
( 2 ) 接着是创建数据库
(3)一般的程序有安装程序,根据安装步骤,再数据库安装环节,填写下图中提到的用户名 密码 数据库名即可
‘肆’ 高分求免费的,php+mysql的,在线表格管理源码
开网店的话,下载个ECSHOP,不是简单很多吗。
‘伍’ 收全民奇迹奇迹源代码或一条龙架设开服,支持面交的来,价格好说,专业对付骗子,不服来试,诚心的朋友
加我球球:905724378 全民奇迹源码和其他游戏都有
‘陆’ 求系统编程的源代码下载网站,最好是简单点的,别太复杂
1、JDK (Java Development Kit)Java开发工具集
从初学者角度来看,采用JDK开发Java程序能够很快理解程序中各部分代码之间的关系,
有利于理解Java面向对象的设计思想。JDK的另一个显着特点是随着Java (J2EE、J2SE
以及J2ME)版本的升级而升级。但它的缺点也是非常明显的就是从事大规模企业级Java
应用开发非常困难,不能进行复杂的Java软件开发,也不利于团体协同开发。
2、Java Workshop
3、NetBeans 与Sun Java Studio 5
NetBeans是开放源码的Java集成开发环境(IDE),适用于各种客户机和Web应用。
Sun Java Studio是Sun公司最新发布的商用全功能Java IDE,支持Solaris、Linux和Win
dows平台,适于创建和部署2层Java Web应用和n层J2EE应用的企业开发人员使用。
NetBeans是业界第一款支持创新型Java开发的开放源码IDE。开发人员可以利用业界
强大的开发工具来构建桌面、Web或移动应用。同时,通过NetBeans和开放的API的模块
化结构,第三方能够非常轻松地扩展或集成NetBeans平台。
NetBeans3.5.1主要针对一般Java软件的开发者,而Java One Studio5则主要针对企
业做网络服务等应用的开发者。Sun不久还将推出Project Rave,其目标是帮助企业的开
发者进行软件开发。NetBeans 3.5.1版本与其他开发工具相比,最大区别在于不仅能够
开发各种台式机上的应用,而且可以用来开发网络服务方面的应用,可以开发基于J2ME
的移动设备上的应用等。在NetBeans 3.5.1基础上,Sun开发出了Java
One Studio5,为用户提供了一个更加先进的企业编程环境。在新的Java
One Studio5里有一个应用框架,开发者可以利用这些模块快速开发自己在网络服务方面
的各种应用程序。
4、Borland 的JBuilder
Jbuilder进入了Java集成开发环境的王国,它满足很多方面的应用,尤其是对于服
务器方以及EJB开发者们来说。下面简单介绍一下Jbuilder的特点:
1)Jbuilder支持最新的Java技术,包括Applets、JSP/Servlets、JavaBean以及EJB
(Enterprise JavaBeans)的应用。
2)用户可以自动地生成基于后端数据库表的EJB Java类,Jbuilder同时还简化了EJ
B的自动部署功能.此外它还支持CORBA,相应的向导程序有助于用户全面地管理IDL(分布
应用程序所必需的接口定义语言Interface Definition Language)和控制远程对象。
3)Jbuilder支持各种应用服务器。Jbuilder与Inprise Application Server紧密集
成,同时支持WebLogic Server,支持EJB 1.1和EJB 2.0,可以快速开发J2EE的电子商务
应用。
4)Jbuilder能用Servlet和JSP开发和调试动态Web 应用。
5)利用Jbuilder可创建(没有专有代码和标记)纯Java2应用。由于Jbuilder是用纯J
ava语言编写的,其代码不含任何专属代码和标记,它支持最新的Java标准。
6)Jbuilder拥有专业化的图形调试接口,支持远程调试和多线程调试,调试器支持
各种JDK版本,包括J2ME/J2SE/J2EE。
JBuilder环境开发程序方便,它是纯的Java 开发环境,适合企业的J2EE开发;缺点
是往往一开始人们难于把握整个程序各部分之间的关系,对机器的硬件要求较高,比较
吃内存,这时运行速度显得较慢。
5、Oracle 的JDeveloper
Oracle9i JDeveloper(定为9.0版,最新为10g)为构建具有J2EE功能,XML和Web
services的复杂的,多层的Java应用程序提供了一个完全集成的开发环境。它为运用Ora
cle9i数据库和应用服务器的开发人员提供特殊的功能和增强性能,除此以外,它也有资
格成为用于多种用途Java开发的一个强大的工具。
Oracle9i JDeveloper的主要特点如下:
① 具有UML(Unified Modeling Language,一体化建模语言)建模功能。可以将业
务对象及e-business应用模型化。
② 配备有高速Java调试器(Debuger)、内置Profiling工具、提高代码质量的工具
“CodeCoach”等。
③ 支持SOAP(Simple Object Access Protocol)“简单对象访问协议”、UDDI(U
niversal Description, Discovery and Integration)“统一描述、发现和集成协议”
、WSDL(Web Services Description Language)“WEB服务描述语言”等Web服务标准。
JDeveloper 不仅仅是很好的 Java 编程工具,而且是 Oracle Web 服务的延伸,支
持 Apache SOAP,以及 9iAS ,可扩充的环境和 XML 和 WSDL 语言紧密相关。Oracle9i
Jdeveloper完全利用Java编写,能够与以前的Oracle服务器软件以及其他厂商支持J2EE
的应用服务器产品相兼容,而且在设计时着重针对Oracle9i,能够无缝化跨平台之间的
应用开发,提供了业界第一个完整的、集成了J2EE和XML的开发环境,允许开发者快速开
发可以通过Web、无线设备及语音界面访问的Web服务和交易应用,以往只能通过将传统J
ava编程技巧与最新模块化方式结合到一个单一集成的开发环境中之后才能完成J2EE应用
开发生命周期管理的事实,从根本上得到改变。缺点就是对于初学者来说,较复杂,也
比较难。
6、IBM的Visual Age for Java
Visual Age for Java是一个非常成熟的开发工具,它的特性以于IT开发者和业余的
Java编程人员来说都是非常用有用的。它提供对可视化编程的广泛支持,支持利用CICS
连接遗传大型机应用,支持EJB的开发应用,支持与Websphere的集成开发,方便的bean
创建和良好的快速应用开发(RAD)支持和无文件式的文件处理。
IBM为建设Web站点所推出的WebSphere Studio Advanced Edition及其包含的Visual
Age for Java Professional Edition软件已全面转向以Java为中心,这样,Java开发人
员对WebSphere全套工具的感觉或许会好了许多。Studio所提供的工具有:Web站点管理
、快速开发 JDBC页向导程序、HTML编辑器和HTML语法检查等。这确实是个不错的HTML站
点页面编辑环境。Studio和VisualAge集成度很高,菜单中提供了在两种软件包之间快速
移动代码的选项。这就让使用Studio的Web页面设计人员和使用VisualAge的Java程序员
可以相互交换文件、协同工作。
Visual Age for Java支持团队开发,内置的代码库可以自动地根据用户做出改动而
修改程序代码,这样就可以很方便地将目前代码和早期版本做出比较。与Visual Age紧
密结合的Websphere Studio本身并不提供源代码和版本管理的支持,它只是包含了一个
内置文件锁定系统,当编辑项目的时候可以防止其他人对这些文件的错误修改,软件还支
持诸如Microsoft Visual SourceSafe这样的第三方源代码控制系统。Visual Age for
Java完全面向对象的程序设计思想使得开发程序非常快速、高效。你可以不编写任何代
码就可以设计出一个典型的应用程序框架。Visual Age for Java作为IBM电子商务解决
方案其中产品之一,可以无缝地与其他IBM产品,如WebSphere、DB2融合, 迅速完成从设
计、开发到部署应用的整个过程。
Visual Age for Java独特的管理文件方式使其集成外部工具非常困难,你无法让Vis
ual Age for Java与其他工具一起联合开发应用。
7、BEA 的 WebLogic Workshop
BEA WebLogic Workshop是一个统一、简化、可扩展的开发环境,使所有的开发人员
都能在 BEA WebLogic Enterprise Platform之上构建基于标准的企业级应用,从而提高
了开发部门的生产力水平,加快了价值的实现。
WebLogic Workshop除了提供便捷的Web服务之外,它能够用于创建更多种类的应用
。作为整个BEA WebLogic Platform的开发环境。不管是创建门户应用、编写工作流、还
是创建Web应用,Workshop 8.1都可以帮助开发人员更快更好地完成。
WebLogic Workshop的主要特点如下:
① 使 J2EE 开发切实可行,提高开发效率
BEA WebLogic Workshop 使开发人员远离 J2EE 内在的复杂性,集中精力专注业务
逻辑,无须操心单调乏味的基础结构代码。这种创新意味着,已被企业验证的 J2EE 的
强大功能,最终被大多数不熟悉 Java 和 J2EE 的应用开发人员所掌握,从而使 IT 部
门的工作效率提高一个数量级。
可视化设计器以及直观的概念,如事件、属性和控件等,实现了基于事件的开发。W
orkshop 简化的程序设计模型,使开发人员不必掌握复杂的 J2EE API 和面向对象的程
序设计原理。所有开发人员,包括 J2EE 专家和具有可视化和过程化语言技能的应用开
发人员在内,都可以共同工作在 BEA WebLogic Enterprise Platform 之上。Workshop
的可视化开发环境,创建带有代码注释的标准 Java 文件,用来说明由运行时框架实施
的企业级需求。J2EE 和其他高级开发人员,借助功能强大的代码编辑功能,可以访问
Java 源代码,从而弥补了可视化设计器的不足。
② 构建企业级应用
通过在可伸缩、安全可靠的企业级架构上实施各种应用,BEA WebLogic
Workshop 大大降低了开发风险。而且,所有应用的创建都使用标准的 J2EE 组件,既保
护了您的技术投资,又保持了最大的灵活性。
BEA WebLogic Workshop 运行框架,是统一整个架构的汇聚层,使单一、简化的程序设
计模型扩展到所有的 BEA WebLogic Enterprise Platform 应用类型。通过解释设计时
创建的注释代码,运行时框架可以实现必要的 J2EE 组件,并且提取出与 J2EE 应用开
发有关的所有底层细节。
③ 降低 IT 复杂性
BEA WebLogic Workshop 提供各种 Java 控件,使得与 IT 资源的连接更轻而易举
。另外,在构建任何 BEA WebLogic Platform 的应用中,Java 控件不仅可扩展而且完
全相同。这种强大、有效的方法能够:降低 IT 技术的复杂性,优化信息的可用性,推
动包含"最佳业务方案"的可重用服务的开发,使开发人员能以更低的成本、更短的时间
实现更大的产出。
利用 BEA WebLogic Workshop,任何开发人员都能以最大的生产效率,构建各种
Web 服务、Web 应用、门户和集成项目。BEA WebLogic Workshop是BEA的产品战略核心
,它帮助客户接触和利用面向服务架构(SOA)的强大功能。BEA Weblogic Workshop
8.1极大简化了当前实际企业集成环境中企业级应用和服务的构建,并成为全面支持关键
企业级应用(如异步、真正松耦合和粗粒度消息传送等)的自然选择。它的缺点就是过于
复杂,对于初学者来说,理解起来较为困难。
8、WebGain 的Visual Cafe for Java
Visual Cafe 是只能在Symantec公司的Java虚拟机、Netscape公司的Java虚拟机和M
icrosoft虚拟机上工作的调试器。这对于开发者来讲是一个重要的特性,因为用户开发的
Java代码中的许多软件bug就可能中会在某种特定的虚拟机上起作用。
在修改后进行编译基继续进行调试时,Visual Cafe会自动将文件存盘,使用Visual
Cafe创建的原生应用具有许多特点。除了明显的速度提高之外,Symantec使类库的二进制
方式比正常的JDK小Visual Cafe为所指定的关系自动生成或更新必要的Java代码。利用V
isual Cafe,用户可以从一个标准对象数据库中集合完整的Java应用程序和Applet,而
不必再编写源代码。Visual Cafe还提供了一个扩充的源代码开发工具集。
Visual Cafe综合了Java软件的可视化源程序开发工具,它允许开发人员在可视化视
图和源视图之间进行有效地转换。在可视化视图中进行的修改立即反映在源代码中。对
源代码的改变自动更新可视化视图。
Visual Cafe具有许多源文件方面的特性,如全局检索和替换。绝大多数Java开发工
具的文献的问题在于简单地挨个介绍开发工具的每部分组件,但用户在开应用时还需要
一个面向任务的手册,利用这个手册你可以不必知道工具每一部分的特定功能就可以开
始创建自己的应用。Visual Cafe提供了非常全面的用户指南,它对最开始的安装到创建
第一个Java应用和Applet都提供了全面的帮助,Visual Cafe将自动生成所指明关系的必
要Java代码。Visual Cafe可以在Windows 95和Windows NT平台下运行,Symantec公司为
Java开发工作提供一个在Macintosh操作系统下可以运行的RAD工具。Visual Cafe编译器
速度很快,在国际化支持方面比较突出;缺点就是对于初学者来说,较复杂,也比较难
。
9、Macromedia的JRUN
Macromedia公司的JRun是一个具有最广阔适用性的Java引擎,用于开发及实施由Jav
a Servlets和JavaServer Pages编写的服务器端Java应用。JRun是第一个完全支持JSP
1.0 规格书的商业化产品,全球有超过80,000名开发人员使用JRun在他们已有的Web服务
器上添加服务器端Java的功能。其中Web服务器包括了Microsoft IIS,Netscape
Enterprise Server,Apache等。
JRun是开发实施服务器端Java的先进引擎。如果我们希望在我们的Web应用中添加服
务器端Java功能,那么JRun将成为我们的正确选择。
JRun目前有3个版本,它是第一个支持Java Server Pages(JSP)规格书1.0的商业化
产品。JSP是一种强大的服务器端技术,它是用于创建复杂Web应用的一整套快速应用开
发系统。JRun可以使我们开始开发并测试Java应用。它最多接受5个并发的连接并且包括
全部Java Servlet API,支持JavaServer Pages(JSP),支持所有主要的Web
servers和计算机平台。 JRun Pro能够在生产环境下承受大访问量的负载,帮助我们实
施应用、服务或Web站点(包括内联网)。JRun Pro 支持无限量并发式连接运行多个Jav
a虚拟机,包括多个并发的Java虚拟机(JVM)。提供一个远程管理applet以及一个远程
可再分布式的管理applet。JRun Pro Unlimited包括了所有JRun Pro的功能,除次以外
,还可以运行无限量的,并发的JVM。
JRun依靠其内置的JRun Web Server可以单独运行。使用服务器端Java,用户可以开
发出复杂的商业应用系统。最重要的一点是,由于servlets的平台独立性,以及更加简
单的开发、更快速的实施、更经济的维护成本,它是CGI(Common Gateway
Interface)或Perl scripts的极佳的替代产品。缺点就是对于初学者来说,较复杂,也
比较难。
10、JCreator
JCreator 是一个Java程序开发工具,也是一个Java集成开发环境(IDE)。无论你
是要开发Java应用程序或者网页上的Applet元件都难不倒它。在功能上与Sun公司所公布
的JDK等文字模式开发工具相较之下来得容易,还允许使用者自订义操作窗口界面及无限
Undo/Redo等功能。
JCreator为用户提供了相当强大的功能,例如项目管理功能,项目模板功能,可个
性化设置语法高亮属性、行数、类浏览器、标签文档、多功能编绎器,向导功能以及完
全可自定义的用户界面。通过JCreator,我们不用激活主文档而直接编绎或运行我们的J
AVA程序。
JCreator能自动找到包含主函数的文件或包含Applet的Html文件,然后它会运行适
当的工具。在JCreator中,我们可以通过一个批处理同时编绎多个项目。JCreator的设
计接近Windows界面风格,用户对它的界面比较熟悉。其最大特点是与我们机器中所装的
JDK完美结合,是其它任何一款IDE所不能比拟的。它是一种初学者很容易上手的java开
发工具,缺点是只能进行简单的程序开发,不能进行企业J2EE的开发应用。
11、Microsoft VJ++
Visual J++ 是Microsoft 公司推出的可视化的Java 语言集成开发环境(IDE),为Ja
va 编程人员提供了一个新的开发环境,是一个相当出色的开发工具。无论集成性、编译
速度、调试功能、还是易学易用性,都体现了Microsoft 的一惯风格。Visual J++ 具有
下面的特点:
1)Visual J++ 把Java 虚拟机(JVM)作为独立的操作系统组件放入Windows,使之从
浏览器中独立出来。
2)Microsoft 的应用基本类库(AFC,Application Foundation Class Library)对SU
N 公司的JDK 作了扩展,使应用基本类库更加适合在Windows 下使用。
3) Visual J++ 的调试器支持动态调试,包括单步执行、设置断点、观察变量数值
等。
4) Visual J++ 提供了一些程序向导(Wizards)和生成器(Builders),它们可以方
便地帮助用户快速地生成Java 程序,帮助你在自己的工程中创建和修改文件。
5) Visual J++ 界面友好,其代码编辑器具有智能感知、联机编译等功能,使程序
编写十分方便。Visual J++ 中建立了Java 的WFC,这一新的应用程序框架能够直接访问
Windows 应用程序接口(API),使你能够用Java 语言编写完全意义上的Windows 应用程
序。
6)Visual J++ 中表单设计器的快速应用开发特性使用WFC 创建基于表单的应用程
序变得轻松、简单。通过WFC 可以方便地使用ActiveX 数据对象(ADO,ActiveX Data
Objects)来检索数据和执行简单数据的绑定。通过在表单设计器中使用ActiveX 数据对
象,可以快速地在表单中访问和显示数据。
Visual J++能结合微软的一贯的编程风格,很方便进行Java 的应用开发,但它的移
植性较差,不是纯的Java 开发环境。
12、Eclipse
Eclipse是一种可扩展的开放源代码IDE。2001年11月,IBM公司捐出价值4,000万美
元的源代码组建了Eclipse联盟,并由该联盟负责这种工具的后续开发。集成开发环境(I
DE)经常将其应用范围限定在“开发、构建和调试”的周期之中。为了帮助集成开发环境
(IDE)克服目前的局限性,业界厂商合作创建了Eclipse平台。Eclipse允许在同一IDE中
集成来自不同供应商的工具,并实现了工具之间的互操作性,从而显着改变了项目工作
流程,使开发者可以专注在实际的嵌入式目标上。
Eclipse框架的这种灵活性来源于其扩展点。它们是在XML中定义的已知接口,并充
当插件的耦合点。扩展点的范围包括从用在常规表述过滤器中的简单字符串,到一个Jav
a类的描述。任何Eclipse插件定义的扩展点都能够被其它插件使用,反之,任何Eclipse
插件也可以遵从其它插件定义的扩展点。除了解由扩展点定义的接口外,插件不知道它
们通过扩展点提供的服务将如何被使用。
利用Eclipse,我们可以将高级设计(也许是采用UML)与低级开发工具(如应用调试器
等)结合在一起。如果这些互相补充的独立工具采用Eclipse扩展点彼此连接,那么当我
们用调试器逐一检查应用时,UML对话框可以突出显示我们正在关注的器件。事实上,由
于Eclipse并不了解开发语言,所以无论Java语言调试器、C/C++调试器还是汇编调试器
都是有效的,并可以在相同的框架内同时瞄准不同的进程或节点。
Eclipse的最大特点是它能接受由Java开发者自己编写的开放源代码插件,这类似于
微软公司的Visual Studio和Sun微系统公司的NetBeans平台。Eclipse为工具开发商提供
了更好的灵活性,使他们能更好地控制自己的软件技术。Eclipse联盟已经宣布将在2004
年中期发布其3.0版软件。这是一款非常受欢迎的java开发工具,这国内的用户越来越多
,实际上实用它java开发人员是最多的。缺点就是较复杂,对初学者来说,理解起来比
较困难。
13、Ant
Another Neat Tool(Ant)是一种基于Java的build工具。理论上来说,它有些类似于
(Unix)C中的make ,但没有make的缺陷。因为Ant的原作者在多种(硬件)平台上开发软
件时,无法忍受这些工具的限制和不便。类似于make的工具本质上是基于shell(语言)
的:他们计算依赖关系,然后执行命令(这些命令与你在命令行敲的命令没太大区别)
。这就意味着你可以很容易地通过使用OS特有的或编写新的(命令)程序扩展该工具;
然而,这也意味着你将自己限制在了特定的OS,或特定的OS类型上,如Unix。Ant就不同
了。与基于shell命令的扩展模式不同,Ant用Java的类来扩展。(用户)不必编写shell
命令,配置文件是基于XML的,通过调用target树,就可执行各种task。每个task由实现
了一个实现了特定Task接口的对象来运行。
Ant支持一些可选task,一个可选task一般需要额外的库才能工作。可选task与Ant
的内置task分开,单独打包。这个可选包可以从你下载Ant的同一个地方下载。ANT本身
就是这样一个流程脚本引擎,用于自动化调用程序完成项目的编译,打包,测试等。除
了基于JAVA是平台无关的外,脚本的格式是基于XML的,比make脚本来说还要好维护一些
。Ant是Apache提供给Java开发人员的构建工具,它可以在Windows OS和Unix OS下运行
,它不仅开放源码并且还是一个非常好用的工具。Ant是Apache Jakarta中一个很好用的
Java开发工具,Ant配置文件采用XML文档编写,所以Java程序员对其语法相当熟悉,Ant
是专用于Java项目平台,能够用纯Java来开发,它能够运行于Java安装的平台,即体现
了它的跨平台功能。它的缺点显示执行结果只能是DOS字符界面,不能进行复杂的java程
序开发。
14、IntelliJ
Intellij IDEA是一款综合的Java 编程环境,被许多开发人员和行业专家誉为市场
上最好的IDE。它提供了一系列最实用的的工具组合:智能编码辅助和自动控制,支持J2
EE,Ant,JUnit和CVS集成,非平行的编码检查和创新的GUI设计器。IDEA把Java开发人
员从一些耗时的常规工作中解放出来,显着地提高了开发效率。具有运行更快速,生成
更好的代码;持续的重新设计和日常编码变得更加简易,与其它工具的完美集成;很高
的性价比等特点。在4.0版本中支持Generics,BEA WebLogic集成,改良的CVS集成以及G
UI设计器。
IntelliJ IDEA能尽可能地促进程序员的编程速度。它包括了很多辅助的功能,并且
与Java结合得相当好。不同的工具窗口围绕在主编程窗口周围,当鼠标点到时即可打开
,无用时也可轻松关闭,使用户得到了最大化的有效屏幕范围。以技术为导向的IDEA集
成了调试器,支持本地和远程的调试,即使我们需要修改一些设置上的东西使我们的工
作顺利进展。另外,它还提供了通常的监视,分步调试以及手动设置断点功能,在这种
断点模式下,我们可以自动地在断点之外设置现场访问,甚至可以浏览不同的变量的值
。IDE支持多重的JVM设置,几个编译程序和Ant建造系统,并且,它使得设置多重的自定
义的类途径变得简单。
IntelliJ Idea是一个相对较新的Java IDE。它是Java开发环境中最为有用的一个。
高度优化的IntelleJ Idea使普通任务变得相当容易,Idea支持很多整合功能,更重要的
使它们设计的好容易使用。Idea支持XML中的代码实现,Idea同时还会校正XML,Idea支
持JSP的结构。作用于普通Java代码的众多功能同样适用于JSP(比如整合功能),同时
支持JSP调试;支持EJB,尽管它不包括对个别应用服务器的特殊支持。Idea支持Ant建立
工具,不仅是运行目标它还支持编译与运行程序前后运行目标,另外也支持绑定键盘快
捷键。在编辑一个Ant建立XML文件时,Idea还对组成Ant工程的XML部分提供支持。Intel
liJ IDEA 被称为是最好的JAVA IDE开发平台,这套软件就是以其聪明的即时分析和方便
的 refactoring 功能深获大家所喜爱。缺点是较复杂,对初学者来说,理解起来比较困
难。
小结
现在常用的Java项目开发环境有:JBuilder、VisualAge for Java、Forte for
Java, Visual Cafe、Eclipse、NetBeans IDE、JCreator +J2SDK、jdk+记事本、EditPl
us+ J2SDK等等。一般开发J2EE项目时都需要安装各公司的应用服务器(中间件)和相应
的开发工具,在使用这些开发工具之前,我们最好能熟知这些软件的优点和缺点,以便
根据实际情况选择应用。编程工具只是工具,为了方便人们工作而开发的,各有特点,
因此,选工具主要的依据自己将要从事的领域是什么,而不是盲目的认为那种工具好,
那种工具不好。最后希望大家都能找到自己合适的java 开发工具
‘柒’ XXL admin 源码解析
xxl-job 的 admin 服务是 xxl-job 的调度中心,负责管理和调度注册的 job,关于 xxl-job 的使用,可以阅读 “参考阅读” 中的《XXL-JOB分布式调度框架全面详解》,这里主要是介绍 admin 中的源码。
admin 服务除了管理页面上的一些接口外,还有一些核心功能,比如:
1、根据 job 的配置,自动调度 job;
2、接收 executor 实例的请求,实现注册和下线;
3、监视失败的 job,进行重试;
4、结束一些异常的 job;
5、清理和统计日志;
这些功能都是在 admin 服务启动后,在后台自动运行的,下面将详细介绍 admin 服务这些功能敏罩的实现。
XxlJobAdminConfig 是 admin 服务的配置类,在 admin 服务启动时,它除了配置 admin 服务的一些参数外,还会启动 admin 服务的所有后台线程。
该类的属性主要分为5类:
1、配置文件中的参数,比如 accessToken;
2、DAO 层各个数据表的 mapper;
3、Spring 容器中的一些 Bean,比如 JobAlarmer、DataSource 等;
4、私有变量 XxlJobScheler 对象;
5、私有静态变量 adminConfig,指向实例自身。
该类有两个重要方法,分别实现自接口 InitializingBean、DisposableBean,作用如下:
这两个方法分别调用了 XxlJobScheler 对象的 init 、 destroy 方法,源码如下:
XxlJobAdminConfig 作为 admin 服务的配置类,作用就是在 Spring 容器启动时,调用 XxlJobScheler 的初始化方法,来初始化和启动 admin 服务的功能。
XxlJobScheler 的作用就是调用各个辅助类(xxxHelper)来启动和结束不同的线程和功能,初始化方法 init 的代码如下:
下面我们主要介绍 init 中各个类及其作用,最后再简单一下介绍 destroy 的作用纤拿森。
当 admin 服务向 executor 实例发出一个调度请求来执行 job 时,会调用 XxlJobTrigger.trigger() 方法把要传输的参数(比如 job_id、jobHandler、job_log_id、阻塞策略等,包装成 TriggerParam 对象)传给 ExecutorBiz 对象来执行一次调度。
xxl-job 对调度过程做了两个优化:
JobTriggerPoolHelper 在 toStart 方法中初始化了它的两个线程池属性,代码如下:
每次有调度请求时,就会在这两个线程池中创建线程,创建线程的逻辑在 addTrigger 方法中。
不同 job 存在执行时长的差异,为了避免不同耗时 job 之间相互阻塞,xxl-job 根据 job 的响应时间,对 job 进行了区分,主要体现在:
如果快 job 与调用频繁的慢 job 在同一个线程池中创建线程,慢 job 会占用大量的线程,导致快 job 线程不能及时运行,降低了线程池和线程的利用率。xxl-job 通过快慢隔离,避免了这个问题。
不能,因为慢 job 还是会占用大量线程,抢占了快 job 的线程资源;增加线程池中的线程数不但没有提升利用率,还会导致大量线程看空闲,利用率反而降低了。最好的方法还是用两个线程池把两者隔离,可以合理地使用各自线程池的资源。
为了记录慢 job 的超时次毁亩数,代码中使用一个 map(变量 jobTimeoutCountMap )来记录一分钟内 job 超时次数,key 值是 job_id,value 是超时次数。在调用 XxlJobTrigger.trigger() 方法之前,会先判断 map 中,该 job_id 的超时次数是否大于 10,如果大于10,就是使用 slowTriggerPool,代码如下:
调用 XxlJobTrigger.trigger() 方法后,根据两个值来更新 jobTimeoutCountMap 的值:
和上面的代码相结合,一个 job 在一分钟内有10次调用超过 500 毫秒,就认为该 job 是一个 频繁调度且耗时的 job。
代码如下:
在该类中,属性变量 minTim 和 jobTimeoutCountMap 都使用 volatile 来修饰,保证了并发调用 addTrigger 时数据的一致性和可见性。
admin 服务发起 job 调度请求时,是在静态方法 public static void trigger() 中调用静态变量 private static JobTriggerPoolHelper helper 的 addTrigger 方法来发起请求的。minTim 和 jobTimeoutCountMap 虽然不是 static 修饰的,但可以看做是全局唯一的(因为持有它们的对象是全局唯一的),因此这两个参数维护的是 admin 服务全局的调度时间和超时次数,为了避免记录的数据量过大,需要每分钟清空一次数据的操作。
admin 服务提供了接口给 executor 来注册和下线,另外,当 executor 长时间(90秒)没有发心跳时,要把 executor 自动下线。前一个功能通过暴露一个接口来接收请求,后一个功能需要开启一个线程,定时更新过期 executor 的状态。
xxl-job 为了提升 admin 服务的性能,在前一个功能的接口接收到 executor 的请求时,不是同步执行,而是在线程池中开启一个线程,异步执行 executor 的注册和下线请求。
JobRegistryHelper 类就负责管理这个线程池和定时线程的。
线程池的定义和初始化代码如下:
executor 实例在发起注册和下线请求时,会调用 AdminBizImpl 类的对应方法,该类的方法如下:
可以看到,AdminBizImpl 类的两个方法都是调用了 JobRegistryHelper 方法来实现,其中 JobRegistryHelper.registry 方法代码如下(registryRemove 代码与之相似):
这两个方法是通过在线程池 registryOrRemoveThreadPool 中创建线程来异步执行请求,然后把数据更新或新建到数据表 xxl_job_registry 中。
当 executor 注册到 admin 服务后(数据入库到 xxl_job_registry 表),是不会在页面上显示的,需要要用户手动添加 job_group 数据(添加到 xxl_job_group 表),admin 服务会自动把用户添加的 job_group 数据与 xxl_job_registry 数据关联。这就需要 admin 定时从 xxl_job_group 表读取数据,关联 xxl_job_registry 表和 xxl_job_group 表的数据。
这个功能是与 “executor 自动下线” 功能在同一个线程中实现,该线程的主要逻辑是:
相关代码如下:
从这里可以看出,如果是对外接口(接收请求等)的功能,使用线程池和异步线程来实现;如果是一些自动任务,则是通过一个线程来定时执行。
如果一个 Job 调度后,没有响应返回,需要定时重试。作为一种“自动执行”的任务,很显然可以像前面 JobRegistryHelper 一样,使用一个线程定时重试。
在这个类中,定义了一个监视线程,以每10 秒一次的频率运行,对失败的 job 进行重试。如果 job 剩余的重试次数大于0,就会 job 进行重试,并把发送告警信息。线程的定义如下:
在这个线程中,它利用 “数据库执行 UPDATE 语句时会加上互斥锁” 的特性,使用了 “基于数据库的分布式锁”,代码如下所示:
在这个语句中,会把 jobLog 的状态设置为 -1,这是一个无效状态值,当其他线程通过有效状态值来搜索失败记录时,会略过该记录,这样该记录就不会被其他线程重试,达到的分布式锁的功能(这个锁是一个行锁)。或者说,-1状态类似于 java 中的对象头的锁标志位,表明该记录已经被加锁了,其他线程会“忽略”该记录。
在 try 代码块中加锁和解锁,如果加锁后重试时抛出异常,会导致该记录永远无法解锁。所以,应该在 finnally 块中执行解锁操作,或者使用 redis 给锁加一个过期时间来实现分布式锁。
从失败的日志中取出 jobId,查询出对应的 jobInfo 数据,如果日志中的剩余重试次数大于 0,就执行重试。代码如下:
调度任务使用的就是前面介绍的 JobTriggerPoolHelper.trigger 方法,最后更新 jobLog 的 alarm_status 值,有两个作用:
这个类与 JobRegistryHelper 类似,都有一个线程池、一个线程,通过前面 JobRegistryHelper 的学习,可以大胆猜测:
实际上,该类中线程池和线程的作用就是用来 “完成” 一个 job。
当 executor 接收到 admin 的调度请求后,会异步执行 job,并立刻返回一个回调。
admin 接受到回调后,和前面的 “注册、下线” 一样,在线程池中创建线程来处理回调,主要是更新 job 和日志。
当有回调请求时, public callback 方法(该方法被 AdminBizImpl 调用)会在线程池中创建一个线程,遍历回调请求的参数列表,依次处理回调参数,代码如下:
从代码可以看出,最后调用 XxlJobCompleter.updateHandleInfoAndFinish 方法完成回调逻辑。
如果一个 job 较长时间前被调度,但是一直处于 “运行中” 且它所属的 executor 已经超过 90 秒没有心跳了,那么可以认为该 job 已经丢失了,需要把该 job 结束掉。这个就是线程 monitorThread 的主要功能。
monitorThread 会以 60秒 一次的频率,从 xxl_job_log 表中找出 10分钟前调度、仍处于”运行中“状态、executor 已经下线 的 job,然后调用 XxlJobCompleter.updateHandleInfoAndFinish 来更新 handler 的信息和结束 job,代码如下:
从代码可以看出,上面的两个功能最后都调用了 XxlJobCompleter.updateHandleInfoAndFinish 方法,关于该方法的介绍,可以看后面 XxlJobCompleter 部分的介绍,这里不详细展开。
如果去看 XxlJobTrigger.triger 方法,会发现每次调度 job 时,都会先新增一个 jobLog 记录,这也是为什么 JobFailMonitorHelper 中的线程在重试时,先查询 jobLog 的原因。
JobLog 作为 job 的调度记录,还可以用来统计一段时间内 job 的调度次数、成功数等;另外,会清理超出有效期(配置的参数 logretentiondays )的日志,避免日志数据过大。很显然,这又是一个 ”自动任务“,可以使用一个线程定时完成。
该类持有一个线程变量,线程以 每分钟一次的频率,执行两个操作:
在线程 run 方法的前半部分,线程会统计 3 天内,每天的调度次数、运行次数、成功运行数、失败次数;然后更新或新增 xxl_job_log_report 表的数据。
在线程 run 方法的后半部分,线程按天对日志进行清理,如果当前时间与上次清理的时间相隔超过一天,就会清理日志记录,代码如下:
如果不使用参数 lastCleanLogTime 来记录上次清理的时间,只是清理一天前创建的数据记录。那么该线程每分钟执行一次时,都会删除前天当前时刻的数据,导致前一年的数不完整。
使用参数 lastCleanLogTime 来记录上次清理的时间,并且与当前时间相差超过一天时才清理,能保证前一天的日志是完整的。
不明白为什么清理日志时,不是一次性删除全部的过期日志,而是每次删除 1000条。按理说,这些旧的日志数据应该已经不在 buffer pool 中了,trigger_time 字段又是普通索引,那么 DELETE 操作会先更新到 change buffer 中,之后再合并。现在先查询再删除,相当于多了一次 IO 且没有使用到 change buffer。
admin 服务是用来管理和调度 job 的,用户也可以在它的管理后台新建一个 job,配置 CRON 和 JobHandler,然后 admin 服务就会按照配置的参数来调度 job。很显然,这种“自动化工作”也是由线程定时执行的。
1、如果使用线程调度 Job,存在的第一个问题是:如果某个 Job 在调度时比较耗时,就可能阻塞后续的 Job,导致后续 job 的执行有延迟,怎么解决这个问题?
在前面 JobTriggerPoolHelper 我们已经知道,admin 在调度 job 时是 ”使用线程池、线程“ 异步执行调度任务,避免了主线程的阻塞。
2、使用线程定时调度 job,存在的第二个问题是:怎么保证 job 在指定的时间执行,而不会出现大量延迟?
admin 使用 ”预读“ 的方式,提前读取在未来一段时间内要执行的 job,提前取到内存中,并使用 “时间轮算法” 按时间分组 job,把未来要执行的 job 下一个时间段执行。
3、还隐藏第三个问题:admin 服务是可以多实例部署的,在这种情况下该怎么避免一个 job 被多个实例重复调度?
admin 把一张数据表作为 “分布式锁” 来保证只有一个 admin 实例能执行 job 调度,又通过随机 sleep 线程一段时间,来降低线程之间的竞争。
下面我们就通过代码来了解 xxl-job 是怎么解决上述问题的。
在该类中,定义了一个调度线程,用来调度要执行的 job 和已经过期一段时间的 job,定义代码如下:
该线程会预读出 “下次执行时间 <= now + 5000 毫秒内” 的部分 job,根据它们下一次执行时间划分成三段,执行三种不同的逻辑。
1、下次执行时间在 (- , now - 5000) 范围内
说明过期时间已经大于 5000 毫秒,这时如果过期策略要求调度,就调度一次。代码如下:
2、下次执行时间在 [now - 5000, now) 范围内
说明过期时间小于5000毫秒,只能算是延迟不能算是过期,直接调度一次,代码如下:
如果 job 的下一次执行时间在 5000 毫秒以内,为了省下下次预读的 IO 耗时,这里会记录下 job id,等待后面的调度。
3、下次执行时间在 [now, now + 5000) 范围内
说明还没到执行时间,先记录下 job id, 等待后面的调度 ,代码如下:
上面的3个步骤结束后,会更新 jobInfo 的 trigger_last_time、trigger_next_time、trigger_status 字段:
可以看到,通过预读,一方面会把过期一小段时间的 job 执行一遍,另一方面会把未来一小段时间内要执行的 job 取出,保存进一个 map 对象 ringData 中,等待另一个线程调度。这样就避免了某些 job 到了时间还没执行。
因为 admin 是可以多实例部署的,所以在调度 job 时,需要考虑怎么避免 job 被多次调度。
xxl-job 在前面 JobFailMonitorHelper 中遍历失败的 job 时,会对每个 job 设置一个无效的状态作为 ”分布式行锁“,如果设置失败就跳过。而在这里,如果还使用该方法,有可能出现,一个 job 被设置为无效状态后,线程就崩溃了,导致该 job 永远无法被调度。因此,要尽量避免对 job 状态的修改。
在这里,admin 服务使用一张表 xxl_job_lock 作为分布式锁,每个 admin 实例都要先尝试获取该表的锁,获取成功才能继续执行;同时,为了降低不同实例之间的竞争,会在线程开始执勤随机 sleep 一段时间。
如何获取分布式锁?
在线程中会开启一个事务,设置为手动提交,然后对表 xxl_job_lock 执行 FOR UPDATE 查询。如果该线程执行语句成功,其他实例的线程就会排队等待该表的锁,实现了分布式锁功能。代码如下:
怎么降低锁的竞争?
为了降低锁竞争,在线程开始前会先 sleep 4000 5000 毫秒的随机值(不能大于 5000 毫秒,5000 毫秒是预读的时间范围);在线程结束当前循环时,会根据耗时和是否有预读数据,选择不同的 sleep 策略:
代码如下:
在前面的线程中,对即将要开始的 job,不是立刻调度,而是按照执行的时刻(秒),把 job id 保存进一个 map 中,然后由 ringThread 线程按时刻进行调度,这只典型的“时间轮算法”。代码如下:
每次轮询调度时,只取出当前时刻(秒)、前一秒内的 job,不会去调度与现在相隔太久的 job。
在执行轮询调度前,有一个时间在 0 1000 毫秒范围内的 sleep。如果没有这个 sleep,该线程会一直执行,而 ringData 中当前时刻(秒)的数据可能已经为空,会导致大量无效的操作;增加了这个 sleep 之后,可以避免这种无效的操作。之所以 sleep 时间在 1000 毫秒以内,是因为调度时刻最小精确到秒,一秒的 sleep 可以避免 job 的延迟。
因为在前面的 scheleThread 线程中,最后一个操作是把 job 的 next_trigger_time 值更新为大于 now + 5000 毫秒,其他 admin 实例 scheleThread 线程的查询条件是:next_trigger_time < now + 5000,不会查询出这里调度的 job,所以不需要加分布式锁。
至此,XxlJobScheler-init 方法的作用我们介绍完毕,下面我们简单介绍一下 XxlJobScheler-destroy 方法
destroy 方法很简单,就是销毁前面初始化的线程池和线程,它销毁的顺序与前面启动的顺序相反。
代码如下:
因为各个 toStop 方法都很相似,所以我们只介绍 JobScheleHelper 的 toStop 方法。
该方法的步骤如下:
1、设置停止标志位为 true;
2、sleep 一段时间,让出 CPU 时间片给线程执行任务;
3、如果线程不是终止状态(线程正在 sleep),中断它;
4、线程执行 join 方法,直到线程结束,执行最后一次。
代码如下:
至此,JobScheleHelper 的主要功能就介绍完了,可以看出, admin 服务在启动时,启动了多个线程池和线程,异步执行任务和异步响应 executor 的请求。
下面,我们介绍前面涉及到的 XxlJobTrigger 和 XxlJobCompleter。
XxlJobTrigger 是调度 job 时的封装类,它主要工作就是接受传入的 jobId、调度参数等,查询对应的 jobGroup、jobInfo,然后调用 ExecutorBiz 对象来执行调度(run 方法)。
该类中三个核心方法及其调用关系如下: trigger -> processTrigger -> runExecutor ,
该方法的功能比较简单,就是根据传入的参数查询 jobGroup 和 jobInfo 对象,设置相关的字段值,然后调用 processTrigger 方法。
该方法的主要工作分为以下几步:
1、保存一条调度日志;
2、从 jobInfo、jobGroup 中取出字段值,构造 TriggerParam 对象;
3、根据 jobInfo 的路由策略,从 jobGroup 中取出要调度的 executor 地址;
4、调用 runExecutor 方法执行调度;
5、保存调度参数、设置调度信息、更新日志。
这里不会修改 jobInfo、jobGroup 对象的字段值,只取出字段值来使用,对这两个对象字段的修改,是在前一步 trigger 方法中进行的。
该方法会执行调度,并返回调度结果,它的核心代码如下:
这里使用 XxlJobScheler 类取出 ExecutorBiz 对象,以 “懒加载” 的方式给每个 address 创建一个 ExecutorBiz 对象,代码如下:
可以看出,该类中的三个方法其实可以归类为:pre -> execute -> post,在执行前、执行时、执行后做一些前置和收尾工作。
该类在前面 JobCompleteHelper 中被使用,最终 job 的完成就是在该类中执行的,该类有两个主要方法:
下面主要介绍 finishJob 方法。
finishJob 的主要功能是:如果当前任务执行成功了,就调度它的所有子任务,最后把子任务的调度消息添加到当前 job 的日志中。代码如下:
需要注意的是:
1、这里依赖于 JobTriggerPoolHelper 来调度 job,所以在 JobCompleteHelper 的监视线程开始时,有一个 50 秒的等待,就是等待 JobTriggerPoolHelper 启动完成;
2、在 finishJob 方法中,调度子任务的时候,默认子任务的调度结果是成功,注意,这里是指 “调度” 这个行为是成功的,而不是指子任务执行是成功的。
1、XxlJobAdminConfig 作为 admin 服务的启动入口,要尽可能保持简洁,作用类似于一个仓库,来管理和持有所有的类和对象,并不会去启动具体的线程,它只需要“按下启动器的按钮”就可以了;
2、XxlJobScheler 是 admin 服务的启动器类,它会调用各个辅助类(xxxHelper)来启动对应的线程;
3、对外的接口,比如调度 job、接收注册或下线等,都是使用线程池 + 线程 的异步方式实现,避免 job 对主线程的阻塞;
4、对“自动任务“类的功能,都是使用线程定时执行;
XXL-JOB分布式调度框架全面详解: https://juejin.cn/post/6948397386926391333
时间轮算法:https://spongecaptain.cool/post/widget/timingwheel
一个开源的时间轮算法介绍:https://spongecaptain.cool/post/widget/timingwheel2
‘捌’ 开源的股票软件源代码谁知道从哪找到
最近即将发布该软件的全部源码,关于这个代码的由来我在网络发布的帖子被该公司全部删除,为了澄清事实,我将建立一个开源软件网站,我看你们有多大本事能封锁事实真相,与其把代码给一个没良心的公司不如彻底开源让对金融软件有兴趣的朋友做个参考,也算抛砖引玉,这个代码是3年前的东西了我目前开发的商业代码不打算开源.
如果这个帖子访问量超过1000,我就发布代码,请大家转发到各技术群
这个是C#开发的股票软件
我是09年7月到风软入职的,我入职前已经做了一个股票分析软件,09年5月发布到网上的,7月到了风软上班,当时2个月就把我带过去的代码移植到衍生品交易客户端,由于当时讨论自动交易的问题我就提出自己想法,做一个脚本解析系统,能解决这个问题,但是公司所谓高手们群起攻之,这方案没实施,后来李说我不干活,马找我谈话,说我工作态度不行,但是实际上是没有分配工作给我,我就离职了,我于是又改起了自己的股票软件,大概3月的时间写了3万行代码基本实现了通达信软件的功能,就算是对自己想法的交待.
时过境迁,2011年我在金融界招聘员工,钟平生过来面试,说起了风软的图表分析的问题,说换了好几拨人,现在都没法用了,我到公司看看果然如此,我就好心帮他们,把3万行代码包括技术指标都给他们了,后来去了3次帮助他们整合系统,年后给我打电话说给我800块钱说是给代码付的费用,实际上我每次去风软都是打车去的,来回140,我当时也没说啥
2012年我没什么事情,还问他们控件用的如何,又没有问题,他说还有点我就去公司坐了几天班把问题都修复了,后来帮他们做了一个直接连接数据库的客户端修改到iis宿主的remoting方案的demo,刚做完当天下午就找我谈话,说我发布了对公司不利消息,我难道说的不是事实么,我说我以后就不来了吧,还说我给公司的代码是当时在公司任职时带出来修改的,做人怎么能这么没有良心呢.我分明是09年7月带自己代码到公司的,有当年帖子为证
http://www.chcj.net/thread-1456369-1-1.html,我没从风软带出1行代码都是我给风软代码
从始至终一直在贬低我,不知道做人怎么能这样.他说投资1000万到公司了,一共不到100万行代码,一行代码就算10块钱,我白送他们的代码居然说我卖给他的,我那代码3万行给我800,真可笑,要是卖给你你买的起么.如果100行3块钱这么廉价,你为啥那么着急就发布到公司的产品阿,做人讲点良心好不好啊.还说我给的代码他们自己都能做,那这2年你的人换了那么多怎么就没做出来啊,我给你那代码后期扩展到服务器自动交易的方法都告诉你了,为啥这么没有良心啊,后来坐班给他们修改的报酬也没有给,白给的代码老想说成是自己的,还不想给钱
另外的代码是有着作权的,如果泄露到第三方要承担法律责任的,如果没有我的授权发布到产品里就是侵权
‘玖’ 问道游戏架设步骤 问道游戏私服架设源码
1、服务器一台,1-1-1也可以搭建,但人数不可以多,任务开启不可多下载链接里面的服务端搭建教程:1.先安装宝塔2、放行安全组的相应端口具体要放行的端口有:3306、888、8888、5000、8101、8110、8120、8160-8168(这个是范围之8160是一线,依次类推)
2、安装数据库配置环境
3、登陆宝塔面板,在首页弹出的框中选择要安装的环境,第三个不用选择,其中mysql改为5.1,phpmyadmin改为4.0,然后选择编译安装即可。等待大约30-50分钟自动安装结束
4、配置数据库设置数据库的超级用户(root)的密码,并添加允许远程访问的root账户②、用宝塔面板的软件管理页面,重载mysql服务配置,使我们添加的远程访问生效
5、开始部署游戏数据①、第一次使用N11连接到我们服务器的mysql数据库(连接编码选择utf8),执行all.sql文件以创建游戏所需的数据库和基础数据②、断开数据库连接,设置数据库连接编码为936,然后重新连接,将dl_adb_all数据库转存为sql文件(结构和数据)③、用n++编辑我们保存好的dl_adb_all.sql文件,具体操作就是替换里面的所有外网ip为我们自己的服务器ip,如果需要改区名,就替换里面的所有问道一区为你想要的区名④、用n11删除掉dl_adb.all数据库中的表,然后运行我们保存的dl_adb_all.sql文件进行重建表结构和数据
6、部署服务器端的文件配置服务器端文件,修改aaa ccs csa dba目录下的ini配置文件的信息①修改数据库相关的IP为127.0.0.1,修改***_daili的地址为服务器的IP②修改数据密码为我们设置的数据库密码2、复制线路驱动文件rungs(想架设几条线就复制几个),复制gs/gs目录下的gs1.ini文件(同样是几条线路就复制几个)①修改gs1.ini中的ip为服务器IP②修改gs*.ini中的线路名分别问你自己数据库中设置的线路名