Java监控节点运行状态框架_Java知识点总结框架篇11-15

本文介绍了Java应用中的页面静态化技术,利用Freemarker和Spring定时任务提升性能。讨论了Servlet线程安全问题,提出避免全局变量的解决方案。深入解析了Jbpm4工作流引擎,包括核心类和服务,并展示了一个请假流程的业务场景。最后简要提及了Ant构建工具及其常用标签。
摘要由CSDN通过智能技术生成

548c8e40c2f9

十一、实现页面静态化业务场景

我们在做某项目时,涉及到程序访问的性能问题,这时候我们想到可以通过静态化来提高用户访问时候的性能,所以我们就采用了freemarker模板引擎,考虑到页面也是要有动态的变化的,所以我们采用spring定时器在每天晚上2点钟的时候定时再次生成html静态页面,考虑发布时候的性能问题,我们又采取线程池技术,让多个线程同时发布,从而缩减发布时间。

十二、servlet线程安全描述

servlet是单列的,对于所有请求都使用一个实例,所以如果有全局变量被多

线程使用的时候,就会出现线程安全问题。

解决这个问题有三种方案:

1.实现singleThreadModel接口,这样对于每次请求都会创建一个新的servlet实例,这样就会消耗服务端内存,降低性能,但是这个接口已经过时,不推荐使用。

2.可以通过加锁(synchroniezd关键字)来避免线程安全问题。这个时候虽然还是单列,但是对于多线程的访问,每次只能有一个请求进行方法体内执行,只有执行完毕后,其他线程才允许访问,降低吞吐量。

3.避免使用全局变量,使用局部变量可以避免线程安全问题,强烈推荐使用此方法来解决servlet线程安全的问题。

十三、(jbpm4)工作流引擎描述:

JPBM是JBOSS旗下的一个开源的基于hibernate的工作流引擎。工作流就是在日常生活中,我们一些常见的如请假流程、采购流程、入职流程,通俗的来讲就是一些在现实生活中的流程以信息化以程序的方式实现。

一个工作流首先需要进行流程定义,流程定义是由节点和跳转组成的,节点又可以称为环节、活动节点、活动环节,并且节点也可以分为两大类型:人工节点和自动节点,人工节点有start开始节点、end结束节点、task任务节点,自动节点有decision判断节点、fork分支节点、join聚合节点和state状态节点,并且一个流程有且只有一个开始节点,但可以有多个结束节点。

流程定义是静止的,它在运行状态时会转换成流程实例,一个流程定义可以对应多个流程实例。流程运行后,会产生两个文件,*.jdpl.xml文件和*.png图片文件,也会生成18张数据库表,常用且核心的表有JBPM4_LOB 存储表,主要存储xml文件和png图片、JBPM4_TASK 任务表、JBPM4_EXECUTION 流程实例表、JBPM4_VARIABLE变量表。

图形化的灵活定制(主动说)

可以根据需求进行流程图的改变的,即定义的流程图是可以根据需要改变的,而不是死的。

可以进行图形化的监控(主动说)

输出图片

获取活动节点的坐标

进行叠加

判断节点:(主动说,也可以了解)

实现implements DecisionHandler接口并重写decide方法,

返回的字符串要和xml中配置的transition的name保持一致。

分支判定节点

JBPM有五大核心类:

ProcessEngine:主要获取各种的Service

RepositoryService:主要发布流程定义

ExecutionService:主要操作流程实例

TaskService:主要操作人工服务

HistoryService:主要操作历史服务。

核心方法:

读取jbpm定义的文件生成zip包存到lob表中:createDeployment()

获取流程定义列表:createProcessDefinitionQuery

根据定义的key或id来启动流程实例:startProcessInstanceByKey(id)

获取待办任务列表:findPersonalTasks(userName)

完成指定任务列表:completeTask(*.getActivityId())

获取历史任务列表:createHistoryTaskQuery()

获取流程实例的ID:task.getExecutionId()

(了解的表)

JBPM4_HIST_ACTINST 流程活动(节点) 实例表

JBPM4_HIST_DETAIL 流程历史详细表

JBPM4_HIST_PROCINST 流程实例历史表

JBPM4_HIST_TASK 流程任务实例历史表

JBPM4_HIST_VAR 流程变量( 上下文) 历史表

十四、JPBM业务场景

首先进行请假的流程定义,我们流程的定义是(员工提交请假单---》经理审批---》总监审批---》总经理审批---》结束),通过repositoryService将其发布部署到jbpm4_lob表中,

