log4j

从零开始实现放置游戏(十五)——实现战斗挂机(6)在线打怪练级

江枫思渺然 提交于 2020-08-18 04:28:42
  本章初步实现游戏的核心功能——战斗逻辑。   战斗系统牵涉的范围非常广,比如前期人物的属性、怪物的配置等,都是在为战斗做铺垫。   战斗中,人物可以施放魔法、技能,需要技能系统支持。   战斗胜利后,进行经验、掉落结算。又需要背包、装备系统支持。装备系统又需要随机词缀附魔系统。   可以说是本游戏最硬核的系统。   因为目前技能、背包、装备系统都还没有实现。我们先初步设计实现一个简易战斗逻辑。   战斗动作仅包括普通攻击,有可能产生未命中、闪避和暴击。   整个战斗逻辑的流程大致如下图所示: 一、战斗消息设计   参照其他消息,战斗动作需要发送请求并接收返回消息,我们先定义两个消息代码 :     CBattleMob = "30003001"     SBattleMob = "60003001"   这里我们先仅考虑在线打怪,发送战斗请求,我们仅需要知道怪物id即可,战斗时从数据库读取怪物属性。   新建客户端消息类如下: @Data public final class CBattleMobMessage extends ClientMessage { private String mobId; }   服务端需要返回战斗的最终结果信息,以及每个回合每个角色的战斗动作记录作给客户端,一遍客户端播放。   新建服务端的消息类如下: @Data public class

日志系列1——slf4j日志框架原理

荒凉一梦 提交于 2020-08-17 18:03:26
目录 1.前言 2.日志门面 3.日志库 4.日志适配器 5.日志库的选用 6.logback.xml 配置文件 1.前言 ​ 说到日志工具,日常工作或学习中肯定听过这些名词:log4j、logback、jdk-logging、slf4j、commons-logging等,它们之间有什么关系,在整个日志体系中又扮演什么角色呢? ​ 日志框架分为三大类,包括日志门面、日志适配器、日志库。利用门面设计模式,即Facade来进行解耦,使日志使用变得更简单。 2.日志门面 ​ 门面设计模式是面向对象设计模式中的一种,日志框架采用的就是这种模式,类似JDBC的设计理念。它只提供一套接口规范,自身不负责日志功能的实现,目的是让使用者不需要关注底层具体是哪个日志库来负责日志打印机具体的使用细节等。目前用得最为广泛的日志门面有两种:slf4j和commons-logging 3.日志库 ​ 它巨头实现了日志的相关功能,主流的日志库有三个,分别是log4j、log-jdk、logback。最早Java想要记录日志只能通过System.out或System.err来完成,非常不方便。log4j就是为了解决这一问题而提出的,它是最早诞生的日志库。接着JDK也在1.4版本引入了一个日志库java.util.logging.Logger,简称log-jdk。这样市面上就出现了两种日志功能的实现

100道Java基础面试题

