标签归档:java

pm2 在 windows 下运行 jar 包

  • 安装 nodejs 环境,过程略。
  • 安装 java 环境,过程略。
  • 安装 pm2 并设置开机自启环境
npm i -g --registry=http://registry.npm.taobao.org npm tbify
tnpm i -g pm2
tnpm i -g pm2-windows-startup
pm2-startup install
  • 准备好 jar 包,例如放在 c:\app\my.jar
  • 准备一个 json 文件 c:\app\pm2.json
{
    "apps": {
        "name": "myapp",  //pm2管理列表中显示的程序名称
        "cwd": "C:/app",  //项目所在目录
        "script": "javaw",  //要执行的脚本,javaw 后台运行
        "exec_mode": "fork", //fork单例多进程模式,cluster多实例多进程模式只支持node
        "error_file": "./log/err.log",  //错误日志存放位置
        "out_file": "./log/out.log",  //全部日志存放位置
        "merge_logs": true,  //追加日志
        "log_date_format": "YYYY/MM/DD HH:mm:ss",  //日志文件输出的日期格式,可以为空
        "min_uptime": "60s",  //最小运行时间(范围内应用终止会触发异常退出而重启)
        "max_restarts": 30,  //异常退出重启的次数
        "autorestart": true,  //发生异常情况自动重启
        "restart_delay": "60",  //异常重启的延时重启时间
        "args": [
            "-jar",
            "./my.jar"
        ]
    }
}
  • 运行并设置自启
pm2 start c:\app\pm2.json
pm2 save
  • pm2 面板
pm2 dash
  • 删除项目
pm2 ls // 找出项目 ID
pm2 del <id>
pm2 save

maven 运行 springboot 代码

当仅用于调试目的时,使用以下脚本执行:

mvn spring-boot:run

多模块时,先在父模块中执行 mvn clean install ,再进入模块目录运行上述命令。

运行参数/环境:

mvn spring-boot:run -Dspring-boot.run.profiles=xxx

打包:

mvn clean package -DskipTests
mvn clean package -DskipTests -am -amd -pl <model>

BigDecimal 加减乘除计算

BigDecimal有多种构造函数,常用的有2种。建议使用String构造方式,不建议使用double构造方式。

// 强制使用String的构造函数,double也有可能计算不太准确
// 原则是使用BigDecimal并且一定要用String来构造。
public BigDecimal(String val);
public BigDecimal(double val);

方法

  • add() 加法
  • subtract() 减法
  • multiply() 乘法
  • divide() 除法
  • abs() 绝对值

舍入

new BigDecimal("12.34").setScale(0, BigDecimal.ROUND_HALF_UP);
  • ROUND_UP 始终对非零舍弃部分前面的数字加1
  • ROUND_DOWN 从不对舍弃部分前面的数字加1,即截短
  • ROUND_CEILING 如果 BigDecimal 为正,则舍入行为与 ROUND_UP 相同;如果为负,则舍入行为与 ROUND_DOWN 相同
  • ROUND_FLOOR 如果 BigDecimal 为正,则舍入行为与 ROUND_DOWN 相同;如果为负,则舍入行为与 ROUND_UP 相同
  • ROUND_HALF_UP 四舍五入
  • ROUND_HALF_DOWN 五舍六入
  • ROUND_HALF_EVEN “银行家舍入法”,主要在美国使用。四舍六入,五分两种情况。如果前一位为奇数,则入位,否则舍去

更多来源:https://www.jianshu.com/p/683b2406342f

SpringBoot 取出 JSONString 形式的 requestBody

@PostMapping("/getRequestBodyJson")
public void getRequestBodyJson(HttpServletRequest request) throws IOException {
    BufferedReader reader = new BufferedReader(
        new InputStreamReader(request.getInputStream(), "UTF-8"));
    String line;
    String result = "";
    while ((line = reader.readLine()) != null) {
        result += line;
    }
    System.out.println(result);
}

