gitweixin
  • 首页
  • 小程序代码
    • 资讯读书
    • 工具类
    • O2O
    • 地图定位
    • 社交
    • 行业软件
    • 电商类
    • 互联网类
    • 企业类
    • UI控件
  • 大数据开发
    • Hadoop
    • Spark
    • Hbase
    • Elasticsearch
    • Kafka
    • Flink
    • 数据仓库
    • 数据挖掘
    • flume
    • Kafka
    • Hive
    • shardingsphere
    • solr
  • 开发博客
    • Android
    • php
    • python
    • 运维
    • 技术架构
    • 数据库
  • 程序员网赚
  • bug清单
  • 量化投资
  • 在线查询工具
    • 去行号
    • 在线时间戳转换工具
    • 免费图片批量修改尺寸在线工具
    • SVG转JPG在线工具

分类归档spring

精品微信小程序开发门户,代码全部亲测可用

  • 首页   /  大数据开发
  • 分类归档: "spring"
Android, spring 4月 29,2022

生产环境app和后台都看不到日志的异常调试方法

最近调试一个项目,调试到让人亏崩溃。

由于是特殊行业,手机不开usb调试模式,这样没法看到android app的日志。由于疫情等原因,又无法到现场看后台日志。在调试app登录时,app一直报“ 网络异常,请稍后重试” 。

由于网络是经过第三方转发的,刚开始以为是第三方转发那方面没配置好。经过费劲周折,先后发现app的key、secret、url配错了,又测了后台直接调用的接口是通的,反复找第三方转发公司确认,才确认第三方转发是正确的,整个网络是通的。

全面的测试用例查找问题:

app端对网络异常处理不够完善,当后台500出错时,app没准确提示,还是提示统一的“网络异常,请稍后重试”。怀疑app访问超时导致这样问题,修改超时时间还是没返回。后来别的同事加入讨论,他测试的账号是不存在的,终于有了后台提示。我之前一直是用正确存在的账号测试,反而一直没有收到后台返回结果。看来测试还是要考虑正常和非正常等多元化测试,考虑全面的测试用例,这样可以覆盖代码多个分支。

替代排除法:

通过上面的步骤,已经确认了app能正确访问到生产环境的后台,但不确定是app和后台都有问题,还只是后台有问题。想到生产环境还有一套接口一模一样生产环境的后台,是能正常使用的。把app的url修改成那个后台的地址,发现app登录等一切正常。

通过日志分析:

没办法调试app和后台,但日志还是可以想办法拿到的。android的日志可以上传到后台,也可以保存到本地,通过文件浏览器来找到日志文件。例如在Android把调试日志保存到本地,然后在手机找到安装包包名对应的目录,就可以查找到日志。

通过上面的方法,看到app日志报的是500错误,那么是后台接口报错,后来通过查看后台日志,果然看到空指针错误了。处理好问题了,果然app能正常登录后台和正常使用了。

作者 east
Elasticsearch, spring 3月 22,2022

Spring Boot直接输出到Logstash

Spring Boot应用程序可以直接远程输出到Logstash。这里以Logback日志为例,新建项目,在项目中加入Logstash依赖。

1、 要使用logback一个插件来将数据转成json,引入maven配置

dependency>

      <groupId>net.logstash.logback</groupId>

      <artifactId>logstash-logback-encoder</artifactId>

     <version>5.3</version>

</dependency>



2、配置 logback-spring.xml

接下来,在src/resources目录下创建logback-spring.xml配置文件,在配置文件中将对日志进行格式化,并且输出到控制台和Logstash。需要注意的是,在destination属性中配置的地址和端口要与Logstash输入源的地址和端口一致,比如这里使用的是127.0.0.1:4560,则在Logstash输入源中要与这个配置一致。其中logback-spring.xml内容如

