===============
== ffff65535 ==
===============
十六个一(1111 1111 1111 1111)

操作线程

多线程 线程控制 线程状态

线程停止

  1. 建议线程正常停止—->利用此时,不建议死循环
  2. 建议使用标志位—->设置一个标志位
  3. 不要使用stop或destroy等过时或jdk不建议使用的方法
/**
 * 测试停止线程
 * 1.建议线程正常停止---->利用此时,不建议死循环
 * 2.建议使用标志位---->设置一个标志位
 * 3.不要使用stop或destroy等过时或jdk不建议使用的方法
 */
public class TestThredStop implements Runnable {
    // 设置一个标志位
    private boolean flag = true;

    public static void main(String[] args) {
        TestThredStop testThredStop = new TestThredStop();
        new Thread(testThredStop).start();
        for (int i = 0; i < 1000; i++) {
            System.out.println("i=" + i);
            if (i == 900) {
                // 调用stop方法停止线程以转换标志位
                testThredStop.stop();
                System.out.println("线程停止了");
            }
        }
    }

    /**
     * 设置一个公开的方法用于停止线程,转换标志位
     */
    public void stop() {
        this.flag = false;
    }

    @Override
    public void run() {
        int i = 0;
        while (flag) {
            System.out.println("run正在执行" + i++);
        }
    }
}

参考资料:

阅读全文...

线程的三种创建方式

多线程 thread runnable callable

继承Thread类

  1. 继承Thread类型
  2. 重写run方法
  3. 调用start开启多线程

线程的执行顺序无法控制,由CPU调度执行

public class TestThread extends Thread {
    public static void main(String[] args) {
        // 创建一个线程对象,调用start()方法
        TestThread testThread = new TestThread();
        // 调用start方法开启多线程(观察打印日志会发现:run方法和main方法交替执行)
        testThread.start();
        // 调用run方法,(观察打印日志会发现:会先执行run方法,再执行main方法)
        //testThread.run();
        // 主线程
        for (int i = 0; i < 200; i++) {
            System.out.println("main方法线程--" + i);
        }
    }

    /**
     * 1.继承Thread类型
     * 2.重写run方法
     */
    @Override
    public void run() {
        super.run();
        // run方法线程体
        for (int i = 0; i < 200; i++) {
            System.out.println("run方法线程--" + i);
        }
    }

}

参考资料:

阅读全文...

EMQX安装

emqx mqtt 安装部署
  1. 通过 emqx.io 或 Github 下载要安装的 EMQX 版本的 zip 包。

  2. 解压zip到自己指定的目录

  3. 打开命令提示符窗口,进入emqx解压目录

  4. 输入命令:bin\emqx start 或者bin\emqx console(会弹出Erlang),启动EMQ

    阅读全文...

EMQX通过webhook统计设备上下线

emqx mqtt webhook

修改emqx配置文件

web.hook.url = http://127.0.0.1:8080/emqx/webhook

// 取消这两项的注释
web.hook.rule.client.connected.1     = {"action": "on_client_connected"}
web.hook.rule.client.disconnected.1  = {"action": "on_client_disconnected"}

打开web管理→ 模块→emqx_web_hook 启动

post请求接口

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * emqx的webhook通知
 */
@Slf4j
@RestController
@RequestMapping("/emqx/")
public class WebHookController {
    @PostMapping("/webhook")
    public void webhook(@RequestBody WebHookRequestBody body) {
        System.out.println(body);
    }
}
import lombok.Data;

import java.io.Serializable;

@Data
public class WebHookRequestBody implements Serializable {
    /**
     * 事件名称
     * client.connected	成功接入	客户端认证完成并成功接入系统后
     * client.disconnected	连接断开	客户端连接层在准备关闭时
     */
    private String action;
    /**
     * 客户端 ClientId
     */
    private String clientid;
    /**
     * 客户端 Username,不存在时该值为 "undefined"
     */
    private String username;

    /**
     * 客户端源 IP 地址
     */
    private String ipaddress;
    /**
     * 客户端申请的心跳保活时间
     */
    private Integer keepalive;
    /**
     * 协议版本号
     */
    private Integer proto_ver;

    /**
     * 时间戳(秒)
     */
    private Long connected_at;
    /**
     * 错误原因
     */
    private String reason;
}

参考资料:

阅读全文...

ghost+nginx无限重定向

ghost nginx 反向代理

修改ngixn配置

server
{
    listen 80;
		listen 443 ssl http2;
    server_name ghost.你的域名.com;
    index index.php index.html index.htm default.php default.htm default.html;
    root /www/wwwroot/ghost.你的域名.com;
    
    #SSL-START SSL相关配置,请勿删除或修改下一行带注释的404规则
    #error_page 404/404.html;
    #HTTP_TO_HTTPS_START
    if ($server_port !~ 443){
        rewrite ^(/.*)$ https://$host$1 permanent;
    }
    #HTTP_TO_HTTPS_END
    ssl_certificate    /www/server/panel/vhost/cert/ghost.你的域名.com/fullchain.pem;
    ssl_certificate_key    /www/server/panel/vhost/cert/ghost.你的域名.com/privkey.pem;
    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    add_header Strict-Transport-Security "max-age=31536000";
    error_page 497  https://$host$request_uri;

    #SSL-END
    
    #ERROR-PAGE-START  错误页配置,可以注释、删除或修改
    #error_page 404 /404.html;
    #error_page 502 /502.html;
    #ERROR-PAGE-END
    
    #PHP-INFO-START  PHP引用配置,可以注释或修改
    

		include enable-php-00.conf;
    #PHP-INFO-END

    # 拦截请求,直接返回上传的静态图片资源,缓存时间 1 个月
    location ^~ /content/images {
        alias /www/ghost_site/content/images;
        expires 1M;
        access_log off;
        add_header Cache-Control "public";
    }
    location ~ ^/(image|javascript|js|css|media|static)/ {
        proxy_pass http://127.0.0.1:2368;
        # root /www/ghost.qinan.co/web/static/;
        access_log off;
        expires 30d;
    }
    # 不缓存 ghost 核心文件(反向代理后台管理)
    location ^~ /ghost/ {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_pass http://127.0.0.1:2368;
    }

    # favicon
    location = /favicon.ico {
        root /www/ghost_site/core/shared;
        access_log off;
        log_not_found off;
        expires 30d;
    }

    # cache urls
    # 反向代理博客请求到服务端
    location / {
        proxy_cache_valid 200 60m;
        proxy_cache_bypass    $http_cache_control;
        proxy_redirect off;
        add_header X-Proxy-Cache $upstream_cache_status;
        proxy_ignore_headers X-Accel-Expires Expires Cache-Control;
        # 后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
        proxy_set_header Host   $host;
        proxy_set_header X-Real-IP    $remote_addr;
        proxy_set_header X-Forwarded-For    $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto    https;
        proxy_set_header X-Forwarded-Host    $host;
        proxy_pass http://127.0.0.1:2368;
        proxy_max_temp_file_size 0;
        proxy_connect_timeout 90;
        proxy_send_timeout 90;
        proxy_read_timeout 90;
        proxy_buffering off;
        proxy_temp_file_write_size 64k;
    }

    location ~ /\.
    {
        deny all;
    }

    #REWRITE-START URL重写规则引用,修改后将导致面板设置的伪静态规则失效
    include /www/server/panel/vhost/rewrite/ghost.你的域名.com.conf;
    #REWRITE-END
    
    #禁止访问的文件或目录
    location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md)
    {
        return 404;
    }
    
    #一键申请SSL证书验证目录相关设置
    location ~ \.well-known{
        allow all;
    }
    
    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
    {
        expires      30d;
        error_log /dev/null;
        access_log /dev/null;
    }
    location ~ .*\.(js|css)?$
    {
        expires      12h;
        error_log /dev/null;
        access_log /dev/null;
    }
		access_log  /www/wwwlogs/ghost.你的域名.com.log;
    error_log  /www/wwwlogs/ghost.你的域名.com.error.log;
}

参考资料:

阅读全文...

windows server环境documents4j转换excel报错

documents4j excel 报错排查

错误描述:ppt和wrod可以正常转换,excel转换报错

报错信息如下

com.documents4j.throwables.FileSystemInteractionException: Could not access target file
	at com.documents4j.util.Reaction$FileSystemInteractionExceptionBuilder.make(Reaction.java:180)
	at com.documents4j.util.Reaction$ExceptionalReaction.apply(Reaction.java:75)
	at com.documents4j.conversion.ExternalConverterScriptResult.resolve(ExternalConverterScriptResult.java:70)
	at com.documents4j.conversion.ProcessFutureWrapper.evaluateExitValue(ProcessFutureWrapper.java:50)
	at com.documents4j.conversion.ProcessFutureWrapper.get(ProcessFutureWrapper.java:38)
	at com.documents4j.conversion.ProcessFutureWrapper.get(ProcessFutureWrapper.java:11)
	at com.documents4j.job.AbstractFutureWrappingPriorityFuture.run(AbstractFutureWrappingPriorityFuture.java:78)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)

解决方案:

阅读全文...

使用documents4j将转换office为pdf

documents4j word2pdf office转换

使用documents4j将word、excel、ppt转换为pdf

仅支持windows环境转换,需要安装MS office


<dependency>
    <groupId>com.documents4j</groupId>
    <artifactId>documents4j-local</artifactId>
    <version>1.1.7</version>
</dependency>
<dependency>
    <groupId>com.documents4j</groupId>
    <artifactId>documents4j-transformer-msoffice-word</artifactId>
    <version>1.1.7</version>
</dependency>
<dependency>
    <groupId>com.documents4j</groupId>
    <artifactId>documents4j-transformer-msoffice-excel</artifactId>
    <version>1.1.7</version>
</dependency>
<dependency>
    <groupId>com.documents4j</groupId>
    <artifactId>documents4j-transformer-msoffice-powerpoint</artifactId>
    <version>1.1.7</version>
</dependency>

使用的依赖

阅读全文...
Previous Page 4 of 4