之后获取流程定义列表,选中请假的流程定义,员工开始进行请假单的填写,保存并通过executionService开启流程实例,然后用taskService获取经理的待办任务列表,选中待办任务,进行审批,通过调用taskService.completeTask()进入到总监审批环节,然后用总监进行登录,同样获取待办任务列表,然后调用taskService.completeTask()进入总经理审批环节,总经理审批之后,结束流程。在这个过程中我们还可以根据historyService查看当前登录人已办的任务列表。

十五、Ant描述

Ant是apache旗下的对项目进行自动打包、编译、部署的构建工具,他主要具有 轻量级并且跨平台的特性,而且基于jvm,默认文件名为build.xml

Ant主要的标签:

Project 根标签,

target 任务标签,

property 属性标签,自定义键/值 供多次使用,

java 执行编译后的java文件

javac 编译java文件

war 打成war包

其它标签:copy,delete,mkdir,move,echo等。

背景 当前互联网企业存在很多业务风险,有些风险(比如薅羊毛)虽然没有sql注入漏洞利用来的直接,但是一直被羊毛党、刷单党光顾的企业长期生存下来的几率会很低! 账号:垃圾注册、撞库、盗号等 交易:盗刷、恶意占用资源、篡改交易金额等 活动:薅羊毛 短信:短信轰炸 项目介绍 实时业务风控系统是分析风险事件,根据场景动态调整规则,实现自动精准预警风险的系统。 本项目只提供实时风控系统框架基础和代码模板。 需要解决的问题 哪些是风险事件,注册、登录、交易、活动等事件,需要业务埋点配合提供实时数据接入 什么样的事件是有风险的,风险分析需要用到统计学,对异常用户的历史数据做统计分析,找出异于正常用户的特征 实时性,风险事件的分析必须毫秒级响应,有些场景下需要尽快拦截,能够给用户止损挽回损失 低误报,这需要人工风控经验,对各种场景风险阈值和评分的设置,需要长期不断的调整,所以灵活的规则引擎是很重要的 支持对历史数据的回溯,能够发现以前的风险,或许能够找到一些特征供参考 项目关键字 轻量级,可扩展,实时的Java业务风控系统 基于Spring boot构建,配置文件能少则少 使用drools规则引擎管理风控规则,原则上可以动态配置规则 使用redis、mongodb做风控计算和事件储存,历史事件支持水平扩展 原理 统计学 次数统计,比如1分钟内某账号的登录次数,可以用来分析盗号等 频数统计,比如1小时内某ip上出现的账号,可以用来分析黄牛党等 最大统计,比如用户交易金额比历史交易都大,可能有风险 最近统计,比如最近一次交易才过数秒,可能机器下单 行为习惯,比如用户常用登录地址,用户经常登录时间段,可以用来分析盗号等 抽象:某时间段,在条件维度(可以是多个维度复合)下,利用统计方法统计结果维度的值。充分发挥你的想象吧! 实时计算 要将任意维度的历史数据(可能半年或更久)实时统计出结果,需要将数据提前安装特殊结果准备好(由于事件的维度数量不固定的,选取统计的维度也是随意的,所以不是在关系数据库中建几个索引就能搞定的),需要利用空间换时间,来降低时间复杂度。 redis redis中数据结构sortedset,是个有序的集合,集合中只会出现最新的唯一的值。利用sortedset的天然优势,做频数统计非常有利。 比如1小时内某ip上出现的账号数量统计: 保存维度 ZADD key score member(时间复杂度:O(M*log(N)), N 是有序集的基数, M 为成功添加的新成员的数量),key=ip,score=时间(比如20160807121314),member=账号。存储时略耗性能。 结构如下: 1.1.1.1 |--账号1 20160807121314 |--账号2 20160807121315 |--账号n 20160807121316 2.2.2.2 |--账号3 20160807121314 |--账号4 20160807121315 |--账号m 20160807121316 计算频数 ZCOUNT key min max(时间复杂度:O(1)),key=ip,min=起始时间,max=截止时间。计算的性能消耗极少,优势明显 redis lua 把保存维度,计算频数,过期维度数据等操作,使用lua脚本结合在一起,可以减少网络IO,提高性能 mongodb mongodb本身的聚合函数统计维度,支持很多比如:max,min,sum,avg,first,last,标准差,采样标准差,复杂的统计方法可以在基础聚合函数上建立,比如行为习惯: getDB().getCollection(collectionName).aggregate( Arrays.asList( match(match) --匹配条件维度 , group("$" + field, Accumulators.sum("_count", 1)) --求值维度的次数 , match(new Document("_count", new Document("$gte", minCount))) --过滤,超过minCount才统计 , sort(new Document("_count", -1)) --对次数进行倒叙排列 ) ); 建议在mongodb聚合的维度上建立索引,这样可以使用内存计算,速度较快。 redis性能优于mo
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值