我们两清 提交于 2020-08-17 08:57:24
1.什么是B/S架构?什么是C/S架构 B/S(Browser/Server),浏览器/服务器程序 C/S(Client/Server),客户端/服务端,桌面应用程序 2.你所知道网络协议有那些? HTTP:超文本传输协议 FTP:文件传输协议 SMPT:简单邮件协议 TELNET:远程终端协议 POP3:邮件读取协议 3.Java都有那些开发平台? JAVA SE:主要用在客户端开发 JAVA EE:主要用在web应用程序开发 JAVA ME:主要用在嵌入式应用程序开发 4.什么是JVM?java虚拟机包括什么? JVM:java虚拟机,运用硬件或软件手段实现的虚拟的计算机,Java虚拟机包括:寄存器,堆栈,处理器 5.Java是否需要开发人员回收内存垃圾吗? 大多情况下是不需要的。Java提供了一个系统级的线程来跟踪内存分配,不再使用的内存区将会自动回收 6.什么是JDK?什么是JRE? JDK:java development kit:java开发工具包,是开发人员所需要安装的环境 JRE:java runtime environment:java运行环境,java程序运行所需要安装的环境 7.什么是数据结构? 计算机保存,组织数据的方式 8.Java的数据结构有那些? 线性表(ArrayList) 链表(LinkedList) 栈(Stack) 队列(Queue) 图(

MyBatis入门知识汇总

一个人想着一个人 提交于 2020-08-17 08:36:19
为什么要使用MyBatis?    我们都知道,在学习mybatis之前,要在Java中操作数据库,需要用到JDBC,但是在使用JDBC时会有许多缺陷。 比如:    1、使用时需要先进行 数据库连接 ,不用后要立即释放连接,这样对数据库进行频繁连接和关闭,会造成数据库资源浪费,同时并发量较大时,会影响数据库性能。   解决方案:为了达到连接复用,使用数据库连接池管理数据库连接。   2、将sql语句硬编码到java代码中,使得代码耦合度高,如果sql 语句修改,就需要重新编译java代码,不利于系统维护。   解决方案:将sql语句配置在xml配置文件中,即使sql变化,不需要对java代码进行重新编译,只要在配置文件中修改。   3、向preparedStatement中设置参数,对占位符号位置和设置参数值,硬编码在java代码中,不利于系统维护。   解决方案:将sql语句及占位符号和参数全部配置在xml中。   4、从resutSet中遍历结果集获取数据时,必须保证属性名正确,否则无法取出数据,因此将获取表的字段进行硬编码,不利于系统维护。   解决方案:将查询的结果集,自动映射成java对象。    下面是使用JBDC操作时的代码:   为了方便我使用的是maven项目来编写的,所以在刚开始时需要在pom.xml文件中添加数据库的依赖   <!-- 添加数据库依赖 -->

给日志打标签,让你的日志定位再无困难

泄露秘密 提交于 2020-08-17 07:49:32
背景 不知道各位在生产日志中定位问题时有没有碰到这样的场景:由于coding的时候日志输出的比较少,出现问题时,很难通过日志去定位到问题。又或者是,你明明coding的时候有输出日志。但是在庞大的日志文件中,由于业务线程并发比较多,你输出的日志又没有加关键信息。你也很难定位到你所需要的日志信息。 之前在公司里写业务代码时,为了使每个RPC调用能被日志记录下来,我们在公司基础组件里定义了一个切面,拦截所有的RPC调用,方法开始之前,在日志里输出调用的服务和方法以及参数,方法结束时输出方法的耗时。我相信很多人也是这么做的。 这样一来 ,所有的调用都能通过参数里的关键信息被搜索到。也能定位到调用是什么结束的以及耗时。 但是在有些业务方法中,也打上了很多的业务日志。由于核心业务的tps和qps很高,日志是互相穿插的。如果你的日志没有打上关键的业务信息(比如订单号,业务ID),那就很难在日志中被定位出来。 也许有些童鞋会说,用线程号呀。通过搜索业务ID定位到调用开始的地方,再搜索这条线程的线程号,就可以定位整个请求的所有日志。其实之前我也是这么干的,但是线程一般都是由线程池进行管理的,在tps很高的业务中,同一个线程号有可能短时间会出现多次,但是却是不同的请求。而且业务方法中可能也会有异步线程,导致了线程号会变。这样对于定位日志就又增加了难度。当然最后可以通过对时间戳的分析

给日志打标签,让你的日志定位再无困难

旧街凉风 提交于 2020-08-17 05:25:38
背景 不知道各位在生产日志中定位问题时有没有碰到这样的场景:由于coding的时候日志输出的比较少,出现问题时,很难通过日志去定位到问题。又或者是,你明明coding的时候有输出日志。但是在庞大的日志文件中,由于业务线程并发比较多,你输出的日志又没有加关键信息。你也很难定位到你所需要的日志信息。 之前在公司里写业务代码时,为了使每个RPC调用能被日志记录下来,我们在公司基础组件里定义了一个切面,拦截所有的RPC调用,方法开始之前,在日志里输出调用的服务和方法以及参数,方法结束时输出方法的耗时。我相信很多人也是这么做的。 这样一来 ,所有的调用都能通过参数里的关键信息被搜索到。也能定位到调用是什么结束的以及耗时。 但是在有些业务方法中,也打上了很多的业务日志。由于核心业务的tps和qps很高,日志是互相穿插的。如果你的日志没有打上关键的业务信息(比如订单号,业务ID),那就很难在日志中被定位出来。 也许有些童鞋会说,用线程号呀。通过搜索业务ID定位到调用开始的地方,再搜索这条线程的线程号,就可以定位整个请求的所有日志。其实之前我也是这么干的,但是线程一般都是由线程池进行管理的,在tps很高的业务中,同一个线程号有可能短时间会出现多次,但是却是不同的请求。而且业务方法中可能也会有异步线程,导致了线程号会变。这样对于定位日志就又增加了难度。当然最后可以通过对时间戳的分析

SLF4J: Class path contains multiple SLF4J bindings.

梦想的初衷 提交于 2020-08-17 03:00:02
错误信息: SLF4J Warning: Class Path Contains Multiple SLF4J Bindings 错误原因: 我个人博客系统一个爬虫组件用到webmagic,而webmagic与lomback中的slf有冲突。 解决办法(webmagic排除相关依赖即可): <!-- webmagic--> <dependency> <groupId>us.codecraft</groupId> <artifactId>webmagic-core</artifactId> <version>${webmagic.version}</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> <exclusion> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </exclusion> </exclusions> </dependency> 参考解决问题地址: SLF4J Warning: Class Path Contains Multiple SLF4J Bindings 来源: oschina 链接: https://my

Mybatis日志(5)

泪湿孤枕 提交于 2020-08-17 01:16:36
日志工厂 如果数据库出现异常错误,排错的时候,日志便是最好的工具助手 SLF4J、LOG4J、LOG4J2、JDK_LOGGING、COMMONS_LOGGING、STDOUT_LOGGING、NO_LOGGING SLF4J LOG4J 【掌握】 LOG4J2 JDK_LOGGING COMMONS_LOGGING STDOUT_LOGGING 【掌握】 NO_LOGGING 在MyBatis中使用哪个日志实现,在设置中进行配置 标准日志的实现 例如:使用 STDOUT_LOGGING 首先在配置文件中配置日志 <settings> <setting name="logImpl" value="STDOUT_LOGGING"/> </settings> 结果(日志打印): Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter. PooledDataSource forcefully closed/removed all connections. PooledDataSource forcefully closed/removed all connections. PooledDataSource forcefully closed/removed all

SLF4J源码解析

自作多情 提交于 2020-08-15 21:33:50
提出问题 阅读源码之前,首先提几个问题 SLF4J是如何整合不同的日志框架的 Class Path中为什么只能有且仅有一种日志框架的binding 这段文字摘录自官网:In your code, in addition to slf4j-api-1.8.0-beta2.jar, you simply drop one and only one binding of your choice onto the appropriate class path location. Do not place more than one binding on your class path. 源码版本 org.slf4j:slf4j-api:1.7.25 org.apache.logging.log4j:log4j-slf4j-impl:2.11.1 ch.qos.logback:logback-classic:1.2.3 org.slf4j:slf4j-jcl:1.7.25 源码解析 带着上面的两个问题看下源码 bind()方法中通过调用findPossibleStaticLoggerBinderPathSet()方法来查找日志框架的绑定 // org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25.jar!/org/slf4j/LoggerFactory

Spring Batch 读 10 万条记录,写到 MongoDB

ぐ巨炮叔叔 提交于 2020-08-15 13:25:51
实践内容 从 MariaDB 一张表内读 10 万条记录,经处理后写到 MongoDB 。 具体实现 1、新建 Spring Boot 应用,依赖如下: <!-- Web 应用 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <!-- Web 容器 undertow --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter