logback行号输出问号问题
引言Logback日志输出使用 AsyncAppender 时,输出的文件行号信息是 ?:? ,问题产生原因及解决方案。
问题在 logback推荐配置 一文中,列举了logback常用的几种配置,使用的是logback异步输出日志AsyncAppender。但在实际的开发中,遇到了日志没有输出类和行号,而输出的文件行号信息是 **?:?**。
输出的日志类似于这种:
12345678framework-server-demo 2017-07-17 14:15:11,876 INFO [main] o.s.j.e.a.AnnotationMBeanExporter [?:?] - Located managed bean 'refreshScope': registering with JMX server as MBean [org.springframework.cloud.context.scope.refresh:name=refreshScope,type=RefreshScope]framework-server-demo 2017-07-17 14:1 ...
RocketMQ(一)—角色与术语
引言我们通过缓存和消息队列来化解海量的读请求和写请求对后端数据库服务造成的压力。RocketMQ作为阿里巴巴开源的消息队列中间件,得到不少企业的青睐。在RocketMQ中有四大角色 NameServer、Broker、Producer和Consumer。
RocketMQ 特点灵活可扩展性RocketMQ天然支持集群,其核心四组件(NameServer、Broker、Producer、Consumer)每一个都可以在没有单点故障的情况下进行水平扩展。
海量消息堆积能力RocketMQ采用零拷贝原理实现超大的消息的堆积能力,据说单机已可以支持亿级消息堆积,而且在堆积了这么多消息后依然保持写入低延迟。
支持顺序消息可以保证消息消费者按照消息发送的顺序对消息进行消费。顺序消息分为全局有序和局部有序,一般推荐使用局部有序,即生产者通过将某一类消息按顺序发送至同一个队列来实现。
多种消息过滤方式消息过滤分为在服务器端过滤和在消费端过滤。服务器端过滤时可以按照消息消费者的要求做过滤,优点是减少不必要消息传输,缺点是增加了消息服务器的负担,实现相对复杂。消费端过滤则完全由具体应用自定义实现,这种方式 ...
Java和Docker限制的那些事儿
引言Java和Docker不是天然的朋友。 Docker可以设置内存和CPU限制,而Java不能自动检测到。使用Java的Xmx标识(繁琐/重复)或新的实验性JVM标识,可以解决这个问题。自己也是在开发配置上踩了个坑。
采坑记录在开发中使用了线程池,根据计算密集型 VS IO密集型设置线程数量,代码如下:
12345ThreadFactory threadFactory = new ThreadFactoryBuilder().setNameFormat("service_record").build();ExecutorService pool = new ThreadPoolExecutor(4, 2 * Runtime.getRuntime().availableProcessors(), 60L, TimeUnit.SECONDS, new LinkedBlockingQueue(1024), threadFactory, new ThreadPoolExecutor.CallerRunsPolicy());
过 ...
动态修改日志级别
引言日志是我们定位问题的关键,尤其是在线上。但是有时我们输出的日志信息不够充足,给排查问题带来了极大的困扰。如果能够不重启应用,就能动态调整日志级别的话,无疑给我们排查问题带来了极大的帮助。 Spring Boot 1.5 从开始,Spring Boot Actuator 组件就已提供动态修改日志级别的能力。在这里基于SpringMVC封装了log-config-core的jar,提供了更丰富的功能。
项目地址在我的GitHub:https://github.com/mx-go/log-config-core/tree/master
项目必须使用logback作为日志输出组件。
引入Maven坐标12345<dependency> <groupId>com.github.mx-go</groupId> <artifactId>log-config-core</artifactId> <version>1.0.0</version></dependency>
使用jar包中的LogbackS ...
详解MongoDB执行计划
引言在RDBMS(Relational Database Management System)中,无论哪种数据库,都提供了SQL剖析工具,用来解决SQL效率低下的问题。在MongoDB中,也有相应的策略来实现剖析。MongoDB提供了**db.collection.explain()、cursor.explain()**方法和explain命令返回查询计划信息和查询计划的执行统计信息。
db.collection.explain()简介支持的操作1234aggregate(); count(); distinct(); find(); group(); remove(); update() cursor.explain(verbosity) 为一个游标返回其查询执行计划(Reports on the query execution plan for a cursor)cursor.explain(verbosity) 最通常的行式为db.collection.find().explain()。其中verbosity说明返回信息的粒度。
explain()写操作(remove和upda ...
SpringMVC集成Swagger
当前方便管理项目中的API接口,最流行的莫过于Swagger了,功能强大,UI界面漂亮,并且支持在线测试等等。所以仔细研究了下Swagger的使用。在这里记录下SpringMVC集成Swagger。
引入Maven坐标1234567891011121314151617181920212223242526272829<!-- Jackson --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.5.3</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</group ...
自定义rest代理(二)
之前用HttpClient实现了rest代理(自定义rest代理(一)),从网上看了下资料,同时针对公司已有的框架做了一些封装和改造。用Retrofit2另外实现了一套rest代理工具包。其中基本都是都是基于Retrofit2,自己又做了一层简单的封装。
源码在我的GitHub上:https://github.com/mx-go/retrofit-rest-proxy
Spring配置引入Maven坐标12345<dependency> <groupId>com.github.mx-go</groupId> <artifactId>retrofit-rest-proxy</artifactId> <version>1.0.0</version></dependency>
在applicationContext.xml文件中加入配置123456789<bean id="retrofitFactory" class="com.github.pro ...
MongoDB辅助之mongo-spring-support
引言在开发中经常使用到MongoDB,每个项目使用各不相同,既繁琐又好不管理。这里封装了一套MongoDB类似于Mybatis的ORM增强版工具,和Spring无缝结合,只需要简单的配置就可以实现强大的功能。同时扩展了MongoDB的Datastore功能,加了一些自定义方法。其原理离不开之前所说的FactoryBean。
源码放在了我的GitHub上:https://github.com/mx-go/mongo-spring-support
源码中有详细使用注释,其原理就是实现FactoryBean生成代理对象并对原本的Datastore进行增强。
在这里记录下使用方法。
MongoDB数据库及集合以下测试在MongoDB的TEST库中,其中有两个集合student、student_1。student_1可以用来测试同库中,根据后缀来切换集合,相当与分表。
引入Maven坐标12345<dependency> <groupId>com.github.mx-go</groupId> <artifactId>mongo- ...