注意不能使用 @RequestBody 注解,否则会空指针错误。因为 request.getInputStream() 只能被读取一次,然后就会被清空。

利用sidecar将非java服务注册进eureka

  1. idea 新建 Spring Boot 项目
  2. 编辑 pom.xml ,添加以下内容:
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-netflix-sidecar -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-netflix-sidecar</artifactId>
    <version>RELEASE</version>
</dependency>
  1. 编辑 application.properties 文件,添加以下内容:
eureka.client.service-url.defaultZone=http://eureka-server:80/eureka
server.port=5678
spring.application.name=non-java-sidecar
sidecar.port=3000
sidecar.health-uri=http://localhost:${sidecar.port}/health.json

注意:

  1. eureka.client.service-url.defaultZone 是 eureka 注册中心地址
  2. sidecar.health-uri 是 non-java 服务,确保能正常访问,并返回 {"status":"UP"}
  1. 在主入口的 @SpringBootApplication 下添加 @EnableSidecar
  2. 运行测试。

gitbash 使用 .bash_profile

示例:添加别名

cd ~
touch .bashrc
touch .bash_profile
echo 'if [ -f ~/.bashrc ]; then . ~/.bashrc; fi' > .bash_profile
echo 'alias java="java -Dfile.encoding=UTF-8"' > .bashrc # 在windows下java输出乱码的解决办法
. ~/.bashrc

java 连接 mysql 并使用 prepareStatement 查询数据库

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

import java.sql.*;
import java.util.*;

public class Main {

    public static void main(String[] args) {

        Connection conn = null;
        User user = null;
        Gson gson = new Gson();

        try {
            # JDK6 之前的版本需要加载驱动
            # new com.mysql.jdbc.Driver();

            # 连接数据库
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/dbname?" +
                    "useSSL=false&useUnicode=true&characterEncoding=UTF8", "root", "root");

            # 使用 prepareStatement 查询数据库
            PreparedStatement preStatement = conn.prepareStatement("select * from tables");
            ResultSet res = preStatement.executeQuery();

            List<User> users = new ArrayList<User>();
            while (res.next()) {
                user = new User();
                user.setId(Integer.parseInt(res.getString("id")));
                user.setUser(res.getString("user"));
                users.add(user);
            }
            # 导出为 json
            String strJson = gson.toJson(users);
            System.out.println(strJson);

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }

    }
}

继续阅读

使用 Gson 序列化 和 反序列化 json

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

public class Main {

    public static void main(String[] args) {

        User user = new User();
        user.setId(1);
        user.setUser("admin");

        # 实例化 Gson
        Gson gson = new Gson();
        # 序列化 json
        String jsonUser = gson.toJson(user);
        System.out.println(jsonUser);
        # 反序列化 json
        User user1 = gson.fromJson(jsonUser, User.class);
        System.out.println(user1);

        System.out.println("==============================");

        # 列表,使用 List
        List<User> users = new ArrayList<>();
        for (int i = 0; i < 2; i++) {
        users.add(user);
        }
        String jsonUsers = gson.toJson(users);
        System.out.println(jsonUsers);

        List<User> users1 = gson.fromJson(jsonUsers, new TypeToken<List<User>>() {
        }.getType());
        for (User _user : users1) {
        System.out.println(_user);
        }

        System.out.println("==============================");

        # 多属性键值对,使用 Map
        Map<String, String> ips = new HashMap<>();
        for (int i = 0; i < 9; i++) {
            ips.put(i + "", "192.168.1.10" + i);
        }
        String jsonIps = gson.toJson(ips);
        System.out.println(jsonIps);

        Map<String, String> ips1 = gson.fromJson(jsonIps, new TypeToken<Map<String, String>>() {
        }.getType());
        Set<String> set = ips1.keySet();
        for (String _string : set) {
        System.out.println(_string + ":" + ips1.get(_string));
        }
    }
}

继续阅读