SpringBoot自定义starter

pom.xml <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.3.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-autoconfigure</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.25</version> </dependency> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> </dependency> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>${guava.version}</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> </dependency> </dependencies> <distributionManagement> <repository> <id>uniweibo</id> <name>uniweibo</name> <url>http://10.0.0.40:8081/repository/uniweibo/</url> </repository> </distributionManagement> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build> 上面的,

ThreadPoolExecutor中的异常捕获

现象 线上服务日志发现有中断(即日志前面有打印, 但后面的日志没打印), 并且又没有异常信息输出. 原因 代码示例 private static final ThreadPoolTaskExecutor THREAD_POOL_TASK_EXECUTOR = new ThreadPoolTaskExecutor(); static { THREAD_POOL_TASK_EXECUTOR.setQueueCapacity(10000); THREAD_POOL_TASK_EXECUTOR.setDaemon(true); THREAD_POOL_TASK_EXECUTOR.setThreadNamePrefix("global-%d"); THREAD_POOL_TASK_EXECUTOR.setRejectedExecutionHandler((r, executor) -> { L

SpringBoot结合InfluxDB收集监控统计信息

pom.xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!-- 统计信息输出到 influxdb --> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-influx</artifactId> </dependency> application.properties #### Spring Boot 监控 management.metrics.export.influx.enabled=true management.metrics.export.influx.auto-create-db=true management.metrics.export.influx.db=app_met

SpringBoot结合MyBatis配置多数据源

application.properties # mysql spring.datasource.jdbc-url=@config.jdbc.url@ spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.username=@config.jdbc.username@ spring.datasource.password=@config.jdbc.password@ # clickhouse ## clickhouse spring.clickhouse.jdbc-url=@config.clickhouse.url@ spring.clickhouse.driver-class-name=ru.yandex.clickhouse.ClickHouseDriver spring.clickhouse.username= spring.clickhouse.password= Java 代码配置 主 datasource package com.uniweibo.config; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.jdbc.DataSourceBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.core.io.ClassPathResource; import javax.sql.DataSource; @Configuration @MapperScan(basePackages = {"com.uniweibo.dao.mapper", "com.uniweibo.meitu.dao.mapper", "com.uniweibo.xiaomi.dao.mapper"}, sqlSessionFactoryRef = "sqlSessionFactory" ) public class AppDataSourceConfig { /** 配置文件名, 放在 classpath

从传统SpringMVC迁移到SpringBoot

本文的迁移背景是: JDK7 + SpringMVC + 传统的 web.xml + 外部Tomcat 迁移到 JDK8 + SpringBoot2 + 嵌入式的Tomcat pom 注意事项 <build> <resources> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.*</include> <!--<include>**/*.json</include>--> <!--<include>**/*.properties</include>--> </includes> <filtering>true</filtering> </resource> <resource> <directory>src/main/java</directory> <includes> <include>**/*.*</include> </includes> </resource> </resources> </build> 改造 web.xml

Java Metrics+Grafana+InfluxDB搭建监控系统

以下的测试, 都是基于 Ubuntu 14.04.2 LTS + Java 8 + SpringBoot Grafana 安装 sudo echo "deb https://packagecloud.io/grafana/stable/debian/ stretch main" > /etc/apt/sources.list.d/grafana.list curl https://packagecloud.io/gpg.key | sudo apt-key add - sudo apt-get update -y ; sudo apt-get install grafana 启动/停止 sudo service grafana-server start sudo service grafana-server stop 登录: http://127.0.0.1:3000 默认的用户名和密

ClickHouse入门记录

安装 我写了个脚本放在 gist 可以执行以下命令来自动安装: curl -L https://gist.githubusercontent.com/emacsist/ebb98839c814cdb2f16e20efcef9474e/raw/aa8e035ad2e61fa74f4c904a7953806c62155fa3/install-clickhouse.sh | bash 下面是脚本的完整内容: #!/usr/bin/env bash grep -q sse4_2 /proc/cpuinfo && echo "SSE 4.2 supported" || echo "SSE 4.2 not supported" grep -q sse4_2 /proc/cpuinfo || exit 1 sudo echo "deb http://repo.yandex.ru/clickhouse/deb/stable/ main/"

Netty与epoll资料收集

为什么 Netty 支持 native epoll ? stackoverflow.com Netty 的 epoll transport 使用 epoll edge-triggered , 而 java 的 NIO 库珍的是 level-triggered. 除此之外, epoll transport 暴露了一些在 Java NIO 中没出现的配置项, 例如: TCP_CORK, SO_REUSEPORT 等等. 什么是 edge-triggered 和 level-triggered? stackexchange 我没有

[翻译]The Unspoken the Why of GC Ergonomics

你有使用GC工效学(即:让GC自动调整), 使用带有 -XX:+UseAdaptiveSizePolicy 选项的 UseParallelGC 收集器? 该 GC 的工效学的杰出之处在于它试图增大或缩小堆以达到指定的目标. 你可以选择

[翻译]The Unspoken Application Time

原文 有时, 你会对你的应用程序会在GC之间执行执行多久感兴趣. 这可从GC日志中计算出来, 但一个方便的方式来查看这个信息是通过命令行选项 -XX:+PrintGCApplicationStoppedTime 以及 -XX:+PrintGCApplicationConcurrentTime

[翻译]Oracle JDK 1.7.0_04 及之后可用的GC

原文 Jack Shirazi 告诉你 Oracle Java 7 update 4 及更高版本可以使用哪些GC和GC的组合, 包括Java 8 和Java9 发布日期: June 2012, 更新日期: September 2015, 作者 Jack Shirazi 注意, 这已经更

[翻译]GC 调优指南(简要翻译)

GC, heap 和 Runtime Compiler 的默认选项 服务器级的典型机器是被定义为以下的条件: 2 个或更多的物理CPU 2 GB或更多的物理内存 在一个服务器级的机器中, 默认的选项是

Java中多线程环境使用Random

Random 根据 JDK 文档介绍, 它是线程安全的. Instances of {@code java.util.Random} are threadsafe. 但文档中说, 在跨线程使用 Random 时, 它的性能比较低下. ThreadLocalRandom 这个是在 JDK >= 1.7 时出现的, 当在多线程环境中使用

Java开启远程VisualVM中的VisualGC

开启远程Debug # jdk < java9 之前(默认监听所有) -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=4000,suspend=n # jdk >= java9(默认只监听本地, 所以要 *:端口, 开启远程) -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=*:4000,suspend=n 开启 JMX -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false 开启 Jstatd 只有

<高手>读书笔记之科学决策

一: 扩充你的选项 一般人的做法是从现有选项里选, 而正确的做法是想想你能不能给自己增加几个选项 二: 用现实检验你的观点 这一步, 人们常犯的错误是 确认