<xml version="1.0" encoding="UTF-8"?>

    <configuration scan="true" scanPeriod="60 seconds" debug="true">

         <contextName>logstash-test</contextName>

   <!-- 这个是控制台日志输出格式 方便调试对比--->

    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">

      <encoder>

          <pattern>%d{yyyy-MM-dd HH:mm:ss} %contextName %-5level %logger{50} -%msg%n</pattern>

   </encoder>

</appender>

<appender name="stash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">

  <destination>127.0.0.1:4560</destination> 这是是logstash服务器地址 端口

  <encoder class="net.logstash.logback.encoder.LogstashEncoder" /> 输出的格式,推荐使用这个

</appender>

<root level="info">

   <appender-ref ref="console"/>

   <appender-ref ref="stash"/>

</root>

启动项目,就会请求127.0.0.1:4560,如果有监听,就会自动发送日志。

3、logstash配置

input {

             tcp {

                        host => "localhost" #这个一定要是logstash本机ip,不然logstash 无法启动,也可以去除

                        port => 4560

                       codec => json_lines

                       mode => "server"

                  }

}

filter {

                 grok {

               match => {

"message" => "%{URIPATH:request} %{IP:clientip} %{NUMBER:response:int} \"%{WORD:sources}\" (?:%{URI:referrer}|-) \[%{GREEDYDATA:agent}\] \{%{GREEDYDATA:params}\}"

     }

}


output {

       stdout { codec => rubydebug } #标准输出,在命令行中输出方便调试

elasticsearch { hosts => [ "localhost:9200" ]

index => "pybbs"

document_type => "weblog"

    }

}

如果数据特别多,上述方案就会为Elasticsearch带来很大的压力。为了缓解Elasticsearch的压力,可以将Logstash收集的内容不直接输出到Elasticsearch中,而是输出到缓冲层,比如Redis或者Kafka,然后使用一个Logstash从缓冲层输出到Elasticsearch。当然,还有很多种方案进行日志收集,比如使用Filebeat替换Logstash等。笔者在生产环节搭建过ELK配置,这里提几点建议:

(1)根据日志量判断Elasticsearch的集群选择,不要盲目追求高可用,实际应用需要根据实际场景的预算等因素使用。

(2)缓冲层选择,一般来说选择Kafka和Redis。虽然Kafka作为日志消息很适合,具备高吞吐量等,但是如果需求不是很大,并且环境中不存在Kafka,就没有必要使用Kafka作为消息缓存层,使用现有的Redis也未尝不可。

(3)内存分配,ELK三者部署都是占有一定内存的,并且官网建议的配置都很大。建议结合场景来修改配置,毕竟预算是很重要的一环。

作者 east
spring 3月 17,2022

Springboot接口使用注意事项

Spring boot接口传参,如果接口用到整型,最好用Integer类型而不是int类型,例如

public ReturnResult deleteByPrimaryKey(@RequestParam("id") Integer id)

如果接口传参用int类型,最好带有默认值,例如:

@RequestParam(value="pageNum", required=false, defaultValue="1") int pageNum,
                                                @RequestParam(value="pageSize", required=false, defaultValue="10") int pageSize

给传参的接口,最好统一封装带有状态码和状态信息,这样客户端调用接口时,方便知道异常信息。


public class ReturnResult {

    //1是成功,0是失败
	private int code;
	
	private String msg;
	
	private Object data;
	
	
	
	

	public ReturnResult() {
		super();
	}


	public ReturnResult(int code, String msg, Object data) {
		super();
		this.code = code;
		this.msg = msg;
		this.data = data;
	}
	

	public ReturnResult(int code, String msg) {
		super();
		this.code = code;
		this.msg = msg;
	}

	public int getCode() {
		return code;
	}

	public void setCode(int code) {
		this.code = code;
	}

	public String getMsg() {
		return msg;
	}

	public void setMsg(String msg) {
		this.msg = msg;
	}

	public Object getData() {
		return data;
	}

	public void setData(Object data) {
		this.data = data;
	}
	
	
	
}
作者 east
Java, spring 6月 26,2020

Mysql 查询今天、昨天、前天的sql语句

查询今天的
SELECT * FROM t_table WHERE TO_DAYS(CREATE_TIME) = TO_DAYS(NOW())

查询昨天的
SELECT * FROM t_table WHERE TO_DAYS(NOW()) - TO_DAYS(CREATE_TIME) = 1


查询前天天的
SELECT * FROM t_table WHERE TO_DAYS(NOW()) - TO_DAYS(CREATE_TIME) = 1
作者 east
bug清单, spring 6月 26,2020

springboot内嵌tomcat文件上传路径不存在bug解决

在开发上传功能时,发现在开发环境正常,在线上环境出现问题,经过定位发现tomcat临时目录导致的问题。

springboot内嵌tomcat,上传文件时会存放到tomcat临时文件目录(停止时删除/重启时新建),如:/tmp/tomcat.1046709481715876128.17301/work/Tomcat/localhost/cms

可知文件保存在/tmp目录下,/tmp目录在centos下会定时清理,大约10天未使用将会删除目录,(当tomcat未重启,但centos删除相应目录,tomcat获取相应目录却获取不到会报错)

解决方案:

配置multipartFile上传路径

1.application.properties 文件中添加

spring.http.multipart.location=${tmp.file.path} 注意:tmp.file.path 如果不存在,spring会认为是相对路径,对应根路径是tomcat临时文件目录
2

2.配置相应bean

/**
* 文件上传临时路径
*/
@Bean
MultipartConfigElement multipartConfigElement() {
  MultipartConfigFactory factory = new MultipartConfigFactory();
factory.setLocation("/data/ops/app/cms/cache");
return factor
246810121416
作者 east
spring 6月 10,2020

Springboot读取excel工具类

public List<DeviceInfo> readXls() throws IOException {
InputStream is = new FileInputStream(EXCEL_PATH);
XSSFWorkbook hssfWorkbook = new XSSFWorkbook(is);
DeviceInfo student = null;
List<DeviceInfo> list = new ArrayList<DeviceInfo>();
// 循环工作表Sheet
for (int numSheet = 0; numSheet < hssfWorkbook.getNumberOfSheets(); numSheet++) {
XSSFSheet hssfSheet = hssfWorkbook.getSheetAt(numSheet);
if (hssfSheet == null) {
continue;
}
// 循环行Row
for (int rowNum = 1; rowNum <= hssfSheet.getLastRowNum(); rowNum++) {
XSSFRow hssfRow = hssfSheet.getRow(rowNum);
if(CheckRowNull(hssfRow)){
continue;
}
if (hssfRow != null) {
student = new DeviceInfo();
XSSFCell no = hssfRow.getCell(0);
no.setCellType(no.CELL_TYPE_STRING);
XSSFCell name = hssfRow.getCell(3);
XSSFCell longitude = hssfRow.getCell(1);
XSSFCell latitude = hssfRow.getCell(2);
student.setDeviceId(getValue(no));
student.setDeviceName(getValue(name));
student.setLongitude(new BigDecimal(getValue(longitude)));
student.setLatitude(new BigDecimal(getValue(latitude)));
list.add(student);
}
}
}
return list;
}

@SuppressWarnings("static-access")
private String getValue(XSSFCell hssfCell) {
if (hssfCell.getCellType() == hssfCell.CELL_TYPE_BOOLEAN) {
// 返回布尔类型的值
return String.valueOf(hssfCell.getBooleanCellValue());
} else if (hssfCell.getCellType() == hssfCell.CELL_TYPE_NUMERIC) {
// 返回数值类型的值
return String.valueOf(hssfCell.getNumericCellValue());
} else if (hssfCell.getCellType() == hssfCell.CELL_TYPE_FORMULA) {
return String.valueOf(hssfCell.getCellFormula());
} else {
// 返回字符串类型的值
return String.valueOf(hssfCell.getStringCellValue());
}
}

//判断行为空
private boolean CheckRowNull(XSSFRow hssfRow){
Iterator<Cell> cellItr =hssfRow.iterator();
while(cellItr.hasNext()){
Cell c =cellItr.next();
if(c != null && c.getCellType() !=XSSFCell.CELL_TYPE_BLANK){
return false;
}
}
return true;
}

作者 east
spring 6月 10,2020

Mybatis的and拼接问题

在具体业务开发中,有些业务涉及到多个可选的查询条件,例如要查询白天出现的时间段,晚上不出现时间段,这就涉及多个and拼接问题。

<select id="listSelectAll">
        select * from ***
        where 
        <if test="a!= null">
            a = #{a}
        </if>
        <if test="b!= null">
            and b = #{b}
            </foreach>
        </if>
        <if test="c!= null">
            and c = #{c}
        </if>
            order by id desc
            limit #{limit} offset #{page}
</select>

这样写的错误是如果a==null那么第二个条件中就会多一个and,语句会变成select * from *** where and b =#{b},而如果条件全都不满足的话SQL会变成select * from *** where order by id desc limit…解决办法:加上<where>标签,如下:

<select id="listSelectAll">
        select * from ***
       <where>
        <if test="a!= null">
            a = #{a}
        </if>
        <if test="b!= null">
            and b = #{b}
            </foreach>
        </if>
        <if test="c!= null">
            and c = #{c}
        </if>
        </where>
            order by id desc
            limit #{limit} offset #{page}
</select>

如上代码所示,加上一个<where>标签即可,where标签会自动识别,如果前面条件不满足的话,会自己去掉and。

作者 east
Java, spring 5月 31,2020

分库分表利器sharding-sphere入门学习资料


当mysql达到单表1千万数据以上时,性能就下降得厉害,添加索引等方式还是不能根本解决问题,需要进行分库分表。sharding-sphere是开源的分布式数据库中间件解决方案 ,只需要开发人员像添加普通jar依赖一样添加依赖,不需要运维人员额外配置。是一个轻量级、性能较好的解决方案。但sharding-sphere学习资料较少,下面推荐一下入门学习资料。

学习视频https://www.bilibili.com/video/BV1rJ411n7QH

官网

官网是必须要学习的一手材料。

http://shardingjdbc.io/

Github

https://github.com/sharding-sphere

很好入门例子:https://github.com/yudiandemingzi/spring-boot-sharding-sphere

作者 east
bug清单, Java, spring 5月 24,2020

MyBaits 无法打印sql,日志冲突解决

springboot的mybatis之前能打印出日志,后来一直没打印,不方便调试。刚开始以为是设置问题,但application.yml已经设置开启了。

logging:
level:
com:
xxx:
xxx:
mapper: debug

后来怀疑是加入了别的日志jar包,日志冲突。然后搜索这方面关键字找到解决方案。

对于不同日志框架:SLF4J、 Apache Commons Logging、 Log4j 2、 Log4j
JDK logging 具体选择哪个日志实现由MyBatis的内置日志工厂确定。它会使用最先找到的(按上文列举的顺序查找)。 如果一个都未找到,日志功能就会被禁用。
因此当您的maven工程中引入了SLF4J-API和Log4J, 而您使用Log4j.properties进行日志配置时,便无法打印sql语句到控制台,按照优先级他会先选择使用SLF4J





<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.6</version>
</dependency>
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
</dependency>
<!-- 添加该jar, 解决MyBaits 无法打印sql语句到控制台, -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.7.6</version>
</dependency>

然后修改log4j.properties


###显示SQL语句部分
# MyBatis logging configuration...
log4j.logger.cn.com.softvan.cms.dao=TRACE
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
### mybatis loggers ###
log4j.logger.com.ibatis=DEBUG,stdout
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG,stdout
log4j.logger.com.ibatis.common.jdbc.ScriptRunner=DEBUG,stdout
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG,stdout
# sql loggers
log4j.logger.java.sql.Connection=DEBUG,stdout
log4j.logger.java.sql.Statement=DEBUG,stdout
log4j.logger.java.sql.PreparedStatement=DEBUG,stdout
log4j.logger.java.sql.ResultSet=DEBUG,stdout

log4j.logger.cn.com.softvan.cms.dao=TRACE 这句一定要加 不然无法打印SQL,其它的自己看情况简化

cn.com.softvan.cms.dao为包路径

作者 east
spring 2月 6,2020

凯利公式源代码

凯利公式如下:

仓位 =(odds *pwin-q)/b

  odds = 赔率(赔率=期望盈利÷可能亏损=2美元盈利÷1美元亏损,赔率就是2了)

  pwin = 成功概率(抛硬币正反面都是50%的概率)

  q = 失败概率 (也就是 1-p,赌局中也是50%了 )


public class kellyUtil {

/**
* 凯利公式
* @param pwin 胜率
* @param odds 赔率
* @return
*/
public static double kelly(double pwin,double odds){
return (odds * pwin + pwin - 1)/odds;
}

public static double kellyV2(double pwin,double odds, double lossRate){
return (odds * pwin + pwin - 1)/(odds * lossRate);
}

/**
* 巴菲特版仓位管理
* @param pwin
* @return
*/
public static double buffett(double pwin){
return 2 * pwin - 1;
}

public static void main(String[] args) {
double odds = kelly(0.5, 3.0);
// double odds = kellyV2(0.5, 3.0,1.5);
System.out.println(("仓位:" + odds * 100 + "%"));
}
}
作者 east
spring 1月 14,2020

maven 增加本地libs依赖的完美方案

1、首先新建libs文件夹,把外部依赖的jar放进去。

2、在pom文件把外部依赖jar文件导进去

<dependency>
<groupId>org.codehaus.stax2</groupId>
<artifactId>stax2</artifactId>
<version>3.1.4</version>
<scope>system</scope>
<systemPath>${project.basedir}/libs/stax2-api-3.1.4.jar</systemPath>
</dependency>

其中groupId、artifactId和version都可以自己定义  scope是system,和provided类似,只是jar包本地提供,这种方式有个缺点,那就是在项目打成jar或war包的时候因为scope是system,只在编译的时候能用,install的时候不会打进去。

在pom中给spring boot的打包插件设置一下includeSystemScope参数即可?

<build>
<plugins>
<plugin>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-maven-plugin</artifactId>
 <configuration>
  <includeSystemScope>true</includeSystemScope>
 </configuration>
</plugin>
</plugins>
</build>
作者 east

关注公众号“大模型全栈程序员”回复“小程序”获取1000个小程序打包源码。回复”chatgpt”获取免注册可用chatgpt。回复“大数据”获取多本大数据电子书

标签

AIGC AI创作 bert chatgpt github GPT-3 gpt3 GTP-3 hive mysql O2O tensorflow UI控件 不含后台 交流 共享经济 出行 图像 地图定位 外卖 多媒体 娱乐 小程序 布局 带后台完整项目 开源项目 搜索 支付 效率 教育 日历 机器学习 深度学习 物流 用户系统 电商 画图 画布(canvas) 社交 签到 联网 读书 资讯 阅读 预订

官方QQ群

小程序开发群:74052405

大数据开发群: 952493060

近期文章

  • 详解Python当中的pip常用命令
  • AUTOSAR如何在多个供应商交付的配置中避免ARXML不兼容?
  • C++thread pool(线程池)设计应关注哪些扩展性问题?
  • 各类MCAL(Microcontroller Abstraction Layer)如何与AUTOSAR工具链解耦?
  • 如何设计AUTOSAR中的“域控制器”以支持未来扩展?
  • C++ 中避免悬挂引用的企业策略有哪些?
  • 嵌入式电机:如何在低速和高负载状态下保持FOC(Field-Oriented Control)算法的电流控制稳定?
  • C++如何在插件式架构中使用反射实现模块隔离?
  • C++如何追踪内存泄漏(valgrind/ASan等)并定位到业务代码?
  • C++大型系统中如何组织头文件和依赖树?

文章归档

  • 2025年6月
  • 2025年5月
  • 2025年4月
  • 2025年3月
  • 2025年2月
  • 2025年1月
  • 2024年12月
  • 2024年11月
  • 2024年10月
  • 2024年9月
  • 2024年8月
  • 2024年7月
  • 2024年6月
  • 2024年5月
  • 2024年4月
  • 2024年3月
  • 2023年11月
  • 2023年10月
  • 2023年9月
  • 2023年8月
  • 2023年7月
  • 2023年6月
  • 2023年5月
  • 2023年4月
  • 2023年3月
  • 2023年1月
  • 2022年11月
  • 2022年10月
  • 2022年9月
  • 2022年8月
  • 2022年7月
  • 2022年6月
  • 2022年5月
  • 2022年4月
  • 2022年3月
  • 2022年2月
  • 2022年1月
  • 2021年12月
  • 2021年11月
  • 2021年9月
  • 2021年8月
  • 2021年7月
  • 2021年6月
  • 2021年5月
  • 2021年4月
  • 2021年3月
  • 2021年2月
  • 2021年1月
  • 2020年12月
  • 2020年11月
  • 2020年10月
  • 2020年9月
  • 2020年8月
  • 2020年7月
  • 2020年6月
  • 2020年5月
  • 2020年4月
  • 2020年3月
  • 2020年2月
  • 2020年1月
  • 2019年7月
  • 2019年6月
  • 2019年5月
  • 2019年4月
  • 2019年3月
  • 2019年2月
  • 2019年1月
  • 2018年12月
  • 2018年7月
  • 2018年6月

分类目录

  • Android (73)
  • bug清单 (79)
  • C++ (34)
  • Fuchsia (15)
  • php (4)
  • python (43)
  • sklearn (1)
  • 云计算 (20)
  • 人工智能 (61)
    • chatgpt (21)
      • 提示词 (6)
    • Keras (1)
    • Tensorflow (3)
    • 大模型 (1)
    • 智能体 (4)
    • 深度学习 (14)
  • 储能 (44)
  • 前端 (4)
  • 大数据开发 (488)
    • CDH (6)
    • datax (4)
    • doris (30)
    • Elasticsearch (15)
    • Flink (78)
    • flume (7)
    • Hadoop (19)
    • Hbase (23)
    • Hive (40)
    • Impala (2)
    • Java (71)
    • Kafka (10)
    • neo4j (5)
    • shardingsphere (6)
    • solr (5)
    • Spark (99)
    • spring (11)
    • 数据仓库 (9)
    • 数据挖掘 (7)
    • 海豚调度器 (10)
    • 运维 (34)
      • Docker (3)
  • 小游戏代码 (1)
  • 小程序代码 (139)
    • O2O (16)
    • UI控件 (5)
    • 互联网类 (23)
    • 企业类 (6)
    • 地图定位 (9)
    • 多媒体 (6)
    • 工具类 (25)
    • 电商类 (22)
    • 社交 (7)
    • 行业软件 (7)
    • 资讯读书 (11)
  • 嵌入式 (70)
    • autosar (63)
    • RTOS (1)
    • 总线 (1)
  • 开发博客 (16)
    • Harmony (9)
  • 技术架构 (6)
  • 数据库 (32)
    • mongodb (1)
    • mysql (13)
    • pgsql (2)
    • redis (1)
    • tdengine (4)
  • 未分类 (6)
  • 程序员网赚 (20)
    • 广告联盟 (3)
    • 私域流量 (5)
    • 自媒体 (5)
  • 量化投资 (4)
  • 面试 (14)

功能

  • 登录
  • 文章RSS
  • 评论RSS
  • WordPress.org

All Rights Reserved by Gitweixin.本站收集网友上传代码, 如有侵犯版权,请发邮件联系yiyuyos@gmail.com删除.