<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>神经蛙</title>
  <icon>http://hexo.sjava.cn/img/pic.png</icon>
  <subtitle>分享科技与生活</subtitle>
  <link href="http://hexo.sjava.cn/rss.xml" rel="self"/>
  
  <link href="http://hexo.sjava.cn/"/>
  <updated>2024-08-12T10:28:48.000Z</updated>
  <id>http://hexo.sjava.cn/</id>
  
  <author>
    <name>神经蛙</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>CentOS安装Nginx及其使用攻略</title>
    <link href="http://hexo.sjava.cn/posts/2.html"/>
    <id>http://hexo.sjava.cn/posts/2.html</id>
    <published>2024-08-12T10:28:48.000Z</published>
    <updated>2024-08-12T10:28:48.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="Linux中nginx的安装"><a href="#Linux中nginx的安装" class="headerlink" title="Linux中nginx的安装"></a>Linux中nginx的安装</h2><p>首先是系统环境：CentOS7，Nginx版本：1.62（如需其他版本自行到官网下载）</p><p>我安装参考的是菜鸟教程的安装方式，附链接：<a href="https://www.runoob.com/linux/nginx-install-setup.html">Nginx安装配置</a></p><p>下面是安装教程：</p><h3 id="Nginx-安装"><a href="#Nginx-安装" class="headerlink" title="Nginx 安装"></a>Nginx 安装</h3><h4 id="一、安装编译工具及库文件"><a href="#一、安装编译工具及库文件" class="headerlink" title="一、安装编译工具及库文件"></a>一、安装编译工具及库文件</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yum -y install make zlib zlib-devel gcc-c++ libtool  openssl openssl-devel</span><br></pre></td></tr></table></figure><h4 id="二、首先要安装-PCRE"><a href="#二、首先要安装-PCRE" class="headerlink" title="二、首先要安装 PCRE"></a>二、首先要安装 PCRE</h4><p>PCRE 作用是让 Nginx 支持 Rewrite 功能。</p><ol><li>下载 PCRE 安装包，下载地址： <a href="http://downloads.sourceforge.net/project/pcre/pcre/8.35/pcre-8.35.tar.gz">http://downloads.sourceforge.net/project/pcre/pcre/8.35/pcre-8.35.tar.gz</a><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">[root@bogon src]# cd /usr/local/src/</span><br><span class="line">[root@bogon src]# wget http://downloads.sourceforge.net/project/pcre/pcre/8.35/pcre-8.35.tar.gz</span><br></pre></td></tr></table></figure><img src="https://lsky.sjava.cn/i/2025/07/29/6887a7fb7dcbf.png" alt="image-1647245456603"></li><li>解压安装包:<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">[root@bogon src]# tar zxvf pcre-8.35.tar.gz</span><br></pre></td></tr></table></figure></li><li>进入安装包目录<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">[root@bogon src]# cd pcre-8.35</span><br></pre></td></tr></table></figure></li><li>编译安装 <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">[root@bogon pcre-8.35]# ./configure</span><br><span class="line">[root@bogon pcre-8.35]# make &amp;&amp; make install</span><br></pre></td></tr></table></figure></li><li>查看pcre版本<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">[root@bogon pcre-8.35]# pcre-config --version</span><br></pre></td></tr></table></figure><img src="https://lsky.sjava.cn/i/2025/07/29/6887a7fb8168b.png" alt="image-1647245517484"><h4 id="安装-Nginx"><a href="#安装-Nginx" class="headerlink" title="安装 Nginx"></a>安装 Nginx</h4></li><li>下载 Nginx，下载地址：<a href="https://nginx.org/en/download.html">https://nginx.org/en/download.html</a><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">[root@bogon src]# cd /usr/local/src/</span><br><span class="line">[root@bogon src]# wget http://nginx.org/download/nginx-1.6.2.tar.gz</span><br></pre></td></tr></table></figure><img src="https://lsky.sjava.cn/i/2025/07/29/6887a7fb8cddd.png" alt="image-1647245537740"></li><li>解压安装包<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">[root@bogon src]# tar zxvf nginx-1.6.2.tar.gz</span><br></pre></td></tr></table></figure></li><li>进入安装包目录<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">[root@bogon src]# cd nginx-1.6.2</span><br></pre></td></tr></table></figure></li><li>编译安装<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">[root@bogon nginx-1.6.2]# ./configure --prefix=/usr/local/webserver/nginx --with-http_stub_status_module --with-http_ssl_module --with-pcre=/usr/local/src/pcre-8.35</span><br><span class="line">[root@bogon nginx-1.6.2]# make</span><br><span class="line">[root@bogon nginx-1.6.2]# make install</span><br></pre></td></tr></table></figure></li><li>查看nginx版本<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">[root@bogon nginx-1.6.2]# /usr/local/webserver/nginx/sbin/nginx -v</span><br></pre></td></tr></table></figure><img src="https://lsky.sjava.cn/i/2025/07/29/6887a7fb9f0cf.png" alt="image-1647245608098"><br>到此，nginx安装完成。</li></ol><hr><h3 id="Nginx-配置"><a href="#Nginx-配置" class="headerlink" title="Nginx 配置"></a>Nginx 配置</h3><ol><li>创建 Nginx 运行使用的用户 www：<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">[root@bogon conf]# /usr/sbin/groupadd www </span><br><span class="line">[root@bogon conf]# /usr/sbin/useradd -g www www</span><br></pre></td></tr></table></figure></li><li>配置nginx.conf ，将/usr/local/webserver/nginx/conf/nginx.conf替换为以下内容<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br></pre></td><td class="code"><pre><span class="line">[root@bogon conf]#  cat /usr/local/webserver/nginx/conf/nginx.conf</span><br><span class="line"></span><br><span class="line">user www www;</span><br><span class="line">worker_processes 2; #设置值和CPU核心数一致</span><br><span class="line">error_log /usr/local/webserver/nginx/logs/nginx_error.log crit; #日志位置和日志级别</span><br><span class="line">pid /usr/local/webserver/nginx/nginx.pid;</span><br><span class="line">#Specifies the value for maximum file descriptors that can be opened by this process.</span><br><span class="line">worker_rlimit_nofile 65535;</span><br><span class="line">events</span><br><span class="line">&#123;</span><br><span class="line">  use epoll;</span><br><span class="line">  worker_connections 65535;</span><br><span class="line">&#125;</span><br><span class="line">http</span><br><span class="line">&#123;</span><br><span class="line">  include mime.types;</span><br><span class="line">  default_type application/octet-stream;</span><br><span class="line">  log_format main  &#x27;$remote_addr - $remote_user [$time_local] &quot;$request&quot; &#x27;</span><br><span class="line">               &#x27;$status $body_bytes_sent &quot;$http_referer&quot; &#x27;</span><br><span class="line">               &#x27;&quot;$http_user_agent&quot; $http_x_forwarded_for&#x27;;</span><br><span class="line">  </span><br><span class="line">#charset gb2312;</span><br><span class="line">     </span><br><span class="line">  server_names_hash_bucket_size 128;</span><br><span class="line">  client_header_buffer_size 32k;</span><br><span class="line">  large_client_header_buffers 4 32k;</span><br><span class="line">  client_max_body_size 8m;</span><br><span class="line">     </span><br><span class="line">  sendfile on;</span><br><span class="line">  tcp_nopush on;</span><br><span class="line">  keepalive_timeout 60;</span><br><span class="line">  tcp_nodelay on;</span><br><span class="line">  fastcgi_connect_timeout 300;</span><br><span class="line">  fastcgi_send_timeout 300;</span><br><span class="line">  fastcgi_read_timeout 300;</span><br><span class="line">  fastcgi_buffer_size 64k;</span><br><span class="line">  fastcgi_buffers 4 64k;</span><br><span class="line">  fastcgi_busy_buffers_size 128k;</span><br><span class="line">  fastcgi_temp_file_write_size 128k;</span><br><span class="line">  gzip on; </span><br><span class="line">  gzip_min_length 1k;</span><br><span class="line">  gzip_buffers 4 16k;</span><br><span class="line">  gzip_http_version 1.0;</span><br><span class="line">  gzip_comp_level 2;</span><br><span class="line">  gzip_types text/plain application/x-javascript text/css application/xml;</span><br><span class="line">  gzip_vary on;</span><br><span class="line"> </span><br><span class="line">  #limit_zone crawler $binary_remote_addr 10m;</span><br><span class="line"> #下面是server虚拟主机的配置</span><br><span class="line"> server</span><br><span class="line">  &#123;</span><br><span class="line">    listen 80;#监听端口</span><br><span class="line">    server_name localhost;#域名</span><br><span class="line">    index index.html index.htm index.php;</span><br><span class="line">    root /usr/local/webserver/nginx/html;#站点目录</span><br><span class="line">      location ~ .*\.(php|php5)?$</span><br><span class="line">    &#123;</span><br><span class="line">      #fastcgi_pass unix:/tmp/php-cgi.sock;</span><br><span class="line">      fastcgi_pass 127.0.0.1:9000;</span><br><span class="line">      fastcgi_index index.php;</span><br><span class="line">      include fastcgi.conf;</span><br><span class="line">    &#125;</span><br><span class="line">    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|ico)$</span><br><span class="line">    &#123;</span><br><span class="line">      expires 30d;</span><br><span class="line">  # access_log off;</span><br><span class="line">    &#125;</span><br><span class="line">    location ~ .*\.(js|css)?$</span><br><span class="line">    &#123;</span><br><span class="line">      expires 15d;</span><br><span class="line">   # access_log off;</span><br><span class="line">    &#125;</span><br><span class="line">    access_log off;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li>检查配置文件nginx.conf的正确性命令：<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">[root@bogon conf]# /usr/local/webserver/nginx/sbin/nginx -t</span><br></pre></td></tr></table></figure><img src="https://lx95.top/upload/2022/03/image-1647245666324.png" alt="image-1647245666324"></li></ol><hr><h3 id="启动-Nginx"><a href="#启动-Nginx" class="headerlink" title="启动 Nginx"></a>启动 Nginx</h3><ol><li>Nginx 启动命令如下：<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">[root@bogon conf]# /usr/local/webserver/nginx/sbin/nginx</span><br></pre></td></tr></table></figure><img src="https://lx95.top/upload/2022/03/image-1647245699680.png" alt="image-1647245699680"></li></ol><h3 id="访问站点"><a href="#访问站点" class="headerlink" title="访问站点"></a>访问站点</h3><ol><li>从浏览器访问我们配置的站点ip：<br><img src="https://lx95.top/upload/2022/03/image-1647245716561.png" alt="image-1647245716561"></li></ol><h3 id="Linux中Nginx常用命令"><a href="#Linux中Nginx常用命令" class="headerlink" title="Linux中Nginx常用命令"></a>Linux中Nginx常用命令</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">查询Nginx端口号</span><br><span class="line">ps -ef|grep nginx</span><br><span class="line">从容停止nginx</span><br><span class="line">kill - QUIT nginx 主进程号</span><br><span class="line">停止Nginx的所有进程</span><br><span class="line">pkill -9 nginx</span><br><span class="line"></span><br><span class="line">/usr/local/webserver/nginx/sbin/nginx -s reload # 重新载入配置文件</span><br><span class="line">/usr/local/webserver/nginx/sbin/nginx -s reopen # 重启 Nginx</span><br><span class="line">/usr/local/webserver/nginx/sbin/nginx -s stop # 停止 Nginx</span><br><span class="line">/usr/local/webserver/nginx/sbin/nginx #启动Nginx</span><br></pre></td></tr></table></figure><h3 id="Linux中nginx配置多个访问渠道"><a href="#Linux中nginx配置多个访问渠道" class="headerlink" title="Linux中nginx配置多个访问渠道"></a>Linux中nginx配置多个访问渠道</h3><p>实用场景：两个Tomcat，通过域名Https访问</p><p>配置server针对性进行修改即可，下面代码中已有注释，不理解可以评论留言，看到会及时回复的<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br></pre></td><td class="code"><pre><span class="line"> server &#123;</span><br><span class="line">        listen       443  ssl; #这个地方监听443  ssl不写可能会报错</span><br><span class="line">        server_name  xxx.com; #这里填写自己的域名信息  </span><br><span class="line">ssl_certificate /usr/local/webserver/nginx/xxx.com.pem;  # 指定证书的位置，绝对路径</span><br><span class="line">        ssl_certificate_key /usr/local/webserver/nginx/xxx.com.key;  # 绝对路径，同上</span><br><span class="line"></span><br><span class="line">ssl_session_timeout 5m;</span><br><span class="line">    ssl_session_cache shared:SSL:10m;</span><br><span class="line">   ssl_protocols TLSv1 TLSv1.1 TLSv1.2 SSLv2 SSLv3;</span><br><span class="line">   ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;</span><br><span class="line">    ssl_prefer_server_ciphers on;</span><br><span class="line">    ssl_verify_client off;</span><br><span class="line">       # ssl_session_timeout 5m;</span><br><span class="line">       # ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照这个协议配置</span><br><span class="line">       # ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照这个套件配置</span><br><span class="line">       # ssl_prefer_server_ciphers on;</span><br><span class="line"></span><br><span class="line">location /wss &#123;</span><br><span class="line">proxy_redirect off;</span><br><span class="line">        proxy_pass http://127.0.0.1:8888; </span><br><span class="line">        proxy_set_header Host $host;</span><br><span class="line">        proxy_set_header X-Real_IP $remote_addr;</span><br><span class="line">        proxy_set_header X-Forwarded-For $remote_addr:$remote_port;</span><br><span class="line">        proxy_http_version 1.1;</span><br><span class="line">        proxy_set_header Upgrade $http_upgrade;</span><br><span class="line">        proxy_set_header Connection upgrade;</span><br><span class="line">proxy_read_timeout 60000s; </span><br><span class="line">        &#125;</span><br><span class="line">#下面的配置大同小异，基本就是制定项目的访问路径，照猫画虎即可。</span><br><span class="line">location /mblog&#123;</span><br><span class="line">proxy_set_header Host $host;</span><br><span class="line">proxy_pass http://127.0.0.1/mblog/;  </span><br><span class="line">client_max_body_size 200m;  </span><br><span class="line">proxy_set_header X-Forwarded-Proto  $scheme;  </span><br><span class="line">            #root   html; #站点目录，绝对路径</span><br><span class="line">           #        index  index.html index.htm;</span><br><span class="line">        &#125;</span><br><span class="line">location /ry &#123;</span><br><span class="line">proxy_set_header Host $host;</span><br><span class="line">proxy_pass http://127.0.0.1/ry;  </span><br><span class="line">client_max_body_size 200m;  </span><br><span class="line">proxy_set_header X-Forwarded-Proto  $scheme;  </span><br><span class="line">            #root   html; #站点目录，绝对路径</span><br><span class="line">           #        index  index.html index.htm;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">location /jeesite&#123;</span><br><span class="line">proxy_set_header Host $host;</span><br><span class="line">proxy_pass http://127.0.0.1:8080/jeesite/;    </span><br><span class="line">client_max_body_size 200m;</span><br><span class="line">proxy_set_header X-Forwarded-Proto  $scheme; </span><br><span class="line">proxy_redirect http:// $scheme://;  </span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">        #charset koi8-r;</span><br><span class="line"></span><br><span class="line">        #access_log  logs/host.access.log  main;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">        #error_page  404              /404.html;</span><br><span class="line"></span><br><span class="line">        # redirect server error pages to the static page /50x.html</span><br><span class="line">        #</span><br><span class="line">        error_page   500 502 503 504  /50x.html;</span><br><span class="line">        location = /50x.html &#123;</span><br><span class="line">            root   html;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        # proxy the PHP scripts to Apache listening on 127.0.0.1:80</span><br><span class="line">        #</span><br><span class="line">        #location ~ \.php$ &#123;</span><br><span class="line">        #    proxy_pass   http://127.0.0.1;</span><br><span class="line">        #&#125;</span><br><span class="line"></span><br><span class="line">        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000</span><br><span class="line">        #</span><br><span class="line">        #location ~ \.php$ &#123;</span><br><span class="line">        #    root           html;</span><br><span class="line">        #    fastcgi_pass   127.0.0.1:9000;</span><br><span class="line">        #    fastcgi_index  index.php;</span><br><span class="line">        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;</span><br><span class="line">        #    include        fastcgi_params;</span><br><span class="line">        #&#125;</span><br><span class="line"></span><br><span class="line">        # deny access to .htaccess files, if Apache&#x27;s document root</span><br><span class="line">        # concurs with nginx&#x27;s one</span><br><span class="line">        #</span><br><span class="line">        #location ~ /\.ht &#123;</span><br><span class="line">        #    deny  all;</span><br><span class="line">        #&#125;</span><br><span class="line">    &#125;</span><br></pre></td></tr></table></figure></p><h3 id="Nginx配置多域名在同一服务器"><a href="#Nginx配置多域名在同一服务器" class="headerlink" title="Nginx配置多域名在同一服务器"></a>Nginx配置多域名在同一服务器</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br></pre></td><td class="code"><pre><span class="line">server &#123;</span><br><span class="line">        listen       80;</span><br><span class="line">        server_name  xxx.xx xxx1.xx;</span><br><span class="line">charset utf-8;</span><br><span class="line">if ($host = &#x27;xxx.xx&#x27;)</span><br><span class="line">&#123;</span><br><span class="line">rewrite ^/(.*) https://xxx.xx/$1 permanent;</span><br><span class="line">&#125;</span><br><span class="line">if ($host = &#x27;xxx1.xx&#x27;)</span><br><span class="line">&#123;</span><br><span class="line">rewrite ^/(.*) https://xxx1.xx/$1 permanent;</span><br><span class="line">&#125;</span><br><span class="line">return 301 https://$host$request_uri;</span><br><span class="line"></span><br><span class="line">        location / &#123;</span><br><span class="line">            root   html;</span><br><span class="line">            index  index.html index.htm;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        error_page   500 502 503 504  /50x.html;</span><br><span class="line">        location = /50x.html &#123;</span><br><span class="line">            root   html;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">    &#125;</span><br><span class="line">    server &#123;</span><br><span class="line">        listen       443  ssl;</span><br><span class="line">        server_name  xxx1.xx;</span><br><span class="line">ssl_certificate xxx;  # 指定证书的位置，绝对路径</span><br><span class="line">        ssl_certificate_key xxx;  # 绝对路径，同上</span><br><span class="line"></span><br><span class="line">ssl_session_timeout 5m;</span><br><span class="line">    ssl_session_cache shared:SSL:10m;</span><br><span class="line">   ssl_protocols TLSv1 TLSv1.1 TLSv1.2 SSLv2 SSLv3;</span><br><span class="line">   ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;</span><br><span class="line">    ssl_prefer_server_ciphers on;</span><br><span class="line">    ssl_verify_client off;</span><br><span class="line">       # ssl_session_timeout 5m;</span><br><span class="line">       # ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照这个协议配置</span><br><span class="line">       # ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照这个套件配置</span><br><span class="line">       # ssl_prefer_server_ciphers on;</span><br><span class="line">location / &#123;</span><br><span class="line">#gzip_static on; # 静态压缩</span><br><span class="line">add_header Cache-Control public,max-age=60,s-maxage=60; # 配置缓存</span><br><span class="line">            proxy_pass http://127.0.0.1:xxxx/;</span><br><span class="line">proxy_set_header HOST $host;</span><br><span class="line">client_max_body_size 200m;</span><br><span class="line">proxy_set_header X-Forwarded-Proto $scheme;</span><br><span class="line">proxy_set_header X-Real-IP $remote_addr;</span><br><span class="line">proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">location /upload/ &#123;</span><br><span class="line">  access_log off;</span><br><span class="line">  # 域名白名单，去掉则阻止所有非本站请求</span><br><span class="line">  valid_referers none blocked server_names *.bbchin.com 127.0.0.1 localhost ~\.google\. ~\.baidu\. ~\.qq\.;</span><br><span class="line">  if ($invalid_referer) &#123;</span><br><span class="line">rewrite ^/ https://cdn.jsdelivr.net/gh/qinhua/cdn_assets/img/robber.jpg;</span><br><span class="line">  &#125;</span><br><span class="line">  proxy_pass http://127.0.0.1:xxxx;</span><br><span class="line">&#125;</span><br><span class="line">        error_page   500 502 503 504  /50x.html;</span><br><span class="line">        location = /50x.html &#123;</span><br><span class="line">            root   html;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">server &#123;</span><br><span class="line">listen       443  ssl;</span><br><span class="line">server_name  xxx.xx;</span><br><span class="line">ssl_certificate xxx;  # 指定证书的位置，绝对路径</span><br><span class="line">ssl_certificate_key xxx;  # 绝对路径，同上</span><br><span class="line"></span><br><span class="line">ssl_session_timeout 5m;</span><br><span class="line">ssl_session_cache shared:SSL:10m;</span><br><span class="line">ssl_protocols TLSv1 TLSv1.1 TLSv1.2 SSLv2 SSLv3;</span><br><span class="line">ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;</span><br><span class="line">ssl_prefer_server_ciphers on;</span><br><span class="line">ssl_verify_client off;</span><br><span class="line">   # ssl_session_timeout 5m;</span><br><span class="line">   # ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照这个协议配置</span><br><span class="line">   # ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照这个套件配置</span><br><span class="line">   # ssl_prefer_server_ciphers on;</span><br><span class="line">location / &#123;</span><br><span class="line">#gzip_static on; # 静态压缩</span><br><span class="line">add_header Cache-Control public,max-age=60,s-maxage=60; # 配置缓存</span><br><span class="line">proxy_pass http://127.0.0.1:xxxx/;</span><br><span class="line">proxy_set_header HOST $host;</span><br><span class="line">client_max_body_size 200m;</span><br><span class="line">proxy_set_header X-Forwarded-Proto $scheme;</span><br><span class="line">proxy_set_header X-Real-IP $remote_addr;</span><br><span class="line">proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;</span><br><span class="line">&#125;</span><br><span class="line">location /upload/ &#123;</span><br><span class="line">  access_log off;</span><br><span class="line">  # 域名白名单，去掉则阻止所有非本站请求</span><br><span class="line">  valid_referers none blocked server_names *.bbchin.com 127.0.0.1 localhost ~\.google\. ~\.baidu\. ~\.qq\.;</span><br><span class="line">  if ($invalid_referer) &#123;</span><br><span class="line">rewrite ^/ https://cdn.jsdelivr.net/gh/qinhua/cdn_assets/img/robber.jpg;</span><br><span class="line">  &#125;</span><br><span class="line">  proxy_pass http://127.0.0.1:xxxx;</span><br><span class="line">&#125;</span><br><span class="line">    &#125;</span><br></pre></td></tr></table></figure><h3 id="Nginx中Https不跳转Http解决方法"><a href="#Nginx中Https不跳转Http解决方法" class="headerlink" title="Nginx中Https不跳转Http解决方法"></a>Nginx中Https不跳转Http解决方法</h3><p>在代理中配置如下指令<br><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">proxy_redirect http:// $scheme://;</span><br></pre></td></tr></table></figure></p><blockquote><p><strong>以上指令会将后端响应header location内容中的http:替换成用户端协议https:。 NGINX访问https跳转到http的解决了~</strong></p></blockquote>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;Linux中nginx的安装&quot;&gt;&lt;a href=&quot;#Linux中nginx的安装&quot; class=&quot;headerlink&quot; title=&quot;Linux中nginx的安装&quot;&gt;&lt;/a&gt;Linux中nginx的安装&lt;/h2&gt;&lt;p&gt;首先是系统环境：CentOS7，Nginx版</summary>
      
    
    
    
    <category term="经验分享" scheme="http://hexo.sjava.cn/categories/%E7%BB%8F%E9%AA%8C%E5%88%86%E4%BA%AB/"/>
    
    
    <category term="CentOS" scheme="http://hexo.sjava.cn/tags/CentOS/"/>
    
    <category term="Nginx" scheme="http://hexo.sjava.cn/tags/Nginx/"/>
    
  </entry>
  
  <entry>
    <title>CentOS安装记录之固定IP</title>
    <link href="http://hexo.sjava.cn/posts/1.html"/>
    <id>http://hexo.sjava.cn/posts/1.html</id>
    <published>2024-07-18T13:50:48.000Z</published>
    <updated>2024-07-18T13:50:48.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="干货分享"><a href="#干货分享" class="headerlink" title="干货分享"></a>干货分享</h1><blockquote><p>安装完自己的CentOS系统之后，解决连接网络IP频繁变化的问题，在CentOS中设置固定的WiFi IP地址，通常需要编辑网络接口配置文件。以下是一个基于命令行的快速指南：(有线网络和这个操作也大差不差)</p></blockquote><ol><li>找到你的WiFi网络接口名称。<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">nmcli d</span><br></pre></td></tr></table></figure></li><li>编辑对应的网络配置文件。假设你的WiFi接口名称是<code>wlp3s0</code>，运行：<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo vi /etc/sysconfig/network-scripts/ifcfg-wlp3s0</span><br></pre></td></tr></table></figure></li><li>修改或添加以下内容：<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">BOOTPROTO=static</span><br><span class="line">ONBOOT=yes</span><br><span class="line">IPADDR=你的固定IP地址</span><br><span class="line">NETMASK=你的子网掩码</span><br><span class="line">GATEWAY=你的默认网关</span><br><span class="line">DNS1=首选DNS服务器</span><br><span class="line">DNS2=备用DNS服务器</span><br></pre></td></tr></table></figure></li><li>重启网络服务：<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo systemctl restart network</span><br></pre></td></tr></table></figure><blockquote><p>确保替换你的固定IP地址、你的子网掩码、你的默认网关、首选DNS服务器和备用DNS服务器为实际值。<br>以下是一个配置文件的示例：</p></blockquote></li></ol><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">DEVICE=wlp3s0</span><br><span class="line">TYPE=Wireless</span><br><span class="line">BOOTPROTO=static</span><br><span class="line">ONBOOT=yes</span><br><span class="line">IPADDR=192.168.1.100</span><br><span class="line">NETMASK=255.255.255.0</span><br><span class="line">GATEWAY=192.168.1.1</span><br><span class="line">DNS1=8.8.8.8</span><br><span class="line">DNS2=8.8.4.4</span><br></pre></td></tr></table></figure><p>保存文件并重启网络服务后，你的CentOS系统应该会使用新设置的静态IP地址连接到WiFi。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;干货分享&quot;&gt;&lt;a href=&quot;#干货分享&quot; class=&quot;headerlink&quot; title=&quot;干货分享&quot;&gt;&lt;/a&gt;干货分享&lt;/h1&gt;&lt;blockquote&gt;
&lt;p&gt;安装完自己的CentOS系统之后，解决连接网络IP频繁变化的问题，在CentOS中设置固定的WiF</summary>
      
    
    
    
    <category term="经验分享" scheme="http://hexo.sjava.cn/categories/%E7%BB%8F%E9%AA%8C%E5%88%86%E4%BA%AB/"/>
    
    
    <category term="CentOS" scheme="http://hexo.sjava.cn/tags/CentOS/"/>
    
    <category term="IP" scheme="http://hexo.sjava.cn/tags/IP/"/>
    
  </entry>
  
  <entry>
    <title>CentOS安装记录之无线网卡</title>
    <link href="http://hexo.sjava.cn/posts/12318.html"/>
    <id>http://hexo.sjava.cn/posts/12318.html</id>
    <published>2024-07-12T10:28:48.000Z</published>
    <updated>2024-07-12T10:28:48.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="干货分享"><a href="#干货分享" class="headerlink" title="干货分享"></a>干货分享</h1><blockquote><p>问题描述：自己刷了CentOS系统之后，重启之后无法自动连接WIFI，（PS：如果自己没有此项需求可以直接划走了~）所以需要做一个重启自动连接WIFI的功能，记录如下：</p></blockquote><h2 id="知道自己连接的WIFI名称以及WIFI密码"><a href="#知道自己连接的WIFI名称以及WIFI密码" class="headerlink" title="知道自己连接的WIFI名称以及WIFI密码"></a>知道自己连接的WIFI名称以及WIFI密码</h2><p>例如：<br>WIFI名称：Xiaomi_303<br>WIFI密码：303303303</p><h2 id="要求自身CentOS有以下命令符号功能-没有的及时下载好。"><a href="#要求自身CentOS有以下命令符号功能-没有的及时下载好。" class="headerlink" title="要求自身CentOS有以下命令符号功能,没有的及时下载好。"></a>要求自身CentOS有以下命令符号功能,没有的及时下载好。</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">yum</span><br><span class="line">nmcli</span><br><span class="line">vi/vim</span><br><span class="line">NetworkManage</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="在CentOS上自动连接WiFi通常涉及使用nmcli（NetworkManager的命令行界面）或者编辑WPA配置文件。以下是使用nmcli的方法："><a href="#在CentOS上自动连接WiFi通常涉及使用nmcli（NetworkManager的命令行界面）或者编辑WPA配置文件。以下是使用nmcli的方法：" class="headerlink" title="在CentOS上自动连接WiFi通常涉及使用nmcli（NetworkManager的命令行界面）或者编辑WPA配置文件。以下是使用nmcli的方法："></a>在CentOS上自动连接WiFi通常涉及使用nmcli（NetworkManager的命令行界面）或者编辑WPA配置文件。以下是使用nmcli的方法：</h2><ol><li>确定你的无线设备名称：<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">nmcli device</span><br></pre></td></tr></table></figure></li></ol><p><img src="https://docs.sjava.cn/pic/home/bl/img/U1/image.png" alt="image.png"></p><ol><li>连接到WiFi网络，你需要知道网络的SSID（服务集标识符）和密码：<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">nmcli device wifi connect &lt;SSID&gt; password &lt;password&gt;</span><br></pre></td></tr></table></figure></li></ol><h2 id="为了使连接在启动时自动完成，你可以创建一个systemd服务。"><a href="#为了使连接在启动时自动完成，你可以创建一个systemd服务。" class="headerlink" title="为了使连接在启动时自动完成，你可以创建一个systemd服务。"></a>为了使连接在启动时自动完成，你可以创建一个systemd服务。</h2><ol><li>创建一个新的systemd服务文件：</li></ol><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo vim /etc/systemd/system/wifi-connect.service</span><br></pre></td></tr></table></figure><ol><li>添加以下内容到服务文件中：</li></ol><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">[Unit]</span><br><span class="line">Description=Connect to WiFi</span><br><span class="line">After=network.target</span><br><span class="line"></span><br><span class="line">[Service]</span><br><span class="line">Type=oneshot</span><br><span class="line">ExecStart=/usr/bin/nmcli device wifi connect &lt;SSID&gt; password &lt;password&gt;</span><br><span class="line"></span><br><span class="line">[Install]</span><br><span class="line">WantedBy=multi-user.target</span><br></pre></td></tr></table></figure><p>替换<SSID>和<password>为你的WiFi网络的实际名称和密码。</p><ol><li>重新加载systemd以读取新的服务文件：</li></ol><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo systemctl daemon-reload</span><br></pre></td></tr></table></figure><ol><li>启用服务，使其在启动时运行：</li></ol><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo systemctl enable wifi-connect.service</span><br></pre></td></tr></table></figure><p>现在，每次启动时，CentOS将会自动连接到指定的WiFi网络。请确保你的WiFi网络不会改变SSID或者密码，否则你需要编辑服务文件并重新启动服务。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;干货分享&quot;&gt;&lt;a href=&quot;#干货分享&quot; class=&quot;headerlink&quot; title=&quot;干货分享&quot;&gt;&lt;/a&gt;干货分享&lt;/h1&gt;&lt;blockquote&gt;
&lt;p&gt;问题描述：自己刷了CentOS系统之后，重启之后无法自动连接WIFI，（PS：如果自己没有此项需求</summary>
      
    
    
    
    <category term="经验分享" scheme="http://hexo.sjava.cn/categories/%E7%BB%8F%E9%AA%8C%E5%88%86%E4%BA%AB/"/>
    
    
    <category term="CentOS" scheme="http://hexo.sjava.cn/tags/CentOS/"/>
    
    <category term="无线网卡" scheme="http://hexo.sjava.cn/tags/%E6%97%A0%E7%BA%BF%E7%BD%91%E5%8D%A1/"/>
    
  </entry>
  
  <entry>
    <title>QQ 2023年度报告来了，看看谁最关心你</title>
    <link href="http://hexo.sjava.cn/posts/13763.html"/>
    <id>http://hexo.sjava.cn/posts/13763.html</id>
    <published>2023-12-25T23:38:30.000Z</published>
    <updated>2023-12-25T23:38:26.000Z</updated>
    
    <content type="html"><![CDATA[<p>QQ 2023年度报告来了，看看谁最关心你<br>还有一周多时间就要告别2023年，迎来2024年了，各大互联网厂商最近在自家App中推出了年度总结、年度报告等，方便用户回顾一年使用App的情况。</p><p>日前，腾讯QQ正式上线2023年度报告，大家可在手机QQ中搜索“年度报告”</p><p>在报告中，用户能看到自己QQ的注册天数、今年共登录多少天、聊天最晚的时间、与多少好友聊过天，最爱用的表情、年度三大热聊好友，以及2023年新增好友数等信息。</p><p>你也快去看看自己的年度报告吧！~</p><div calss='anzhiyu-tag-link'><a class="tag-Link" target="_blank" href="https://ti.qq.com/qq-act/year_end_inventory_2023/index.html?_wwv=8192&_wv=16777216&from=3">    <div class="tag-link-tips">引用站外地址</div>    <div class="tag-link-bottom">        <div class="tag-link-left" style="background-image: url(https://pic.sjava.cn/halo/image-1703519333912.png)">          <i class="anzhiyufont anzhiyu-icon-link" style="display: none"></i>        </div>        <div class="tag-link-right">            <div class="tag-link-title">QQ年度报告</div>            <div class="tag-link-sitename">领取你的2023年度报告</div>        </div>        <i class="anzhiyufont anzhiyu-icon-angle-right"></i>    </div>    </a></div><div class="gallery">  <div class="fj-gallery page_img_lazyload lazyload btn_album_detail_lazyload data" data-rowHeight="220" data-limit="2">    <span class="gallery-data">[{"url":"https://pic.sjava.cn/halo/612a07c28ede2e3f3371717c6441aa35.jpg","alt":"612a07c28ede2e3f3371717c6441aa35"},{"url":"https://pic.sjava.cn/halo/0abde746bfaac240addb27542d3f750a.jpg","alt":"0abde746bfaac240addb27542d3f750a"},{"url":"https://pic.sjava.cn/halo/a08e2a9711336b21ea44623503a0c77a.jpg","alt":"a08e2a9711336b21ea44623503a0c77a"},{"url":"https://pic.sjava.cn/halo/7fb5af6a829475fd456a17c1b9983b68.jpg","alt":"7fb5af6a829475fd456a17c1b9983b68"}]</span>  </div><button class="gallery-load-more" style="opacity:0">  <span>加载更多</span>  <i class="anzhiyufont anzhiyu-icon-arrow-down"></i>  </button></div>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;QQ 2023年度报告来了，看看谁最关心你&lt;br&gt;还有一周多时间就要告别2023年，迎来2024年了，各大互联网厂商最近在自家App中推出了年度总结、年度报告等，方便用户回顾一年使用App的情况。&lt;/p&gt;
&lt;p&gt;日前，腾讯QQ正式上线2023年度报告，大家可在手机QQ中搜索</summary>
      
    
    
    
    <category term="趣闻" scheme="http://hexo.sjava.cn/categories/%E8%B6%A3%E9%97%BB/"/>
    
    
    <category term="QQ" scheme="http://hexo.sjava.cn/tags/QQ/"/>
    
  </entry>
  
  <entry>
    <title>Intellij IDEA激活码,IDEA稳定专属激活码</title>
    <link href="http://hexo.sjava.cn/posts/52072.html"/>
    <id>http://hexo.sjava.cn/posts/52072.html</id>
    <published>2023-12-02T21:50:28.000Z</published>
    <updated>2023-12-02T21:50:32.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Intellij-IDEA正版专属激活码领取（永久更新）"><a href="#Intellij-IDEA正版专属激活码领取（永久更新）" class="headerlink" title="Intellij IDEA正版专属激活码领取（永久更新）"></a>Intellij IDEA正版专属激活码领取（永久更新）</h1><div class="tip sync"><p>本教程最新更新时间: <strong>2023年11月26日</strong></p></div><h2 id="下面激活码直接复制粘贴到activation-code即可激活软件，如果是新的版本，换新激活码的时候code-with-me也要激活一次"><a href="#下面激活码直接复制粘贴到activation-code即可激活软件，如果是新的版本，换新激活码的时候code-with-me也要激活一次" class="headerlink" title="下面激活码直接复制粘贴到activation code即可激活软件，如果是新的版本，换新激活码的时候code with me也要激活一次"></a>下面激活码直接复制粘贴到activation code即可激活软件，如果是新的版本，换新激活码的时候code with me也要激活一次</h2><div class="tip info"><p>下面是网页提供的正版激活，会给大家一直更新的，直接复制粘贴到activation code即可激活</p><p>更换新激活码的时候如果还显示suspended，用新激活码再激活一次即可</p><p>激活后如果显示key is invalid，这是因为你破解过软件的原因，请按如下操作<br>打开软件，help edit VM options ，删掉最下面一行的javaagent，重启软件即可<br>（如果是较新的版本Intellij IDEA和Code with me都要激活一次）</p></div><div class="tabs" id=""><ul class="nav-tabs"><button type="button" class="tab  active" data-href="-1">2018.2~2023版本</button><button type="button" class="tab " data-href="-2">2018.1以下版本</button></ul><div class="tab-contents"><div class="tab-item-content active" id="-1"><p>I2A0QUY8VU-eyJsaWNlbnNlSWQiOiJJMkEwUVVZOFZVIiwibGljZW5zZWVOYW1lIjoiVU5JVkVSU0lEQURFIEVTVEFEVUFMIERFIENBTVBJTkFTIiwiYXNzaWduZWVOYW1lIjoiVGFvYmFv77yaSkVU5YWo5a625qG25r+AIOa0u+W3peS9nOWupCAgcmVuIHpodW4gZGlhbiBtaW5n77yBIiwiYXNzaWduZWVFbWFpbCI6IlJvYmJ5X1dlbmlnZXJAb3V0bG9vay5jb20iLCJsaWNlbnNlUmVzdHJpY3Rpb24iOiJGb3IgZWR1Y2F0aW9uYWwgdXNlIG9ubHkiLCJjaGVja0NvbmN1cnJlbnRVc2UiOmZhbHNlLCJwcm9kdWN0cyI6W3siY29kZSI6IkRQTiIsInBhaWRVcFRvIjoiMjAyNC0xMC0xNCIsImV4dGVuZGVkIjpmYWxzZX0seyJjb2RlIjoiREIiLCJwYWlkVXBUbyI6IjIwMjQtMTAtMTQiLCJleHRlbmRlZCI6ZmFsc2V9LHsiY29kZSI6IlBTIiwicGFpZFVwVG8iOiIyMDI0LTEwLTE0IiwiZXh0ZW5kZWQiOmZhbHNlfSx7ImNvZGUiOiJJSSIsInBhaWRVcFRvIjoiMjAyNC0xMC0xNCIsImV4dGVuZGVkIjpmYWxzZX0seyJjb2RlIjoiUlNDIiwicGFpZFVwVG8iOiIyMDI0LTEwLTE0IiwiZXh0ZW5kZWQiOnRydWV9LHsiY29kZSI6IkdPIiwicGFpZFVwVG8iOiIyMDI0LTEwLTE0IiwiZXh0ZW5kZWQiOmZhbHNlfSx7ImNvZGUiOiJETSIsInBhaWRVcFRvIjoiMjAyNC0xMC0xNCIsImV4dGVuZGVkIjpmYWxzZX0seyJjb2RlIjoiUlNGIiwicGFpZFVwVG8iOiIyMDI0LTEwLTE0IiwiZXh0ZW5kZWQiOnRydWV9LHsiY29kZSI6IkRTIiwicGFpZFVwVG8iOiIyMDI0LTEwLTE0IiwiZXh0ZW5kZWQiOmZhbHNlfSx7ImNvZGUiOiJQQyIsInBhaWRVcFRvIjoiMjAyNC0xMC0xNCIsImV4dGVuZGVkIjpmYWxzZX0seyJjb2RlIjoiUkMiLCJwYWlkVXBUbyI6IjIwMjQtMTAtMTQiLCJleHRlbmRlZCI6ZmFsc2V9LHsiY29kZSI6IkNMIiwicGFpZFVwVG8iOiIyMDI0LTEwLTE0IiwiZXh0ZW5kZWQiOmZhbHNlfSx7ImNvZGUiOiJXUyIsInBhaWRVcFRvIjoiMjAyNC0xMC0xNCIsImV4dGVuZGVkIjpmYWxzZX0seyJjb2RlIjoiUkQiLCJwYWlkVXBUbyI6IjIwMjQtMTAtMTQiLCJleHRlbmRlZCI6ZmFsc2V9LHsiY29kZSI6IlJTMCIsInBhaWRVcFRvIjoiMjAyNC0xMC0xNCIsImV4dGVuZGVkIjpmYWxzZX0seyJjb2RlIjoiUk0iLCJwYWlkVXBUbyI6IjIwMjQtMTAtMTQiLCJleHRlbmRlZCI6ZmFsc2V9LHsiY29kZSI6IlJTViIsInBhaWRVcFRvIjoiMjAyNC0xMC0xNCIsImV4dGVuZGVkIjp0cnVlfSx7ImNvZGUiOiJEQyIsInBhaWRVcFRvIjoiMjAyNC0xMC0xNCIsImV4dGVuZGVkIjpmYWxzZX0seyJjb2RlIjoiUlNVIiwicGFpZFVwVG8iOiIyMDI0LTEwLTE0IiwiZXh0ZW5kZWQiOmZhbHNlfSx7ImNvZGUiOiJEUCIsInBhaWRVcFRvIjoiMjAyNC0xMC0xNCIsImV4dGVuZGVkIjp0cnVlfSx7ImNvZGUiOiJQREIiLCJwYWlkVXBUbyI6IjIwMjQtMTAtMTQiLCJleHRlbmRlZCI6dHJ1ZX0seyJjb2RlIjoiUFNJIiwicGFpZFVwVG8iOiIyMDI0LTEwLTE0IiwiZXh0ZW5kZWQiOnRydWV9LHsiY29kZSI6IlBDV01QIiwicGFpZFVwVG8iOiIyMDI0LTEwLTE0IiwiZXh0ZW5kZWQiOnRydWV9LHsiY29kZSI6IlJTIiwicGFpZFVwVG8iOiIyMDI0LTEwLTE0IiwiZXh0ZW5kZWQiOnRydWV9XSwibWV0YWRhdGEiOiIwMTIwMjMxMDE4TFBBQTAwMjAwOSIsImhhc2giOiI1MDY4MjM4OC8yNDQxMzAzMDotMjMxNDI0MDkzIiwiZ3JhY2VQZXJpb2REYXlzIjo3LCJhdXRvUHJvbG9uZ2F0ZWQiOmZhbHNlLCJpc0F1dG9Qcm9sb25nYXRlZCI6ZmFsc2V9-TVABo8WPqQXMBwop9hR4Jao5zPeU6ZWd/B4k0rUtT8YptqYZ0qcyA1w928ovkigORlHy4uIHKc75EmfkDc7V8jLUEyysKr3XGrJe/0ghkGtqTUaZ47SWiqm6TCR21PG2CtfByT0jZjw6AspsWqwyGmFeZAKfXkuAzmJ6psJOeZvaFn4qzzkjzCDdOGOdUXPEPdkG1t4a+rxgt4Ly06yEcpFpy87mx5SO/F9sus2/ZHnVCISqRQBil8hvYsQKP9TScHjyGe6I9KhRofs2SuUHe3+Wh5cSTQH4wy6mJZP+7ImX76BnOqjPWOh4sJwUJ+I+IfjOV4iG5bu25YNV9DF2eA==-MIIETDCCAjSgAwIBAgIBDzANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDDA1KZXRQcm9maWxlIENBMB4XDTIyMTAxMDE2MDU0NFoXDTI0MTAxMTE2MDU0NFowHzEdMBsGA1UEAwwUcHJvZDJ5LWZyb20tMjAyMjEwMTAwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC/W3uCpU5M2y48rUR/3fFR6y4xj1nOm3rIuGp2brELVGzdgK2BezjnDXpAxVDw5657hBkAUMoyByiDs2MgmVi9IcqdAwpk988/Daaajq9xuU1of59jH9eQ9c3BmsEtdA4boN3VpenYKATwmpKYkJKVc07ZKoXL6kSyZuF7Jq7HoQZcclChbF75QJPGbri3cw9vDk/e46kuzfwpGftvl6+vKibpInO6Dv0ocwImDbOutyZC7E+BwpEm1TJZW4XovMBegHhWC04cJvpH1u98xoR94ichw0jKhdppywARe43rGU96163RckIuFmFDQKZV9SMUrwpQFu4Z2D5yTNqnlLRfAgMBAAGjgZkwgZYwCQYDVR0TBAIwADAdBgNVHQ4EFgQU5FZqQ4gnVc+inIeZF+o3ID+VhcEwSAYDVR0jBEEwP4AUo562SGdCEjZBvW3gubSgUouX8bOhHKQaMBgxFjAUBgNVBAMMDUpldFByb2ZpbGUgQ0GCCQDSbLGDsoN54TATBgNVHSUEDDAKBggrBgEFBQcDATALBgNVHQ8EBAMCBaAwDQYJKoZIhvcNAQELBQADggIBANLG1anEKid4W87vQkqWaQTkRtFKJ2GFtBeMhvLhIyM6Cg3FdQnMZr0qr9mlV0w289pf/+M14J7S7SgsfwxMJvFbw9gZlwHvhBl24N349GuthshGO9P9eKmNPgyTJzTtw6FedXrrHV99nC7spaY84e+DqfHGYOzMJDrg8xHDYLLHk5Q2z5TlrztXMbtLhjPKrc2+ZajFFshgE5eowfkutSYxeX8uA5czFNT1ZxmDwX1KIelbqhh6XkMQFJui8v8Eo396/sN3RAQSfvBd7Syhch2vlaMP4FAB11AlMKO2x/1hoKiHBU3oU3OKRTfoUTfy1uH3T+t03k1Qkr0dqgHLxiv6QU5WrarR9tx/dapqbsSmrYapmJ7S5+ghc4FTWxXJB1cjJRh3X+gwJIHjOVW+5ZVqXTG2s2Jwi2daDt6XYeigxgL2SlQpeL5kvXNCcuSJurJVcRZFYUkzVv85XfDauqGxYqaehPcK2TzmcXOUWPfxQxLJd2TrqSiO+mseqqkNTb3ZDiYS/ZqdQoGYIUwJqXo+EDgqlmuWUhkWwCkyo4rtTZeAj+nP00v3n8JmXtO30Fip+lxpfsVR3tO1hk4Vi2kmVjXyRkW2G7D7WAVt+91ahFoSeRWlKyb4KcvGvwUaa43fWLem2hyI4di2pZdr3fcYJ3xvL5ejL3m14bKsfoOv</p></div><div class="tab-item-content" id="-2"><p>N5ZD3FF9AY-eyJsaWNlbnNlSWQiOiJONVpEM0ZGOUFZIiwibGljZW5zZWVOYW1lIjoiSmV0QnJhaW4gQ29kZSIsImFzc2lnbmVlTmFtZSI6IiIsImFzc2lnbmVlRW1haWwiOiIiLCJsaWNlbnNlUmVzdHJpY3Rpb24iOiIiLCJjaGVja0NvbmN1cnJlbnRVc2UiOmZhbHNlLCJwcm9kdWN0cyI6W3siY29kZSI6IkRQTiIsImZhbGxiYWNrRGF0ZSI6IjIwMjMtMDMtMDUiLCJwYWlkVXBUbyI6IjIwMjQtMDMtMDQifSx7ImNvZGUiOiJEQiIsImZhbGxiYWNrRGF0ZSI6IjIwMjMtMDMtMDUiLCJwYWlkVXBUbyI6IjIwMjQtMDMtMDQifSx7ImNvZGUiOiJQUyIsImZhbGxiYWNrRGF0ZSI6IjIwMjMtMDMtMDUiLCJwYWlkVXBUbyI6IjIwMjQtMDMtMDQifSx7ImNvZGUiOiJJSSIsImZhbGxiYWNrRGF0ZSI6IjIwMjMtMDMtMDUiLCJwYWlkVXBUbyI6IjIwMjQtMDMtMDQifSx7ImNvZGUiOiJSU0MiLCJmYWxsYmFja0RhdGUiOiIyMDIzLTAzLTA1IiwicGFpZFVwVG8iOiIyMDI0LTAzLTA0In0seyJjb2RlIjoiR08iLCJmYWxsYmFja0RhdGUiOiIyMDIzLTAzLTA1IiwicGFpZFVwVG8iOiIyMDI0LTAzLTA0In0seyJjb2RlIjoiRE0iLCJmYWxsYmFja0RhdGUiOiIyMDIzLTAzLTA1IiwicGFpZFVwVG8iOiIyMDI0LTAzLTA0In0seyJjb2RlIjoiUlNGIiwiZmFsbGJhY2tEYXRlIjoiMjAyMy0wMy0wNSIsInBhaWRVcFRvIjoiMjAyNC0wMy0wNCJ9LHsiY29kZSI6IkRTIiwiZmFsbGJhY2tEYXRlIjoiMjAyMy0wMy0wNSIsInBhaWRVcFRvIjoiMjAyNC0wMy0wNCJ9LHsiY29kZSI6IlBDIiwiZmFsbGJhY2tEYXRlIjoiMjAyMy0wMy0wNSIsInBhaWRVcFRvIjoiMjAyNC0wMy0wNCJ9LHsiY29kZSI6IlJDIiwiZmFsbGJhY2tEYXRlIjoiMjAyMy0wMy0wNSIsInBhaWRVcFRvIjoiMjAyNC0wMy0wNCJ9LHsiY29kZSI6IkNMIiwiZmFsbGJhY2tEYXRlIjoiMjAyMy0wMy0wNSIsInBhaWRVcFRvIjoiMjAyNC0wMy0wNCJ9LHsiY29kZSI6IldTIiwiZmFsbGJhY2tEYXRlIjoiMjAyMy0wMy0wNSIsInBhaWRVcFRvIjoiMjAyNC0wMy0wNCJ9LHsiY29kZSI6IlJEIiwiZmFsbGJhY2tEYXRlIjoiMjAyMy0wMy0wNSIsInBhaWRVcFRvIjoiMjAyNC0wMy0wNCJ9LHsiY29kZSI6IlJTMCIsImZhbGxiYWNrRGF0ZSI6IjIwMjMtMDMtMDUiLCJwYWlkVXBUbyI6IjIwMjQtMDMtMDQifSx7ImNvZGUiOiJSTSIsImZhbGxiYWNrRGF0ZSI6IjIwMjMtMDMtMDUiLCJwYWlkVXBUbyI6IjIwMjQtMDMtMDQifSx7ImNvZGUiOiJBQyIsImZhbGxiYWNrRGF0ZSI6IjIwMjMtMTItMzEiLCJwYWlkVXBUbyI6IjIwMjQtMDMtMDQifSx7ImNvZGUiOiJSU1YiLCJmYWxsYmFja0RhdGUiOiIyMDIzLTAzLTA1IiwicGFpZFVwVG8iOiIyMDI0LTAzLTA0In0seyJjb2RlIjoiREMiLCJmYWxsYmFja0RhdGUiOiIyMDIzLTAzLTA1IiwicGFpZFVwVG8iOiIyMDI0LTAzLTA0In0seyJjb2RlIjoiUlNVIiwiZmFsbGJhY2tEYXRlIjoiMjAyMy0wMy0wNSIsInBhaWRVcFRvIjoiMjAyNC0wMy0wNCJ9LHsiY29kZSI6IkRQIiwiZmFsbGJhY2tEYXRlIjoiMjAyMy0wMy0wNSIsInBhaWRVcFRvIjoiMjAyNC0wMy0wNCJ9LHsiY29kZSI6IlBEQiIsImZhbGxiYWNrRGF0ZSI6IjIwMjMtMDMtMDUiLCJwYWlkVXBUbyI6IjIwMjQtMDMtMDQifSx7ImNvZGUiOiJQV1MiLCJmYWxsYmFja0RhdGUiOiIyMDIzLTEyLTMxIiwicGFpZFVwVG8iOiIyMDI0LTAzLTA0In0seyJjb2RlIjoiUFNJIiwiZmFsbGJhY2tEYXRlIjoiMjAyMy0xMi0zMSIsInBhaWRVcFRvIjoiMjAyNC0wMy0wNCJ9LHsiY29kZSI6IlBQUyIsImZhbGxiYWNrRGF0ZSI6IjIwMjMtMDMtMDUiLCJwYWlkVXBUbyI6IjIwMjQtMDMtMDQifSx7ImNvZGUiOiJQQ1dNUCIsInBhaWRVcFRvIjoiMjAyNC0wMy0wNCJ9LHsiY29kZSI6IlBHTyIsImZhbGxiYWNrRGF0ZSI6IjIwMjMtMDMtMDUiLCJwYWlkVXBUbyI6IjIwMjQtMDMtMDQifSx7ImNvZGUiOiJQUEMiLCJmYWxsYmFja0RhdGUiOiIyMDIzLTAzLTA1IiwicGFpZFVwVG8iOiIyMDI0LTAzLTA0In0seyJjb2RlIjoiUFJCIiwiZmFsbGJhY2tEYXRlIjoiMjAyMy0wMy0wNSIsInBhaWRVcFRvIjoiMjAyNC0wMy0wNCJ9LHsiY29kZSI6IlBTVyIsImZhbGxiYWNrRGF0ZSI6IjIwMjMtMTItMzEiLCJwYWlkVXBUbyI6IjIwMjQtMDMtMDQifSx7ImNvZGUiOiJSUyIsImZhbGxiYWNrRGF0ZSI6IjIwMjMtMDMtMDUiLCJwYWlkVXBUbyI6IjIwMjQtMDMtMDQifV0sImhhc2giOiI0MzU2MTExOS8wOi0xMDcyMjgwMjg0IiwiZ3JhY2VQZXJpb2REYXlzIjo3LCJhdXRvUHJvbG9uZ2F0ZWQiOmZhbHNlLCJpc0F1dG9Qcm9sb25nYXRlZCI6ZmFsc2V9-cfV+swGZjRdoCV47ddNRcv0m6p10Kc1Qg487903TUcjT6b7chh2byiKPWJ9cqhD5C/voMsuarPV4GdQ3qIfNQov79mImkvajQD1jBCJL7ISDlvUsHZeMGkLL90g0nW2Xeov3NcUj2wgiO9GydcHPLzuvakze0ZNQ6d1181iNwghxgM4CdbPoW4r0RFEn+op1ISdnJNCATGRcp3lfSoOP/Mye1wbJm3r8WGlU2Trs5cHK+Nu3/SzHdO8WzZp7GjW2aTqTJSh4OKmHm1dA9ZULTRatWjLJY3i3lEzqECyNBm7Lty9o4i4uhRBhj583kMyOAzIEDyFUdVC9CWPHxu0lJA==-MIIETDCCAjSgAwIBAgIBDzANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDDA1KZXRQcm9maWxlIENBMB4XDTIyMTAxMDE2MDU0NFoXDTI0MTAxMTE2MDU0NFowHzEdMBsGA1UEAwwUcHJvZDJ5LWZyb20tMjAyMjEwMTAwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC/W3uCpU5M2y48rUR/3fFR6y4xj1nOm3rIuGp2brELVGzdgK2BezjnDXpAxVDw5657hBkAUMoyByiDs2MgmVi9IcqdAwpk988/Daaajq9xuU1of59jH9eQ9c3BmsEtdA4boN3VpenYKATwmpKYkJKVc07ZKoXL6kSyZuF7Jq7HoQZcclChbF75QJPGbri3cw9vDk/e46kuzfwpGftvl6+vKibpInO6Dv0ocwImDbOutyZC7E+BwpEm1TJZW4XovMBegHhWC04cJvpH1u98xoR94ichw0jKhdppywARe43rGU96163RckIuFmFDQKZV9SMUrwpQFu4Z2D5yTNqnlLRfAgMBAAGjgZkwgZYwCQYDVR0TBAIwADAdBgNVHQ4EFgQU5FZqQ4gnVc+inIeZF+o3ID+VhcEwSAYDVR0jBEEwP4AUo562SGdCEjZBvW3gubSgUouX8bOhHKQaMBgxFjAUBgNVBAMMDUpldFByb2ZpbGUgQ0GCCQDSbLGDsoN54TATBgNVHSUEDDAKBggrBgEFBQcDATALBgNVHQ8EBAMCBaAwDQYJKoZIhvcNAQELBQADggIBANLG1anEKid4W87vQkqWaQTkRtFKJ2GFtBeMhvLhIyM6Cg3FdQnMZr0qr9mlV0w289pf/+M14J7S7SgsfwxMJvFbw9gZlwHvhBl24N349GuthshGO9P9eKmNPgyTJzTtw6FedXrrHV99nC7spaY84e+DqfHGYOzMJDrg8xHDYLLHk5Q2z5TlrztXMbtLhjPKrc2+ZajFFshgE5eowfkutSYxeX8uA5czFNT1ZxmDwX1KIelbqhh6XkMQFJui8v8Eo396/sN3RAQSfvBd7Syhch2vlaMP4FAB11AlMKO2x/1hoKiHBU3oU3OKRTfoUTfy1uH3T+t03k1Qkr0dqgHLxiv6QU5WrarR9tx/dapqbsSmrYapmJ7S5+ghc4FTWxXJB1cjJRh3X+gwJIHjOVW+5ZVqXTG2s2Jwi2daDt6XYeigxgL2SlQpeL5kvXNCcuSJurJVcRZFYUkzVv85XfDauqGxYqaehPcK2TzmcXOUWPfxQxLJd2TrqSiO+mseqqkNTb3ZDiYS/ZqdQoGYIUwJqXo+EDgqlmuWUhkWwCkyo4rtTZeAj+nP00v3n8JmXtO30Fip+lxpfsVR3tO1hk4Vi2kmVjXyRkW2G7D7WAVt+91ahFoSeRWlKyb4KcvGvwUaa43fWLem2hyI4di2pZdr3fcYJ3xvL5ejL3m14bKsfoOv</p></div></div><div class="tab-to-top"><button type="button" aria-label="scroll to top"><i class="anzhiyufont anzhiyu-icon-arrow-up"></i></button></div></div>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;Intellij-IDEA正版专属激活码领取（永久更新）&quot;&gt;&lt;a href=&quot;#Intellij-IDEA正版专属激活码领取（永久更新）&quot; class=&quot;headerlink&quot; title=&quot;Intellij IDEA正版专属激活码领取（永久更新）&quot;&gt;&lt;/a&gt;In</summary>
      
    
    
    
    <category term="稳定更新" scheme="http://hexo.sjava.cn/categories/%E7%A8%B3%E5%AE%9A%E6%9B%B4%E6%96%B0/"/>
    
    
    <category term="IDEA" scheme="http://hexo.sjava.cn/tags/IDEA/"/>
    
    <category term="JET" scheme="http://hexo.sjava.cn/tags/JET/"/>
    
  </entry>
  
  <entry>
    <title>宝塔面板开心破解版分享</title>
    <link href="http://hexo.sjava.cn/posts/42005.html"/>
    <id>http://hexo.sjava.cn/posts/42005.html</id>
    <published>2023-11-11T16:50:37.000Z</published>
    <updated>2023-11-11T16:50:37.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="感谢大家使用该脚本，本脚本未加密，有没有后门大家自己看就知道了，仅仅将官方的脚本本地化了，未经任何修改，请放心使用！"><a href="#感谢大家使用该脚本，本脚本未加密，有没有后门大家自己看就知道了，仅仅将官方的脚本本地化了，未经任何修改，请放心使用！" class="headerlink" title="感谢大家使用该脚本，本脚本未加密，有没有后门大家自己看就知道了，仅仅将官方的脚本本地化了，未经任何修改，请放心使用！"></a>感谢大家使用该脚本，本脚本未加密，有没有后门大家自己看就知道了，仅仅将官方的脚本本地化了，未经任何修改，请放心使用！</h2><h2 id="本次脚本支持：Centos-7、Debian、Ubuntu、Fedora！"><a href="#本次脚本支持：Centos-7、Debian、Ubuntu、Fedora！" class="headerlink" title="本次脚本支持：Centos 7、Debian、Ubuntu、Fedora！"></a>本次脚本支持：Centos 7、Debian、Ubuntu、Fedora！</h2><p><img src="https://lsky.sjava.cn/i/2025/09/29/68da2147ee0e2.png" alt=""></p><div class="tip success"><p>已安装（开心版）：请在面板上点击 “更新” 或者 “修复” 升级到最新版</p></div><h2 id="注意事项"><a href="#注意事项" class="headerlink" title="注意事项"></a>注意事项</h2><div class="tip ban"><p>问：为什么企业版没永久？<br>答：因为官方就没有永久呀，只有专业版有！<br>注意：每次更新 企业版授权 以更新日期为准保持 一年授权 （例如：2021.11.30 日更新 授权到期时间 2021.11.30 不要在有人问一年后到期了怎么办 每次更新 会以更新日期为准 保持一年授权）</p><p>注意：如果你是影视站用户，我不建议你使用本面板，众所周知，大部分的影视程序都是有广告 js，后门等，有些用户会认为是本面板导致，甚至有人抹黑本面板，所以建议你使用官方版，或者使用本面板之前先百度/Google 下影视站后门问题！！！</p></div><h1 id="更新日志"><a href="#更新日志" class="headerlink" title="更新日志"></a>更新日志</h1><details class="folding-tag" yellow><summary> 2023-10-08 </summary>              <div class='content'>              <p>【增加】[首页-安全风险]增加检测报告<br>【增加】[网站-PHP项目]增加Nginx/Apache运行状态展示<br>【增加】[网站-Java/node/go/python/其他]项目端口新增检测验证和放行端口功能<br>【增加】[数据库-MySQL]增加MySQL运行状态展示<br>【增加】[日志-面板日志]增加面板IP操作统计功能<br>【增加】[计划任务]支持除MySQL外其它类型数据库备份<br>【增加】[计划任务]计划任务列表增加置顶功能<br>【增加】[计划任务]支持批量备份网站/数据库备份<br>【增加】[面板设置-临时访问授权]增加删除过期授权的功能<br>【增加】[软件商店-MySQL]新增二进制日志模块<br>【修复】[网站-Java项目/Node项目]在添加域名时出现检查错误的问题<br>【修复】[网站-Python项目]模块管理中安装模块报错的问题<br>【修复】[网站-Python项目]申请测试证书报错的问题<br>【修复】[数据库-PgSQL]修改远程服务器密码时未验证密码的正确性<br>【修复】[文件]点击分页报404错误<br>【修复】[软件商店-Apache]的keepalive参数不能修改问题<br>【修复】修复因gevent库无法使用导致面板无法访问的问题<br>【调整】新装宝塔面板系统防火墙规则列表添加默认规则<br>【调整】处理SSL为空时宝塔面板无法启动的问题<br>【调整】[文件]上传文件文件名长度调整为256个字节<br>【调整】[网站]备份时自动备份与手动备份保存路径一致<br>【优化】[数据库-MySQL]加载缓慢<br>【优化】[面板设置-告警通知]整合<br>【其他】修复已知Bug</p>              </div>            </details><details class="folding-tag" yellow><summary> 2023-08-23 </summary>              <div class='content'>              <p>【增加】[首页-状态]增加告警设置功能<br>【增加】[首页-安全风险]增加系统漏洞扫描功能(暂不支持Debian系统)<br>【增加】[网站-php项目]新增批量设置伪静态功能<br>【增加】[网站-python项目]部署ssl功能<br>【增加】[计划任务]执行周期在十分钟以内，增加flock锁<br>【修复】[网站-node项目]开启外网映射报错的问题<br>【修复】[网站-Java项目]自定义日志路径不生效问题<br>【修复】[网站-python项目]管理建立uwsgi服务的项目时，未同步配置内容的问题<br>【修复】[文件]面板未删除超过15天的备份数据<br>【修复】[文件]部分情况下上传文件会报错<br>【修复】[文件]部分情况下解压压缩文件目录结构不正确<br>【修复】[文件]双击”计算“按钮，会自动进入文件夹<br>【修复】[文件]软链接的目标文件删除后，删除链接接不成功<br>【修复】[计划任务]自动备份不备份软链接的源文件的问题<br>【修复】[软件商店]因index.json文件异常导致软件商店点击已安装报错的问题<br>【调整】[首页-安全风险]移除SSH密码失效检查<br>【调整】[面板设置]设置临时授权添加删除过期授权的功能<br>【优化】[网站-php项目] 流量限制的限制方案显示<br>【其他】修复已知Bug</p>              </div>            </details><details class="folding-tag" yellow><summary> 2025-09-29 </summary>              <div class='content'>              <p>【其他】更新安装命令</p>              </div>            </details><div class="tip success"><p>已安装宝塔官网（免费版）：直接执行下面的 “Linux 面板 8.0.3 升级命令”</p></div><h2 id="安装命令如下"><a href="#安装命令如下" class="headerlink" title="安装命令如下"></a>安装命令如下</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">Linux面板 8.0.3 升级企业版命令 1（7.9.10 官方版 / 7.9.8 开心版 可以执行这个升级到 8.0.3 开心版）：</span><br><span class="line">curl https://io.bt.sy/install/update_panel.sh|bash</span><br><span class="line">Linux面板 8.0.3 升级企业版命令 2（7.9.10 官方版 / 7.9.8 开心版 可以执行这个升级到 8.0.3 开心版）：</span><br><span class="line">curl http://io.bt.sy/install/update6.sh|bash</span><br><span class="line">二选一即可</span><br></pre></td></tr></table></figure><hr><h2 id="更新安装命令"><a href="#更新安装命令" class="headerlink" title="更新安装命令"></a>更新安装命令</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">Linux面板 9.3.0 升级企业版命令 1（9.3.0 官方版 / 9.2.0 开心版 可以执行这个升级到 9.3.0 开心版）：</span><br><span class="line">curl https://io.bt.sy/install/update_panel.sh|bash</span><br><span class="line">讲解：升级企业版命令 1  与  升级企业版命令 2 二选一 都可以升级最新版！</span><br><span class="line">Linux面板 9.3.0 升级企业版命令 2（9.3.0 官方版 / 9.2.0 开心版 可以执行这个升级到 9.3.0 开心版）：</span><br><span class="line">curl http://io.bt.sy/install/update6.sh|bash</span><br></pre></td></tr></table></figure><h2 id="一键将非官方版本还原到官方最新版："><a href="#一键将非官方版本还原到官方最新版：" class="headerlink" title="一键将非官方版本还原到官方最新版："></a>一键将非官方版本还原到官方最新版：</h2><blockquote><p>如果不想再用开心版了，就可以用下面的命令一键还原到官方的最新版本</p></blockquote><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">curl http://download.bt.cn/install/update6.sh|bash</span><br></pre></td></tr></table></figure><div class="tip success"><p>本站只做分享哈，不是作者。感谢您的来访，获取更多精彩文章请收藏本站。 </p></div>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;感谢大家使用该脚本，本脚本未加密，有没有后门大家自己看就知道了，仅仅将官方的脚本本地化了，未经任何修改，请放心使用！&quot;&gt;&lt;a href=&quot;#感谢大家使用该脚本，本脚本未加密，有没有后门大家自己看就知道了，仅仅将官方的脚本本地化了，未经任何修改，请放心使用！&quot; cl</summary>
      
    
    
    
    <category term="经验分享" scheme="http://hexo.sjava.cn/categories/%E7%BB%8F%E9%AA%8C%E5%88%86%E4%BA%AB/"/>
    
    
    <category term="宝塔" scheme="http://hexo.sjava.cn/tags/%E5%AE%9D%E5%A1%94/"/>
    
    <category term="破解" scheme="http://hexo.sjava.cn/tags/%E7%A0%B4%E8%A7%A3/"/>
    
  </entry>
  
  <entry>
    <title>可免费试用的ChatGPT方式分享</title>
    <link href="http://hexo.sjava.cn/posts/13113.html"/>
    <id>http://hexo.sjava.cn/posts/13113.html</id>
    <published>2023-11-08T22:53:38.000Z</published>
    <updated>2023-11-08T22:53:43.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="基于此文章的第二个项目实现免费GPT的使用"><a href="#基于此文章的第二个项目实现免费GPT的使用" class="headerlink" title="基于此文章的第二个项目实现免费GPT的使用"></a>基于此文章的第二个项目实现免费GPT的使用</h1><div calss='anzhiyu-tag-link'><a class="tag-Link" target="_blank" href="https://hexo.sjava.cn/posts/27941.html">    <div class="tag-link-tips">引用站外地址</div>    <div class="tag-link-bottom">        <div class="tag-link-left" style="background-image: url(https://hexo.sjava.cn/img/pic.png)">          <i class="anzhiyufont anzhiyu-icon-link" style="display: none"></i>        </div>        <div class="tag-link-right">            <div class="tag-link-title">ChatGPT</div>            <div class="tag-link-sitename"> 免费搭建自己的私人ChatGPT小助手</div>        </div>        <i class="anzhiyufont anzhiyu-icon-angle-right"></i>    </div>    </a></div><h1 id="免费试用教程（在搭建好ChatGPT-NEXT-Web的基础上）"><a href="#免费试用教程（在搭建好ChatGPT-NEXT-Web的基础上）" class="headerlink" title="免费试用教程（在搭建好ChatGPT-NEXT-Web的基础上）"></a>免费试用教程（在搭建好ChatGPT-NEXT-Web的基础上）</h1><h2 id="能够正常访问的必要条件"><a href="#能够正常访问的必要条件" class="headerlink" title="能够正常访问的必要条件"></a>能够正常访问的必要条件</h2><ol><li>设置3.5 </li><li>设置Key:OPENAI_API_KEY：API key <a href="https://api.chatanywhere.org/v1/oauth/free/github/render">点此获取</a>,<strong>免费key，约60次/小时</strong></li><li>设置访问地址：OPENAI_API_BASE_URL：<a href="https://api.chatanywhere.com.cn">https://api.chatanywhere.com.cn</a> (国内选用这个)</li></ol><h2 id="在ChatGPT-NEXT-Web设置之后就可以正常访问了"><a href="#在ChatGPT-NEXT-Web设置之后就可以正常访问了" class="headerlink" title="在ChatGPT-NEXT-Web设置之后就可以正常访问了"></a>在ChatGPT-NEXT-Web设置之后就可以正常访问了</h2><p><img src="https://lsky.sjava.cn/i/2025/09/29/68d9f6eb94a0a.png" alt="image-1698992411778"></p><blockquote><p>对你有帮助的话记得分享给你的小伙伴哦~ </p></blockquote>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;基于此文章的第二个项目实现免费GPT的使用&quot;&gt;&lt;a href=&quot;#基于此文章的第二个项目实现免费GPT的使用&quot; class=&quot;headerlink&quot; title=&quot;基于此文章的第二个项目实现免费GPT的使用&quot;&gt;&lt;/a&gt;基于此文章的第二个项目实现免费GPT的使用&lt;/</summary>
      
    
    
    
    <category term="经验分享" scheme="http://hexo.sjava.cn/categories/%E7%BB%8F%E9%AA%8C%E5%88%86%E4%BA%AB/"/>
    
    
    <category term="ChatGPT" scheme="http://hexo.sjava.cn/tags/ChatGPT/"/>
    
  </entry>
  
  <entry>
    <title>阿里云服务器学生合集，赶快看过来！！！</title>
    <link href="http://hexo.sjava.cn/posts/31839.html"/>
    <id>http://hexo.sjava.cn/posts/31839.html</id>
    <published>2023-10-31T22:12:22.000Z</published>
    <updated>2023-11-20T02:01:28.000Z</updated>
    
    <content type="html"><![CDATA[<div class="tip success"><p>本人只是对近期活动做了归纳总结方便小伙伴们按需购买，并无其他目的，请悉知。</p></div><h1 id="阿里云一年一度11-11优惠"><a href="#阿里云一年一度11-11优惠" class="headerlink" title="阿里云一年一度11.11优惠"></a>阿里云一年一度11.11优惠</h1><p>点击文字进行跳转：<a href="https://www.aliyun.com/minisite/goods?userCode=4iqo7rle">新老用户99买2C2G服务器地址，续费同价，最多可以买4年！</a></p><h1 id="阿里云学生优惠合集"><a href="#阿里云学生优惠合集" class="headerlink" title="阿里云学生优惠合集"></a>阿里云学生优惠合集</h1><div class="tip success"><p>需要先认证学生</p></div><h2 id="白嫖7个月服务器！！！用力戳这里！！！-花心"><a href="#白嫖7个月服务器！！！用力戳这里！！！-花心" class="headerlink" title="白嫖7个月服务器！！！用力戳这里！！！ ::(花心) "></a>白嫖7个月服务器！！！<a href="https://developer.aliyun.com/plan/student">用力戳这里！！！ ::(花心) </a></h2><p>操作步骤按照下面的图示链接走就可以了</p><ul><li>首先认证成功领取1个月服务器<br><img src="https://pic.sjava.cn/halo/image-1700382222998.png" alt="lp1b65we.png"></li><li>完成两个任务后领取6个月免费续约资格，直接0元续费即可获得一共7个月的服务器<br><img src="https://pic.sjava.cn/halo/image-1700382232021.png" alt="lp1b9ddz.png"><br>完成任务的同时还可以获得阿里云的证书一份，虽然本身没啥用，哈哈哈~<br><img src="https://pic.sjava.cn/halo/image-1700382215127.png" alt="lp1bcbxz.png"></li></ul><h2 id="新人-老人均可99元续费同价2C2G3M服务器优惠-请用力戳这里！！！-哈哈"><a href="#新人-老人均可99元续费同价2C2G3M服务器优惠-请用力戳这里！！！-哈哈" class="headerlink" title="新人/老人均可99元续费同价2C2G3M服务器优惠 请用力戳这里！！！ ::(哈哈)  "></a>新人/老人均可99元续费同价2C2G3M服务器优惠 <a href="https://www.aliyun.com/minisite/goods?userCode=4iqo7rle">请用力戳这里！！！ ::(哈哈)  </a></h2><details class="folding-tag" yellow><summary> 99元续费同价2C2G3M活动规则，点击此处展开查看明细 </summary>              <div class='content'>              <p><strong>活动时间</strong><br>2023年10月31日0点0分0秒至2026年3月31日23点59分59秒；</p><p><strong>活动对象</strong><br>满足以下全部条件的阿里云用户：<br>1、阿里云注册会员用户；<br>2、完成阿里云企业认证或个人认证用户；<br>3、符合活动规则的新老用户，均可参与。</p><p><strong>低价权益参与规则</strong><br>1、活动范围：<br>购买指定配置“e实例2核2G 3M固定带宽 40G ESSD entry 系统盘”可享受包1年99元，活动地域包含北京，杭州，上海，张家口，呼和浩特，深圳，成都，河源，乌兰察布，广州。<br>2、活动说明：<br>同一用户，同一个时间内，只可保有一个参与“低价长效”优惠实例，到期后在活动时间范围内可持续以低价续费保有，另购使用官网价。本次优惠不可与优惠券叠加使用。</p><p><strong>购买场景</strong><br>1、新购场景：<br>在符合参与规则的情况下，直接低价购买指定配置产品，有效期1年。若无法购买，请确认是否存在同人或其他实例已占用等情况。<br>2、续费场景：<br>在活动时间内，指定配置每年最多可以以优惠价格续费1次，1次1年，直到活动时间结束持续享受续费优惠。<br>备注：若续费其他实例时使用了低价权益，原低价产品实例将无法再享受低价权益。<br>3、退订场景：<br>支持五天无理由退款，退款后保留“低价长效”优惠资格，在活动时间范围内可再次使用低价购买活动配置；<br>4、变配场景：<br>变配至“低价长效优惠”指定配置时当前付费周期不享受低价权益，续费时可享受包1年99元优惠；“低价长效优惠”指定配置发生变配/升级/降配操作后，变配需按照官网价补差价，请仔细阅读变配页面引导及相关资费说明，但仍占用权益资格直到该实例释放，购买相同规格产品不能再享受低价，同时续费时也不再享受包1年99元优惠；<br>5、如用户账号有欠费，需先补足欠费再进行购买。<br>6、低价权益产品仅供账号本人使用，不允许过户转让。<br>7、如在参与“低价长效”优惠过程中，使用其他收费产品/功能，则需按照产品/功能标准资费支付超额产生的费用。<br>8、其他规则：<br>阿里云有权根据业务需求，随时调整提供给用户低价购买的产品范围、产品数量、产品配置、购买规则等，用户应以购买时相关页面的展示内容为准，但不影响用户在活动规则调整前已经获得的权益。<br>禁止使用产品来挖掘货币，如您使用产品来挖掘货币，可能会被收取费用及取消权益资格。<br>为保证活动的公平公正，如用户在活动中存在隐瞒、虚构、作弊、欺诈或通过其他非正常手段规避活动规则、获取不当利益的行为，例如：作弊领取、恶意套现、网络攻击、虚假交易等，阿里云有权收回相关权益、取消用户的活动参与资格，撤销违规交易，必要时追究违规用户的法律责任。</p><p><strong>相关名词及解释</strong><br>1、“阿里云官网”，是指包含域名为 <a href="https://www.aliyun.com/">https://www.aliyun.com/</a> 的网站以及阿里云客户端，如APP，但阿里云国际站，包括alibabacloud.com以及所有下属页面和jp.aliyun.com以及所有下属页面除外。<br>2、“同一用户”，是指根据不同阿里云账号在注册、登录、使用中的关联信息，阿里云判断其实际为同一用户。关联信息举例：同一手机号、同一邮箱、同一证件等。<br>3、“同人账号”，是指同一用户拥有多个阿里云账号的，各个账号之间互为同人账号。<br>4、“新用户”，是指在阿里云官网没有收费云产品购买记录的阿里云会员用户。新用户在进行首次云产品购买行为时，也被称为“首购用户”。<br>5、“老用户”，是指在阿里云官网已有收费云产品购买记录的阿里云会员用户。<br>6、“云产品”，是指阿里云官网售卖的中国大陆节点的产品和服务，但不包括域名、虚拟主机、云市场产品、专有云产品，云通信产品。<br>7、“指定云产品”，是指某场具体活动页面列举的活动云产品。<br>8、活动中涉及“打折”、“折扣”、“×折”或“省××元”，是指将本活动期间的某款产品的活动价格，与无任何活动期间的相同产品的日常最小单位售价（例如：月价），按相同购买时长进行比较后，所获得的比较结果。<br>9、活动涉及的“划线价”、“日常价”，通常是指该产品曾经展示过的销售价，并非原价，仅供参考。具体活动页面单独对“划线价”、“日常价”进行说明的，以其表述为准。<br>10、除非有相反证据证明外，用户参与活动所获得的全部权益和相应责任，均归属于参与活动的该阿里云账号所对应的实名认证主体。<br>11、活动中的“天”、“日”、“工作日”等均指该日的0点至24点（北京时间）。<br>12、阿里云可以根据活动的实际情况对活动规则进行变动或调整，相关变动或调整将公布在活动页面上，并于公布时即时生效；但不影响用户在活动规则调整前已经获得的权益。您购买阿里云单项产品时，亦应遵守该产品法律服务协议。<br>13、活动页面提到的“核” ，均指vcpu。</p>              </div>            </details><h2 id="新人1元注册域名-请猛戳这里"><a href="#新人1元注册域名-请猛戳这里" class="headerlink" title="新人1元注册域名 请猛戳这里"></a>新人1元注册域名 <a href="https://www.aliyun.com/activity/allinaliyun/zxqyyy">请猛戳这里</a></h2><p><img src="https://pic.sjava.cn/halo/image-1700382240711.png" alt="lp1d8dpd.png"></p><h2 id="更多活动请登录阿里云官网查看哈"><a href="#更多活动请登录阿里云官网查看哈" class="headerlink" title="更多活动请登录阿里云官网查看哈~"></a>更多活动请登录阿里云官网查看哈~</h2>]]></content>
    
    
      
      
    <summary type="html">&lt;div class=&quot;tip success&quot;&gt;&lt;p&gt;本人只是对近期活动做了归纳总结方便小伙伴们按需购买，并无其他目的，请悉知。&lt;/p&gt;
&lt;/div&gt;
&lt;h1 id=&quot;阿里云一年一度11-11优惠&quot;&gt;&lt;a href=&quot;#阿里云一年一度11-11优惠&quot; class=&quot;header</summary>
      
    
    
    
    <category term="经验分享" scheme="http://hexo.sjava.cn/categories/%E7%BB%8F%E9%AA%8C%E5%88%86%E4%BA%AB/"/>
    
    
    <category term="阿里云" scheme="http://hexo.sjava.cn/tags/%E9%98%BF%E9%87%8C%E4%BA%91/"/>
    
    <category term="服务器" scheme="http://hexo.sjava.cn/tags/%E6%9C%8D%E5%8A%A1%E5%99%A8/"/>
    
  </entry>
  
  <entry>
    <title>宝塔Nginx免费防火墙拦截发布的文章的解决办法</title>
    <link href="http://hexo.sjava.cn/posts/41556.html"/>
    <id>http://hexo.sjava.cn/posts/41556.html</id>
    <published>2023-09-27T20:31:01.000Z</published>
    <updated>2023-09-27T20:31:01.000Z</updated>
    
    <content type="html"><![CDATA[<p>虽然很多大佬对于宝塔面板里的Nginx免费防火墙表示不屑，我承认它确实有些拉跨（但是毕竟免费的，也不好意思提什么要求），但是对于一名个人站长来说，买专业的防火墙不是很划算，这款免费网络防火墙最合适不过了，有一定的安全防护效果，也可以通过自定义让它好用。</p><h2 id="描述问题"><a href="#描述问题" class="headerlink" title="描述问题"></a>描述问题</h2><p>博主经常发的文章里都带有代码，开启了Nginx免费防火墙之后，发现被拦截了导致发布不出去。</p><blockquote><p>您的请求带有不合法参数，已被网站管理员设置拦截！<br>可能原因：<br>您提交的内容包含危险的攻击请求</p></blockquote><p><img src="https://pic.sjava.cn/halo/image-1695660002224.png" alt="1"></p><h2 id="分析问题"><a href="#分析问题" class="headerlink" title="分析问题"></a>分析问题</h2><p>查看Nginx防火墙后台看到如下信息<br><img src="https://pic.sjava.cn/halo/image-1695660070923.png" alt="2"></p><h2 id="解决问题"><a href="#解决问题" class="headerlink" title="解决问题"></a>解决问题</h2><ol><li>如上图中有<code>url加白</code>，顾名思义就是把当前请求的URL加白名单，跳过这些校验。此方法可以解决本次提交保存不了的问题。</li><li>参考下图中的开关，针对性的把其中的校验关掉即可。<br><img src="https://pic.sjava.cn/halo/image-1695660356595.png" alt="3"></li></ol>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;虽然很多大佬对于宝塔面板里的Nginx免费防火墙表示不屑，我承认它确实有些拉跨（但是毕竟免费的，也不好意思提什么要求），但是对于一名个人站长来说，买专业的防火墙不是很划算，这款免费网络防火墙最合适不过了，有一定的安全防护效果，也可以通过自定义让它好用。&lt;/p&gt;
&lt;h2 id</summary>
      
    
    
    
    <category term="经验分享" scheme="http://hexo.sjava.cn/categories/%E7%BB%8F%E9%AA%8C%E5%88%86%E4%BA%AB/"/>
    
    
    <category term="宝塔" scheme="http://hexo.sjava.cn/tags/%E5%AE%9D%E5%A1%94/"/>
    
    <category term="防火墙" scheme="http://hexo.sjava.cn/tags/%E9%98%B2%E7%81%AB%E5%A2%99/"/>
    
    <category term="文章" scheme="http://hexo.sjava.cn/tags/%E6%96%87%E7%AB%A0/"/>
    
  </entry>
  
  <entry>
    <title>SpringBoot项目集成QuartzJob任务</title>
    <link href="http://hexo.sjava.cn/posts/36354.html"/>
    <id>http://hexo.sjava.cn/posts/36354.html</id>
    <published>2023-09-17T02:02:46.000Z</published>
    <updated>2023-09-17T02:02:50.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="场景描述"><a href="#场景描述" class="headerlink" title="场景描述"></a>场景描述</h1><p>在项目的实际场景中，我们经常会遇到一些任务需要每天、每周、或者固定时间去执行，所以在项目中加入Quartz框架，来更好的对这些事情做管理，只需要配置任务对应的CORN表达式，添加到任务里面即可让他自动化的实现对任务的管理。</p><h1 id="集成教程"><a href="#集成教程" class="headerlink" title="集成教程"></a>集成教程</h1><h2 id="1-项目POM文件中引入依赖"><a href="#1-项目POM文件中引入依赖" class="headerlink" title="1. 项目POM文件中引入依赖"></a>1. 项目POM文件中引入依赖</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">&lt;dependency&gt;</span><br><span class="line">    &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;</span><br><span class="line">    &lt;artifactId&gt;spring-boot-starter-quartz&lt;/artifactId&gt;</span><br><span class="line">&lt;/dependency&gt;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="2-在项目application-properties中新增如下配置"><a href="#2-在项目application-properties中新增如下配置" class="headerlink" title="2. 在项目application.properties中新增如下配置"></a>2. 在项目<code>application.properties</code>中新增如下配置</h2><blockquote><p>注意：<br>1、如果需要quartz 第一次运行时自动生成 quartz 所需的表那么 quartzJob? 后面的配置为 ：allowMultiQueries=true&amp;useUnicode=true&amp;characterEncoding=UTF-8&amp;useSSL=false&amp;serverTimezone=Asia/Shanghai<br>待第一次运行后可以再根据自己的需要修改<br>2、配置文件中的 initialize-schema: always 配置的 always 属性意思是，每次初始化都会重新生成表(执行一次删除，执行一次创建)，生成后，可以修改为 never<br>只有以上两个条件同时配置满足，才能使quartz 在第一次运行时，自动生成所需的表</p></blockquote><figure class="highlight properties"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment">#  quartz定时任务,采用数据库方式  如果需要quartz 第一次运行时自动生成 quartz 所需的表那么 quartzJob? 后面的配置为 ：allowMultiQueries=true&amp;useUnicode=true&amp;characterEncoding=UTF-8&amp;useSSL=false&amp;serverTimezone=Asia/Shanghai</span></span><br><span class="line"><span class="attr">spring.quartz.job-store-type</span>=<span class="string">jdbc</span></span><br><span class="line"><span class="comment"># ?配置文件中的 initialize-schema: always 配置的 always 属性意思是，每次初始化都会重新生成表(执行一次删除，执行一次创建)，生成后，可以修改为 never</span></span><br><span class="line"><span class="attr">spring.quartz.jdbc.initialize-schema</span>=<span class="string">never</span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment"># 时任务启动开关，true-开  false-关</span></span><br><span class="line"><span class="attr">spring.quartz.auto-startup</span>=<span class="string">true</span></span><br><span class="line"><span class="comment">#??1???????</span></span><br><span class="line"><span class="attr">spring.quartz.startup-delay</span>=<span class="string">1s</span></span><br><span class="line"></span><br><span class="line"><span class="attr">spring.quartz.overwrite-existing-jobs</span>=<span class="string">true</span></span><br><span class="line"><span class="comment"># Quartz Scheduler Properties</span></span><br><span class="line"><span class="attr">spring.quartz.properties.org.quartz.scheduler.instanceName</span> = <span class="string">MyScheduler</span></span><br><span class="line"><span class="attr">spring.quartz.properties.org.quartz.scheduler.instanceId</span> = <span class="string">AUTO</span></span><br><span class="line"></span><br><span class="line"><span class="attr">spring.quartz.properties.org.quartz.jobStore.class</span> = <span class="string">org.springframework.scheduling.quartz.LocalDataSourceJobStore</span></span><br><span class="line"><span class="attr">spring.quartz.properties.org.quartz.jobStore.driverDelegateClass</span> = <span class="string">org.quartz.impl.jdbcjobstore.StdJDBCDelegate</span></span><br><span class="line"><span class="comment"># ??????</span></span><br><span class="line"><span class="attr">spring.quartz.properties.org.quartz.jobStore.tablePrefix</span> = <span class="string">QRTZ_</span></span><br><span class="line"><span class="attr">spring.quartz.properties.org.quartz.jobStore.isClustered</span> = <span class="string">true</span></span><br><span class="line"><span class="attr">spring.quartz.properties.org.quartz.jobStore.misfireThreshold</span> = <span class="string">12000</span></span><br><span class="line"><span class="attr">spring.quartz.properties.org.quartz.jobStore.clusterCheckinInterval</span> = <span class="string">15000</span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment"># ????????</span></span><br><span class="line"><span class="attr">spring.quartz.properties.org.quartz.threadPool.class</span> = <span class="string">org.quartz.simpl.SimpleThreadPool</span></span><br><span class="line"><span class="attr">spring.quartz.properties.org.quartz.threadPool.threadCount</span> = <span class="string">1</span></span><br><span class="line"><span class="attr">spring.quartz.properties.org.quartz.threadPool.threadPriority</span> = <span class="string">5</span></span><br><span class="line"><span class="attr">spring.quartz.properties.org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread</span> = <span class="string">true</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="上面配置好之后，启动项目会直接在对应链接的数据库下生成11张默认的表，均是以QRTZ开头，如下图"><a href="#上面配置好之后，启动项目会直接在对应链接的数据库下生成11张默认的表，均是以QRTZ开头，如下图" class="headerlink" title="上面配置好之后，启动项目会直接在对应链接的数据库下生成11张默认的表，均是以QRTZ开头，如下图"></a>上面配置好之后，启动项目会直接在对应链接的数据库下生成11张默认的表，均是以QRTZ开头，如下图</h3><p><img src="https://lsky.sjava.cn/i/2025/09/29/68d9f783b2a56.png" alt="数据表图"></p><h2 id="3-在生成的表上我们还需要新增一张自己添加任务的配置表，具体如下"><a href="#3-在生成的表上我们还需要新增一张自己添加任务的配置表，具体如下" class="headerlink" title="3. 在生成的表上我们还需要新增一张自己添加任务的配置表，具体如下"></a>3. 在生成的表上我们还需要新增一张自己添加任务的配置表，具体如下</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">CREATE TABLE `sys_quartz_job` (</span><br><span class="line">  `id` bigint(20) NOT NULL AUTO_INCREMENT,</span><br><span class="line">  `create_by` varchar(32) DEFAULT NULL COMMENT &#x27;创建人&#x27;,</span><br><span class="line">  `create_time` datetime DEFAULT NULL COMMENT &#x27;创建时间&#x27;,</span><br><span class="line">  `del_flag` int(11) DEFAULT NULL COMMENT &#x27;删除状态&#x27;,</span><br><span class="line">  `update_by` varchar(32) DEFAULT NULL COMMENT &#x27;修改人&#x27;,</span><br><span class="line">  `update_time` datetime DEFAULT NULL COMMENT &#x27;修改时间&#x27;,</span><br><span class="line">  `job_class_name` varchar(255) DEFAULT NULL COMMENT &#x27;任务类名&#x27;,</span><br><span class="line">  `cron_expression` varchar(255) DEFAULT NULL COMMENT &#x27;cron表达式&#x27;,</span><br><span class="line">  `parameter` varchar(255) DEFAULT NULL COMMENT &#x27;参数&#x27;,</span><br><span class="line">  `meeting_record_id` int(11) DEFAULT NULL COMMENT &#x27;会议室记录id&#x27;,</span><br><span class="line">  `description` varchar(255) DEFAULT NULL COMMENT &#x27;描述&#x27;,</span><br><span class="line">  `status` int(11) DEFAULT NULL COMMENT &#x27;状态 0正常 -1停止&#x27;,</span><br><span class="line">  PRIMARY KEY (`id`) USING BTREE</span><br><span class="line">) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;</span><br></pre></td></tr></table></figure><h2 id="4-添加代码，补充Quartz的功能"><a href="#4-添加代码，补充Quartz的功能" class="headerlink" title="4. 添加代码，补充Quartz的功能"></a>4. 添加代码，补充Quartz的功能</h2><blockquote><p>此处功能是可以实现对定时任务的管理，比如添加、删除、重新配置、立即执行定时任务等。</p></blockquote><h3 id="Controller类"><a href="#Controller类" class="headerlink" title="Controller类"></a>Controller类</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// Controller类</span></span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span>: 定时任务</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@RestController</span></span><br><span class="line"><span class="meta">@RequestMapping(&quot;/sys/quartzJob&quot;)</span></span><br><span class="line"><span class="meta">@Slf4j</span></span><br><span class="line"><span class="meta">@Api(tags = &quot;定时任务接口&quot;)</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">QuartzJobController</span> &#123;</span><br><span class="line">    <span class="meta">@Autowired</span></span><br><span class="line">    <span class="keyword">private</span> QuartzJobService quartzJobService;</span><br><span class="line">    <span class="meta">@Autowired</span></span><br><span class="line">    <span class="keyword">private</span> Scheduler scheduler;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 分页列表查询</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> quartzJob</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> page</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> pageSize</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="meta">@ApiOperation(value = &quot;分页列表查询&quot;, notes = &quot;分页列表查询&quot;)</span></span><br><span class="line">    <span class="meta">@RequestMapping(value = &quot;/list&quot;, method = RequestMethod.GET)</span></span><br><span class="line">    <span class="keyword">public</span> ApiResult <span class="title function_">queryPageList</span><span class="params">(QuartzJob quartzJob, <span class="meta">@RequestParam(value = &quot;page&quot;, defaultValue = &quot;1&quot;)</span> <span class="type">int</span> page,</span></span><br><span class="line"><span class="params">                                   <span class="meta">@RequestParam(value = &quot;pageSize&quot;, defaultValue = &quot;20&quot;)</span> <span class="type">int</span> pageSize)</span> &#123;</span><br><span class="line">        Page&lt;QuartzJob&gt; list = quartzJobService.selectList(quartzJob,page,pageSize);</span><br><span class="line">        <span class="type">ApiResult</span> <span class="variable">apiResult</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ApiResult</span>();</span><br><span class="line">        <span class="keyword">if</span> (CollectionUtils.isNotEmpty(list.getItems()))&#123;</span><br><span class="line">            apiResult.setData(list);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> ApiResult.ok(<span class="string">&quot;list&quot;</span>,list);</span><br><span class="line"></span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 添加定时任务</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> quartzJob</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="comment">//@RequiresRoles(&quot;admin&quot;)</span></span><br><span class="line">    <span class="meta">@ApiOperation(value = &quot;添加定时任务&quot;, notes = &quot;添加定时任务&quot;)</span></span><br><span class="line">    <span class="meta">@RequestMapping(value = &quot;/add&quot;, method = RequestMethod.POST)</span></span><br><span class="line">    <span class="keyword">public</span> ApiResult <span class="title function_">add</span><span class="params">(<span class="meta">@RequestBody</span> QuartzJob quartzJob)</span> &#123;</span><br><span class="line">        <span class="type">boolean</span> <span class="variable">b</span> <span class="operator">=</span> quartzJobService.saveAndScheduleJob(quartzJob);</span><br><span class="line">        <span class="keyword">if</span> (b == <span class="literal">true</span>) &#123;</span><br><span class="line">            <span class="keyword">return</span> ApiResult.ok(<span class="string">&quot;add&quot;</span>);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> ApiResult.fail(<span class="string">&quot;add&quot;</span>,<span class="string">&quot;添加定时任务失败&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 更新定时任务</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> quartzJob</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="comment">//@RequiresRoles(&quot;admin&quot;)</span></span><br><span class="line">    <span class="meta">@ApiOperation(value = &quot;更新定时任务&quot;, notes = &quot;更新定时任务&quot;)</span></span><br><span class="line">    <span class="meta">@RequestMapping(value = &quot;/edit&quot;, method =&#123;RequestMethod.PUT, RequestMethod.POST&#125;)</span></span><br><span class="line">    <span class="keyword">public</span> ApiResult <span class="title function_">eidt</span><span class="params">(<span class="meta">@RequestBody</span> QuartzJob quartzJob)</span> &#123;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            quartzJobService.editAndScheduleJob(quartzJob);</span><br><span class="line">        &#125; <span class="keyword">catch</span> (SchedulerException e) &#123;</span><br><span class="line">            log.error(e.getMessage(),e);</span><br><span class="line">            <span class="keyword">return</span> ApiResult.fail(<span class="string">&quot;edit&quot;</span>,<span class="string">&quot;更新定时任务失败!&quot;</span>);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> ApiResult.ok(<span class="string">&quot;edit&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 通过id删除</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> id</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="meta">@ApiOperation(value = &quot;通过id删除&quot;, notes = &quot;通过id删除&quot;)</span></span><br><span class="line">    <span class="meta">@RequestMapping(value = &quot;/delete&quot;, method = RequestMethod.DELETE)</span></span><br><span class="line">    <span class="keyword">public</span> ApiResult <span class="title function_">delete</span><span class="params">(<span class="meta">@RequestParam(name = &quot;id&quot;, required = true)</span> String id)</span> &#123;</span><br><span class="line">        <span class="type">QuartzJob</span> <span class="variable">quartzJob</span> <span class="operator">=</span> quartzJobService.getById(Long.valueOf(id));</span><br><span class="line">        <span class="keyword">if</span> (quartzJob == <span class="literal">null</span>) &#123;</span><br><span class="line">            <span class="keyword">return</span> ApiResult.fail(<span class="string">&quot;delete&quot;</span>,<span class="string">&quot;未找到对应实体&quot;</span>);</span><br><span class="line">        &#125;</span><br><span class="line">        quartzJobService.deleteAndStopJob(Long.valueOf(id));</span><br><span class="line">        <span class="keyword">return</span> ApiResult.ok(<span class="string">&quot;delete&quot;</span>);</span><br><span class="line"></span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 批量删除</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> ids</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="meta">@ApiOperation(value = &quot;批量删除&quot;, notes = &quot;批量删除&quot;)</span></span><br><span class="line">    <span class="meta">@RequestMapping(value = &quot;/deleteBatch&quot;, method = RequestMethod.DELETE)</span></span><br><span class="line">    <span class="keyword">public</span> ApiResult <span class="title function_">deleteBatch</span><span class="params">(<span class="meta">@RequestParam(name = &quot;ids&quot;, required = true)</span> String ids)</span> &#123;</span><br><span class="line">        <span class="keyword">if</span> (ids == <span class="literal">null</span> || <span class="string">&quot;&quot;</span>.equals(ids.trim())) &#123;</span><br><span class="line">            <span class="keyword">return</span> ApiResult.fail(<span class="string">&quot;deleteBatch&quot;</span>,<span class="string">&quot;参数不识别！&quot;</span>);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">for</span> (String id : Arrays.asList(ids.split(<span class="string">&quot;,&quot;</span>))) &#123;</span><br><span class="line">            <span class="type">QuartzJob</span> <span class="variable">job</span> <span class="operator">=</span> quartzJobService.getById(Long.valueOf(id));</span><br><span class="line">            quartzJobService.deleteAndStopJob(Long.valueOf(id));</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> ApiResult.ok(<span class="string">&quot;deleteBatch&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 暂停定时任务</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> id</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="meta">@GetMapping(value = &quot;/pause&quot;)</span></span><br><span class="line">    <span class="meta">@ApiOperation(value = &quot;停止定时任务&quot;)</span></span><br><span class="line">    <span class="keyword">public</span> ApiResult <span class="title function_">pauseJob</span><span class="params">(<span class="meta">@RequestParam(name = &quot;id&quot;)</span> String id)</span> &#123;</span><br><span class="line">        <span class="type">QuartzJob</span> <span class="variable">job</span> <span class="operator">=</span> quartzJobService.getById(Long.valueOf(id));</span><br><span class="line">        <span class="keyword">if</span> (job == <span class="literal">null</span>) &#123;</span><br><span class="line">            <span class="keyword">return</span> ApiResult.fail(<span class="string">&quot;pause&quot;</span>,<span class="string">&quot;定时任务不存在！&quot;</span>);</span><br><span class="line">        &#125;</span><br><span class="line">        quartzJobService.pause(job);</span><br><span class="line">        <span class="keyword">return</span> ApiResult.ok(<span class="string">&quot;pause&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 启动定时任务</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> id</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="meta">@GetMapping(value = &quot;/resume&quot;)</span></span><br><span class="line">    <span class="meta">@ApiOperation(value = &quot;启动定时任务&quot;)</span></span><br><span class="line">    <span class="keyword">public</span> ApiResult <span class="title function_">resumeJob</span><span class="params">(<span class="meta">@RequestParam(name = &quot;id&quot;)</span> String id)</span> &#123;</span><br><span class="line">        <span class="type">QuartzJob</span> <span class="variable">job</span> <span class="operator">=</span> quartzJobService.getById(Long.valueOf(id));</span><br><span class="line">        <span class="keyword">if</span> (job == <span class="literal">null</span>) &#123;</span><br><span class="line">            <span class="keyword">return</span> ApiResult.fail(<span class="string">&quot;resume&quot;</span>,<span class="string">&quot;定时任务不存在！&quot;</span>);</span><br><span class="line">        &#125;</span><br><span class="line">        quartzJobService.resumeJob(job);</span><br><span class="line">        <span class="comment">//scheduler.resumeJob(JobKey.jobKey(job.getJobClassName().trim()));</span></span><br><span class="line">        <span class="keyword">return</span> ApiResult.ok(<span class="string">&quot;resume&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 通过id查询</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> id</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="meta">@ApiOperation(value = &quot;通过id查询&quot;, notes = &quot;通过id查询&quot;)</span></span><br><span class="line">    <span class="meta">@RequestMapping(value = &quot;/queryById&quot;, method = RequestMethod.GET)</span></span><br><span class="line">    <span class="keyword">public</span> ApiResult <span class="title function_">queryById</span><span class="params">(<span class="meta">@RequestParam(name = &quot;id&quot;, required = true)</span> String id)</span> &#123;</span><br><span class="line">        <span class="type">QuartzJob</span> <span class="variable">quartzJob</span> <span class="operator">=</span> quartzJobService.getById(Long.valueOf(id));</span><br><span class="line">        <span class="type">ApiResult</span> <span class="variable">apiResult</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ApiResult</span>();</span><br><span class="line">        apiResult.setData(quartzJob);</span><br><span class="line">        <span class="keyword">return</span> apiResult;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 立即执行</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> id</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="meta">@ApiOperation(value = &quot;立即执行&quot;, notes = &quot;立即执行&quot;)</span></span><br><span class="line">    <span class="meta">@GetMapping(&quot;/execute&quot;)</span></span><br><span class="line">    <span class="keyword">public</span> ApiResult <span class="title function_">execute</span><span class="params">(<span class="meta">@RequestParam(name = &quot;id&quot;, required = true)</span> String id)</span> &#123;</span><br><span class="line">        <span class="type">QuartzJob</span> <span class="variable">quartzJob</span> <span class="operator">=</span> quartzJobService.getById(Long.valueOf(id));</span><br><span class="line">        <span class="keyword">if</span> (quartzJob == <span class="literal">null</span>) &#123;</span><br><span class="line">            <span class="keyword">return</span> ApiResult.fail(<span class="string">&quot;execute&quot;</span>,<span class="string">&quot;未找到对应实体&quot;</span>);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            quartzJobService.execute(quartzJob);</span><br><span class="line">        &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">            <span class="comment">//e.printStackTrace();</span></span><br><span class="line">            log.info(<span class="string">&quot;定时任务 立即执行失败&gt;&gt;&quot;</span>+e.getMessage());</span><br><span class="line">            <span class="keyword">return</span> ApiResult.fail(<span class="string">&quot;execute&quot;</span>,<span class="string">&quot;执行失败!&quot;</span>);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> ApiResult.ok(<span class="string">&quot;execute&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="Service类"><a href="#Service类" class="headerlink" title="Service类"></a>Service类</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Service</span></span><br><span class="line"><span class="meta">@Slf4j</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">QuartzJobService</span>&#123;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Resource</span></span><br><span class="line">    <span class="keyword">private</span> QuartzJobMapper quartzJobMapper;</span><br><span class="line">    <span class="meta">@Autowired</span></span><br><span class="line">    <span class="keyword">private</span> Scheduler scheduler;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 立即执行的任务分组</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="type">String</span> <span class="variable">JOB_TEST_GROUP</span> <span class="operator">=</span> <span class="string">&quot;test_group&quot;</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> Page&lt;QuartzJob&gt; <span class="title function_">selectList</span><span class="params">(QuartzJob quartzJob, <span class="type">int</span> page, <span class="type">int</span> pageSize)</span> &#123;</span><br><span class="line">        Page&lt;QuartzJob&gt; pageQuartzJobVo = Page.create(page, pageSize);</span><br><span class="line">        <span class="type">Example</span> <span class="variable">example</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Example</span>(QuartzJob.class);</span><br><span class="line">        Example.<span class="type">Criteria</span> <span class="variable">criteria</span> <span class="operator">=</span> example.createCriteria();</span><br><span class="line">        <span class="keyword">if</span> (!StringUtils.isEmpty(quartzJob.getJobClassName())) &#123;</span><br><span class="line">            criteria.andLike(<span class="string">&quot;jobClassName&quot;</span>,<span class="string">&quot;%&quot;</span>+ quartzJob.getJobClassName() +<span class="string">&quot;%&quot;</span>);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span> (!StringUtils.isEmpty(quartzJob.getCronExpression())) &#123;</span><br><span class="line">            criteria.andEqualTo(<span class="string">&quot;cronExpression&quot;</span>, quartzJob.getCronExpression());</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span> (!StringUtils.isEmpty(quartzJob.getDescription())) &#123;</span><br><span class="line">            criteria.andLike(<span class="string">&quot;&quot;</span>, <span class="string">&quot;%&quot;</span>+quartzJob.getDescription() +<span class="string">&quot;%&quot;</span>);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="comment">// 查询未删除的定时列表</span></span><br><span class="line">        criteria.andEqualTo(<span class="string">&quot;delFlag&quot;</span>,CommonConstant.DEL_FLAG_0.getCode());</span><br><span class="line">        List&lt;QuartzJob&gt; quartzJobs = quartzJobMapper.selectByExample(example);</span><br><span class="line">        pageQuartzJobVo.setItems(quartzJobs);</span><br><span class="line">        pageQuartzJobVo.setTotalCount(quartzJobs.size());</span><br><span class="line">        <span class="keyword">return</span> pageQuartzJobVo;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="type">boolean</span> <span class="title function_">saveAndScheduleJob</span><span class="params">(QuartzJob quartzJob)</span> &#123;</span><br><span class="line">       <span class="comment">// DB设置修改</span></span><br><span class="line">       quartzJob.setDelFlag(CommonConstant.DEL_FLAG_0.getCode());</span><br><span class="line">        <span class="type">boolean</span> <span class="variable">success</span> <span class="operator">=</span> <span class="built_in">this</span>.save(quartzJob);</span><br><span class="line">        <span class="keyword">if</span> (success) &#123;</span><br><span class="line">            <span class="keyword">if</span> (CommonConstant.STATUS_NORMAL.getCode().equals(quartzJob.getStatus())) &#123;</span><br><span class="line">                <span class="comment">// 定时器添加</span></span><br><span class="line">                <span class="built_in">this</span>.schedulerAdd(String.valueOf(quartzJob.getId()), quartzJob.getJobClassName().trim(), quartzJob.getCronExpression().trim(), quartzJob.getParameter());</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> success;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">private</span> <span class="type">boolean</span> <span class="title function_">save</span><span class="params">(QuartzJob quartzJob)</span> &#123;</span><br><span class="line">        <span class="keyword">if</span> (StringUtils.isEmpty(quartzJob.getCreateBy()))&#123;</span><br><span class="line">            quartzJob.setCreateBy(<span class="string">&quot;admin&quot;</span>);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span> (StringUtils.isEmpty(quartzJob.getCreateTime()))&#123;</span><br><span class="line">            quartzJob.setCreateTime(<span class="keyword">new</span> <span class="title class_">Date</span>());</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> quartzJobMapper.insertSelective(quartzJob);</span><br><span class="line">        <span class="keyword">if</span> (i == <span class="number">1</span>)&#123;</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">editAndScheduleJob</span><span class="params">(QuartzJob quartzJob)</span> <span class="keyword">throws</span> SchedulerException &#123;</span><br><span class="line">        <span class="keyword">if</span> (CommonConstant.STATUS_NORMAL.equals(quartzJob.getStatus())) &#123;</span><br><span class="line">            schedulerDelete(quartzJob.getId());</span><br><span class="line">            schedulerAdd(String.valueOf(quartzJob.getId()), quartzJob.getJobClassName().trim(), quartzJob.getCronExpression().trim(), quartzJob.getParameter());</span><br><span class="line">        &#125;<span class="keyword">else</span>&#123;</span><br><span class="line">            scheduler.pauseJob(JobKey.jobKey(String.valueOf(quartzJob.getId())));</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="built_in">this</span>.updateById(quartzJob);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">void</span> <span class="title function_">updateById</span><span class="params">(QuartzJob quartzJob)</span> &#123;</span><br><span class="line">        <span class="type">QuartzJob</span> <span class="variable">q</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">QuartzJob</span>();</span><br><span class="line">        q.setId(quartzJob.getId());</span><br><span class="line">        <span class="keyword">if</span> (!StringUtils.isEmpty(quartzJob.getCronExpression()))&#123;</span><br><span class="line">            q.setCronExpression(quartzJob.getCronExpression());</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span> (!StringUtils.isEmpty(quartzJob.getJobClassName()))&#123;</span><br><span class="line">            q.setJobClassName(quartzJob.getJobClassName());</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span> (!StringUtils.isEmpty(quartzJob.getDescription()))&#123;</span><br><span class="line">            q.setDescription(quartzJob.getDescription());</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span> (!StringUtils.isEmpty(quartzJob.getDelFlag()))&#123;</span><br><span class="line">            q.setDelFlag(quartzJob.getDelFlag());</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span> (!StringUtils.isEmpty(quartzJob.getStatus()))&#123;</span><br><span class="line">            q.setStatus(quartzJob.getStatus());</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span> (!StringUtils.isEmpty(quartzJob.getParameter()))&#123;</span><br><span class="line">            q.setParameter(quartzJob.getParameter());</span><br><span class="line">        &#125;</span><br><span class="line">        q.setUpdateBy(<span class="string">&quot;admin&quot;</span>);</span><br><span class="line">        q.setUpdateTime(<span class="keyword">new</span> <span class="title class_">Date</span>());</span><br><span class="line">        quartzJobMapper.updateByPrimaryKeySelective(q);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 添加定时任务</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> jobClassName</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> cronExpression</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> parameter</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">void</span> <span class="title function_">schedulerAdd</span><span class="params">(String id, String jobClassName, String cronExpression, String parameter)</span> &#123;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            <span class="comment">// 启动调度器</span></span><br><span class="line">            scheduler.start();</span><br><span class="line"></span><br><span class="line">            <span class="comment">// 构建job信息</span></span><br><span class="line">            <span class="type">JobDetail</span> <span class="variable">jobDetail</span> <span class="operator">=</span> JobBuilder.newJob(getClass(jobClassName).getClass()).withIdentity(id).usingJobData(<span class="string">&quot;parameter&quot;</span>, parameter).build();</span><br><span class="line"></span><br><span class="line">            <span class="comment">// 表达式调度构建器(即任务执行的时间)</span></span><br><span class="line">            <span class="type">CronScheduleBuilder</span> <span class="variable">scheduleBuilder</span> <span class="operator">=</span> CronScheduleBuilder.cronSchedule(cronExpression);</span><br><span class="line"></span><br><span class="line">            <span class="comment">// 按新的cronExpression表达式构建一个新的trigger</span></span><br><span class="line">            <span class="type">CronTrigger</span> <span class="variable">trigger</span> <span class="operator">=</span> TriggerBuilder.newTrigger().withIdentity(id).withSchedule(scheduleBuilder).build();</span><br><span class="line"></span><br><span class="line">            scheduler.scheduleJob(jobDetail, trigger);</span><br><span class="line">        &#125; <span class="keyword">catch</span> (SchedulerException e) &#123;</span><br><span class="line">            <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">BusinessException</span>(<span class="string">&quot;创建定时任务失败&quot;</span> + e);</span><br><span class="line">        &#125; <span class="keyword">catch</span> (RuntimeException e) &#123;</span><br><span class="line">            <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">BusinessException</span>(e.getMessage() + e);</span><br><span class="line">        &#125;<span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">            <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">BusinessException</span>(<span class="string">&quot;后台找不到该类名：&quot;</span>  + jobClassName  + e);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * (删除&amp;停止)删除定时任务</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="type">boolean</span> <span class="title function_">deleteAndStopJob</span><span class="params">(Long id)</span> &#123;</span><br><span class="line">        schedulerDelete(id);</span><br><span class="line">        <span class="type">QuartzJob</span> <span class="variable">quartzJob</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">QuartzJob</span>();</span><br><span class="line">        quartzJob.setId(id);</span><br><span class="line">        quartzJob.setDelFlag(CommonConstant.DEL_FLAG_1.getCode());</span><br><span class="line">        quartzJob.setStatus(CommonConstant.STATUS_UNNORMAL.getCode());</span><br><span class="line">        <span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> quartzJobMapper.updateByPrimaryKeySelective(quartzJob);</span><br><span class="line">        <span class="keyword">if</span> (i == <span class="number">1</span>)&#123;</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 删除定时任务</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> id</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">void</span> <span class="title function_">schedulerDelete</span><span class="params">(Long id)</span> &#123;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            scheduler.pauseTrigger(TriggerKey.triggerKey(String.valueOf(id)));</span><br><span class="line">            scheduler.unscheduleJob(TriggerKey.triggerKey(String.valueOf(id)));</span><br><span class="line">            scheduler.deleteJob(JobKey.jobKey(String.valueOf(id)));</span><br><span class="line">        &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">            log.error(e.getMessage(), e);</span><br><span class="line">            <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">BusinessException</span>(<span class="string">&quot;删除定时任务失败&quot;</span>);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">static</span> Job <span class="title function_">getClass</span><span class="params">(String classname)</span> <span class="keyword">throws</span> Exception &#123;</span><br><span class="line">        Class&lt;?&gt; class1 = Class.forName(classname);</span><br><span class="line">        <span class="keyword">return</span> (Job) class1.newInstance();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> QuartzJob <span class="title function_">getById</span><span class="params">(Long id)</span> &#123;</span><br><span class="line">        <span class="type">QuartzJob</span> <span class="variable">quartzJob</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">QuartzJob</span>();</span><br><span class="line">        quartzJob.setId(id);</span><br><span class="line">        quartzJob.setStatus(CommonConstant.STATUS_NORMAL.getCode());</span><br><span class="line">        <span class="type">QuartzJob</span> <span class="variable">quartzJob1</span> <span class="operator">=</span> quartzJobMapper.selectOne(quartzJob);</span><br><span class="line">        <span class="keyword">return</span> quartzJob1;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">pause</span><span class="params">(QuartzJob quartzJob)</span>&#123;</span><br><span class="line">        schedulerDelete(quartzJob.getId());</span><br><span class="line">        quartzJob.setStatus(CommonConstant.STATUS_UNNORMAL.getCode());</span><br><span class="line">        <span class="built_in">this</span>.updateById(quartzJob);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">resumeJob</span><span class="params">(QuartzJob quartzJob)</span> &#123;</span><br><span class="line">        schedulerDelete(quartzJob.getId());</span><br><span class="line">        schedulerAdd(String.valueOf(quartzJob.getId()), quartzJob.getJobClassName().trim(), quartzJob.getCronExpression().trim(), quartzJob.getParameter());</span><br><span class="line">        quartzJob.setStatus(CommonConstant.STATUS_NORMAL.getCode());</span><br><span class="line">        <span class="built_in">this</span>.updateById(quartzJob);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">execute</span><span class="params">(QuartzJob quartzJob)</span> <span class="keyword">throws</span> Exception &#123;</span><br><span class="line">        <span class="type">String</span> <span class="variable">jobName</span> <span class="operator">=</span> quartzJob.getJobClassName().trim();</span><br><span class="line">        <span class="type">Date</span> <span class="variable">startDate</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Date</span>();</span><br><span class="line">        <span class="type">String</span> <span class="variable">ymd</span> <span class="operator">=</span> DateUtils.format(startDate,<span class="string">&quot;yyyymmddhhmmss&quot;</span>);</span><br><span class="line">        <span class="type">String</span> <span class="variable">identity</span> <span class="operator">=</span>  jobName + ymd;</span><br><span class="line">        <span class="comment">//3秒后执行 只执行一次</span></span><br><span class="line">        <span class="comment">// update-begin--author:sunjianlei ---- date:20210511--- for：定时任务立即执行，延迟3秒改成0.1秒-------</span></span><br><span class="line">        startDate.setTime(startDate.getTime() + <span class="number">100L</span>);</span><br><span class="line">        <span class="comment">// update-end--author:sunjianlei ---- date:20210511--- for：定时任务立即执行，延迟3秒改成0.1秒-------</span></span><br><span class="line">        <span class="comment">// 定义一个Trigger</span></span><br><span class="line">        <span class="type">SimpleTrigger</span> <span class="variable">trigger</span> <span class="operator">=</span> (SimpleTrigger)TriggerBuilder.newTrigger()</span><br><span class="line">                .withIdentity(identity, JOB_TEST_GROUP)</span><br><span class="line">                .startAt(startDate)</span><br><span class="line">                .build();</span><br><span class="line">        <span class="comment">// 构建job信息</span></span><br><span class="line">        <span class="type">JobDetail</span> <span class="variable">jobDetail</span> <span class="operator">=</span> JobBuilder.newJob(getClass(jobName).getClass()).withIdentity(identity).usingJobData(<span class="string">&quot;parameter&quot;</span>, quartzJob.getParameter()).build();</span><br><span class="line">        <span class="comment">// 将trigger和 jobDetail 加入这个调度</span></span><br><span class="line">        scheduler.scheduleJob(jobDetail, trigger);</span><br><span class="line">        <span class="comment">// 启动scheduler</span></span><br><span class="line">        scheduler.start();</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="Mapper类"><a href="#Mapper类" class="headerlink" title="Mapper类"></a>Mapper类</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">interface</span> <span class="title class_">QuartzJobMapper</span> <span class="keyword">extends</span> <span class="title class_">Mapper</span>&lt;QuartzJob&gt; &#123;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 根据jobClassName查询</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> jobClassName 任务类名</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> List&lt;QuartzJob&gt; <span class="title function_">findByJobClassName</span><span class="params">(<span class="meta">@Param(&quot;jobClassName&quot;)</span> String jobClassName)</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="实体类"><a href="#实体类" class="headerlink" title="实体类"></a>实体类</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="meta">@Data</span></span><br><span class="line"><span class="meta">@Table(name = &quot;sys_quartz_job&quot;)</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">QuartzJob</span> <span class="keyword">implements</span> <span class="title class_">Serializable</span> &#123;</span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * id</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="meta">@Id</span></span><br><span class="line">    <span class="meta">@GeneratedValue(strategy = GenerationType.IDENTITY)</span></span><br><span class="line">    <span class="keyword">private</span> Long id;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 创建人</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="meta">@Column(name = &quot;create_by&quot;)</span></span><br><span class="line">    <span class="keyword">private</span> String createBy;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 创建时间</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="meta">@JsonFormat(timezone = &quot;GMT+8&quot;, pattern = &quot;yyyy-MM-dd HH:mm:ss&quot;)</span></span><br><span class="line">    <span class="meta">@DateTimeFormat(pattern = &quot;yyyy-MM-dd HH:mm:ss&quot;)</span></span><br><span class="line">    <span class="meta">@Column(name = &quot;create_time&quot;)</span></span><br><span class="line">    <span class="keyword">private</span> Date createTime;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 删除状态</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="meta">@Column(name = &quot;del_flag&quot;)</span></span><br><span class="line">    <span class="keyword">private</span> Integer delFlag;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 修改人</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="meta">@Column(name = &quot;update_by&quot;)</span></span><br><span class="line">    <span class="keyword">private</span> String updateBy;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 修改时间</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="meta">@Column(name = &quot;update_time&quot;)</span></span><br><span class="line">    <span class="meta">@JsonFormat(timezone = &quot;GMT+8&quot;, pattern = &quot;yyyy-MM-dd HH:mm:ss&quot;)</span></span><br><span class="line">    <span class="meta">@DateTimeFormat(pattern = &quot;yyyy-MM-dd HH:mm:ss&quot;)</span></span><br><span class="line">    <span class="keyword">private</span> Date updateTime;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 任务类名</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="meta">@Column(name = &quot;job_class_name&quot;)</span></span><br><span class="line">    <span class="keyword">private</span> String jobClassName;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * cron表达式</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="meta">@Column(name = &quot;cron_expression&quot;)</span></span><br><span class="line">    <span class="keyword">private</span> String cronExpression;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 参数</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">private</span> String parameter;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 描述</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">private</span> String description;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 状态 0正常 -1停止</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">private</span> Integer status;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="5-简单的Job任务类，这个根据自己的实际需求进行更改"><a href="#5-简单的Job任务类，这个根据自己的实际需求进行更改" class="headerlink" title="5. 简单的Job任务类，这个根据自己的实际需求进行更改"></a>5. 简单的Job任务类，这个根据自己的实际需求进行更改</h2><blockquote><p>根据实际开发的需要，选择适合自己的任务类搭配即可实现自己想要的效果</p></blockquote><h3 id="任务类一"><a href="#任务类一" class="headerlink" title="任务类一"></a>任务类一</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span>: 同步定时任务测试</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * 此处的同步是指 当定时任务的执行时间大于任务的时间间隔时</span></span><br><span class="line"><span class="comment"> * 会等待第一个任务执行完成才会走第二个任务</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@PersistJobDataAfterExecution</span> <span class="comment">// 持久化JobDataMap里的数据，使下一个定时任务还能获取到这些值</span></span><br><span class="line"><span class="meta">@DisallowConcurrentExecution</span> <span class="comment">// 禁止并发多任务执行，所以永远只有一个任务在执行中</span></span><br><span class="line"><span class="meta">@Slf4j</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Test1Job</span> <span class="keyword">implements</span> <span class="title class_">Job</span> &#123;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">execute</span><span class="params">(JobExecutionContext jobExecutionContext)</span> <span class="keyword">throws</span> JobExecutionException &#123;</span><br><span class="line">        log.info(<span class="string">&quot; --- 同步任务调度开始 --- &quot;</span> + <span class="string">&quot; Job Execution key：&quot;</span>+jobExecutionContext.getJobDetail().getKey());</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            <span class="comment">//此处模拟任务执行时间 5秒  任务表达式配置为每秒执行一次：0/1 * * * * ? *</span></span><br><span class="line">            Thread.sleep(<span class="number">20000</span>);</span><br><span class="line">        &#125; <span class="keyword">catch</span> (InterruptedException e) &#123;</span><br><span class="line">            e.printStackTrace();</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="comment">//测试发现 每5秒执行一次</span></span><br><span class="line">        log.info(<span class="string">&quot; --- 执行完毕，时间：&quot;</span>+<span class="keyword">new</span> <span class="title class_">Date</span>()+<span class="string">&quot;---&quot;</span>  + <span class="string">&quot; 线程名&quot;</span>+ Thread.currentThread().getName() );</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="任务类二"><a href="#任务类二" class="headerlink" title="任务类二"></a>任务类二</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="meta">@Slf4j</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Test2Job</span> <span class="keyword">implements</span> <span class="title class_">Job</span> &#123;</span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">execute</span><span class="params">(JobExecutionContext jobExecutionContext)</span> <span class="keyword">throws</span> JobExecutionException &#123;</span><br><span class="line">        log.info(<span class="string">&quot; Job Execution key：&quot;</span>+jobExecutionContext.getJobDetail().getKey());</span><br><span class="line">        log.info(String.format(<span class="string">&quot; rih-health-center 普通定时任务 Test2Job !  时间:&quot;</span> + <span class="keyword">new</span> <span class="title class_">Date</span>()));</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="任务类三"><a href="#任务类三" class="headerlink" title="任务类三"></a>任务类三</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="meta">@Slf4j</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Test3Job</span> <span class="keyword">implements</span> <span class="title class_">Job</span> &#123;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 若参数变量名修改 QuartzJobController中也需对应修改</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">private</span> String parameter;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">setParameter</span><span class="params">(String parameter)</span> &#123;</span><br><span class="line">        <span class="built_in">this</span>.parameter = parameter;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">execute</span><span class="params">(JobExecutionContext jobExecutionContext)</span> <span class="keyword">throws</span> JobExecutionException &#123;</span><br><span class="line"></span><br><span class="line">        log.info(<span class="string">&quot; Job Execution key：&quot;</span>+jobExecutionContext.getJobDetail().getKey());</span><br><span class="line">        log.info( String.format(<span class="string">&quot;welcome %s! 带参数定时任务 Test3Job !   时间:&quot;</span> + <span class="keyword">new</span> <span class="title class_">Date</span>(), <span class="built_in">this</span>.parameter));</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure><h1 id="至此，Quartz-Job集成完成"><a href="#至此，Quartz-Job集成完成" class="headerlink" title="至此，Quartz Job集成完成"></a>至此，Quartz Job集成完成</h1>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;场景描述&quot;&gt;&lt;a href=&quot;#场景描述&quot; class=&quot;headerlink&quot; title=&quot;场景描述&quot;&gt;&lt;/a&gt;场景描述&lt;/h1&gt;&lt;p&gt;在项目的实际场景中，我们经常会遇到一些任务需要每天、每周、或者固定时间去执行，所以在项目中加入Quartz框架，来更好的对这</summary>
      
    
    
    
    <category term="经验分享" scheme="http://hexo.sjava.cn/categories/%E7%BB%8F%E9%AA%8C%E5%88%86%E4%BA%AB/"/>
    
    
    <category term="SpringBoot" scheme="http://hexo.sjava.cn/tags/SpringBoot/"/>
    
    <category term="Quartz" scheme="http://hexo.sjava.cn/tags/Quartz/"/>
    
  </entry>
  
  <entry>
    <title>Maven加载本地Jar包的实操记录</title>
    <link href="http://hexo.sjava.cn/posts/60353.html"/>
    <id>http://hexo.sjava.cn/posts/60353.html</id>
    <published>2023-09-07T23:02:41.000Z</published>
    <updated>2023-09-17T02:21:25.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="场景溯源"><a href="#场景溯源" class="headerlink" title="场景溯源"></a>场景溯源</h1><div class="note blue anzhiyufont anzhiyu-icon-bullhorn simple"><p>本人在开发一个SpringBoot框架的项目，其中用到一个第三方的jar包，需要在本地进行导入。</p></div><h1 id="踩坑小计"><a href="#踩坑小计" class="headerlink" title="踩坑小计"></a>踩坑小计</h1><h2 id="方式一：直接把jar包放入resource目录下新建的一个libs目录下-不推荐"><a href="#方式一：直接把jar包放入resource目录下新建的一个libs目录下-不推荐" class="headerlink" title="方式一：直接把jar包放入resource目录下新建的一个libs目录下(不推荐)"></a>方式一：直接把jar包放入resource目录下新建的一个libs目录下(不推荐)</h2><p>这种方式在本地怎么用怎么好使，但是你打成jar包方式的话，springboot默认打jar包的时候是不会把resource目录下添加的jar包给打进去的，所以就会出现本地OK，打的项目包缺不能正常运行的情况 </p><h3 id="解决办法"><a href="#解决办法" class="headerlink" title="解决办法"></a>解决办法</h3><ol><li>打包的方式改成war包</li><li>加什么配置使得<code>maven package</code>的时候把libs的jar包也一并打出来。<p class='p red'>（这种方法我没有深究，有兴趣可以自行探索，在这里我提供一下ChatGPT的解决方法并未验证，请自行考量。）</p></li></ol><ul><li>将 JAR 包放置在 src/main/resources/lib 目录下：<br>首先，确保您的本地 JAR 包位于项目的 src/main/resources/lib 目录下。如果目录不存在，请手动创建它。</li><li>在 pom.xml 文件中配置 Maven 插件以包括资源文件：<br>在项目的 pom.xml 文件中，添加以下配置以确保 Maven 在打包应用程序时包括 resource/lib 目录下的资源文件。<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">&lt;build&gt;</span><br><span class="line">  &lt;resources&gt;</span><br><span class="line">      &lt;resource&gt;</span><br><span class="line">          &lt;directory&gt;src/main/resources&lt;/directory&gt;</span><br><span class="line">          &lt;filtering&gt;true&lt;/filtering&gt;</span><br><span class="line">          &lt;includes&gt;</span><br><span class="line">              &lt;include&gt;lib/**&lt;/include&gt;</span><br><span class="line">          &lt;/includes&gt;</span><br><span class="line">      &lt;/resource&gt;</span><br><span class="line">  &lt;/resources&gt;</span><br><span class="line"> &lt;/build&gt;</span><br><span class="line"></span><br></pre></td></tr></table></figure>这个配置将 src/main/resources 目录下的所有文件（包括 lib 子目录）包括在 Maven 构建中，并在打包时将它们复制到 JAR 文件中。</li><li>清理和构建项目：<br>执行以下 Maven 命令以清理和构建项目，并确保资源文件被正确打包：<figure class="highlight cmd"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">mvn clean package </span><br></pre></td></tr></table></figure>这将触发 Maven 构建过程，并在构建目录中创建包含 resource/lib 目录内容的 JAR 文件。</li><li>验证 JAR 文件内容：<br>检查生成的 JAR 文件，确保 resource/lib 目录下的本地 JAR 包已包含在 JAR 文件中。您可以使用压缩工具或命令行工具查看 JAR 文件的内容。</li></ul><h2 id="方式二：把jar包导入到本地仓库再直接引入-推荐"><a href="#方式二：把jar包导入到本地仓库再直接引入-推荐" class="headerlink" title="方式二：把jar包导入到本地仓库再直接引入(推荐)"></a>方式二：把jar包导入到本地仓库再直接引入(推荐)</h2><h3 id="解决办法-1"><a href="#解决办法-1" class="headerlink" title="解决办法"></a>解决办法</h3><p>如果你当前使用的是Windows系统电脑，下面是实际的解决步骤：</p><ol><li>使用WIN+R建，弹出运行窗口</li><li>输入<code>cmd</code>,然后在黑窗口进入需要导入项目的jar包所在位置</li><li>执行命令先把jar包导入到自己本地的maven仓库中，<strong>下面命令不能直接在-Dfile后面引入jar包的绝对路径，会报错，别问我是怎么知道的~</strong> <figure class="highlight cmd"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">mvn install:install-file -Dfile=xxx.jar -DgroupId=com.example -DartifactId=xxx -Dversion=<span class="number">1</span>.<span class="number">0</span>.<span class="number">0</span> -Dpackaging=jar</span><br><span class="line">    </span><br></pre></td></tr></table></figure></li><li>通过如下命令在pom文件中正常引入即可 <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">&lt;dependencies&gt;</span><br><span class="line">&lt;!-- 其他依赖项 --&gt;</span><br><span class="line">&lt;dependency&gt;</span><br><span class="line">    &lt;groupId&gt;com.example&lt;/groupId&gt;</span><br><span class="line">    &lt;artifactId&gt;xxx(此处是上面jar包的名字)&lt;/artifactId&gt;</span><br><span class="line">    &lt;version&gt;1.0.0&lt;/version&gt;</span><br><span class="line">&lt;/dependency&gt;</span><br><span class="line">&lt;/dependencies&gt;</span><br></pre></td></tr></table></figure></li><li>引入成功后执行以下命令就OK了<figure class="highlight cmd"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">mvn clean package </span><br></pre></td></tr></table></figure></li></ol>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;场景溯源&quot;&gt;&lt;a href=&quot;#场景溯源&quot; class=&quot;headerlink&quot; title=&quot;场景溯源&quot;&gt;&lt;/a&gt;场景溯源&lt;/h1&gt;&lt;div class=&quot;note blue anzhiyufont anzhiyu-icon-bullhorn simple&quot;&gt;&lt;</summary>
      
    
    
    
    <category term="经验分享" scheme="http://hexo.sjava.cn/categories/%E7%BB%8F%E9%AA%8C%E5%88%86%E4%BA%AB/"/>
    
    <category term="安装进阶" scheme="http://hexo.sjava.cn/categories/%E5%AE%89%E8%A3%85%E8%BF%9B%E9%98%B6/"/>
    
    
    <category term="Maven" scheme="http://hexo.sjava.cn/tags/Maven/"/>
    
  </entry>
  
  <entry>
    <title>MySQL主从复制学习小记</title>
    <link href="http://hexo.sjava.cn/posts/35005.html"/>
    <id>http://hexo.sjava.cn/posts/35005.html</id>
    <published>2023-08-30T10:09:40.000Z</published>
    <updated>2023-08-30T11:00:45.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="MySQL主从复制原理"><a href="#MySQL主从复制原理" class="headerlink" title="MySQL主从复制原理"></a>MySQL主从复制原理</h1><h2 id="Mysql主从复制原理"><a href="#Mysql主从复制原理" class="headerlink" title="Mysql主从复制原理"></a>Mysql主从复制原理</h2><p>  基于二进制文件实现</p><h2 id="Mysql的复制类型"><a href="#Mysql的复制类型" class="headerlink" title="Mysql的复制类型"></a>Mysql的复制类型</h2><ol><li>基于语句的复制（TSATEMENT,Mysql的默认类型）</li><li>基于行的复制（ROW）</li><li>混合类型的复制（MIXED）</li></ol><h2 id="Mysql主从复制的工作过程"><a href="#Mysql主从复制的工作过程" class="headerlink" title="Mysql主从复制的工作过程"></a>Mysql主从复制的工作过程</h2><ol><li>Master节点将数据的改变记录成二进制日志（bin log），当Master上的数据发生改变时，则将其改变写入二进制日志中</li><li>slave节点会在一定时间间隔内对Master的二进制日志进行探测其是否发生改变，如果发生改变，则开始一个I/O线程请求 Master的二进制事件</li><li>同时Master节点为每个I/O线程启动一个dump线程，用于向其发送二进制事件，并保存至slave节点本地的中继日志（Relay log）中，slave节点将启动SQL线程从中继日志中读取二进制日志，在本地重放，即解析成 sql 语句逐一执行，使得其数据和 Master节点的保持一致，最后I/O线程和SQL线程将进入睡眠状态，等待下一次被唤醒</li></ol><h2 id="复制的用途"><a href="#复制的用途" class="headerlink" title="复制的用途"></a>复制的用途</h2><ol><li>实时灾备，用于故障切换</li><li>可创建读写分离，提供更好的查询服务</li><li>把备份等操作都放在从服务器上进行，减少对业务的影响</li></ol><h2 id="复制存在的问题"><a href="#复制存在的问题" class="headerlink" title="复制存在的问题"></a>复制存在的问题</h2><ol><li>主库宕机后，数据可能丢失</li><li>从库只有一个sql Thread，主库写压力大时，复制很可能延时</li><li>一主多从，从机不宜过多，主服务器需要同时向多台服务器中写入数据，压力会很大，这个时候推荐使用集群技，这个我之后会试做，在此不做描述</li></ol><h2 id="复制的原理"><a href="#复制的原理" class="headerlink" title="复制的原理"></a>复制的原理</h2><p>MySQL 主从复制（replication）是一个异步的复制过程。从一个实例（Master）复制到另一个实例（Slave），整个过程需要由 Master 上的 IO 进程 和 Slave 上的 Sql 进程 与 IO 进程 共同完成。<br>首先 Master 端必须打开 binary log（bin-log），因为整个复制过程实际上就是 Slave 端从 Master 端获取相应的二进制日志，然后在本地完全顺序的执行日志中所记录的各种操作。<br>原理图如下：<br><img src="https://lsky.sjava.cn/i/2025/09/29/68d9f8971e54a.png" alt="image"></p><h3 id="主从复制过程："><a href="#主从复制过程：" class="headerlink" title="主从复制过程："></a>主从复制过程：</h3><ol><li>Slave 端的 IO 进程连接上 Master，向 Master 请求指定日志文件的指定位置（或者从最开始的日志）之后的日志内容；</li><li>Master 接收到来自 Slave 的 IO 进程的请求后，负责复制的 IO 进程根据 Slave 的请求信息，读取相应日志内容，返回给 Slave 的IO进程，并将本次请求读取的 bin-log 文件名及位置一起返回给 Slave 端；</li><li>Slave 端的 IO 进程接收到信息后，将接收到的日志内容依次添加到 Slave 端的 relay-log(中继日志) 文件的最末端，并将读取到的 Master 端的 bin-log 的文件名和位置记录到 master-info 文件中，以便在下一次读取的时候能够清楚的告诉 Master ：”我需要从某个 bin-log 的哪个位置开始往后的日志内容，请发给我”；</li><li>Slave 端的 Sql 进程检测到 relay-log (中继日志)中新增加了内容后，会马上解析 relay-log 的内容成为在 Master 端真实执行时候的那些可执行的内容，并在本地执行。</li></ol><h3 id="过程产生三个线程-thread-："><a href="#过程产生三个线程-thread-：" class="headerlink" title="过程产生三个线程(thread)："></a>过程产生三个线程(thread)：</h3><p>两个 IO线程：主库会创建一个线程，用来发送 binlog 内容到从库；从库I/O线程读取主库的 binlog 输出线程发送的更新并拷贝这些更新到本地文件，其中包括 relay-log(中继日志) 文件<br>一个 SQL线程：SQL负责将中继日志应用到 slave 数据库中，完成 AB (主从)复制数据同步。</p><h3 id="主从复制的方式："><a href="#主从复制的方式：" class="headerlink" title="主从复制的方式："></a>主从复制的方式：</h3><ol><li>同步复制：<br>Master 服务器操作完成，当操作作为事件写入二进制日志，传递给 slave，存放到中继日志中，然后在本地执行完操作，即反馈同步成功</li><li>半同步复制：<br>主库在执行完客户端提交的事务后不是立刻返回给客户端，而是等待至少一个从库接收到并写到relay log中才返回给客户端。<br>该功能不是 mysql 官方提供的，是5.5版本时由 google 研发半同步补丁后支持，需要 semi 插件</li><li>异步复制：<br>主库在执行完客户端提交的事务后会立即将结果返给给客户端，并不关心从库是否已经接收并处理</li></ol><h1 id="MySQL主从复制实践"><a href="#MySQL主从复制实践" class="headerlink" title="MySQL主从复制实践"></a>MySQL主从复制实践</h1><h2 id="在主服务器上进行设置："><a href="#在主服务器上进行设置：" class="headerlink" title="在主服务器上进行设置："></a>在主服务器上进行设置：</h2><blockquote><p>编辑主服务器的 MySQL 配置文件<code>my.cnf</code>，一般位于 <code>/etc/mysql/my.cnf</code> 或 <code>/etc/my.cnf</code>。</p></blockquote><ol><li><p>在 <code>my.cnf</code>中，找到 [mysqld] 部分，并添加以下配置：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">server-id = 1  # 主服务器设为1，从服务器可以设为不同的ID</span><br><span class="line">log_bin = /var/log/mysql/mysql-bin.log  # 启用二进制日志</span><br><span class="line">binlog_do_db = your_database_name  # 可选，指定需要复制的数据库</span><br></pre></td></tr></table></figure></li><li><p>保存配置文件后，重启 MySQL 使配置生效：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo systemctl restart mysql</span><br></pre></td></tr></table></figure></li><li><p>创建用于复制的用户，并授予适当的权限。登录到 MySQL：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">mysql -u root -p</span><br></pre></td></tr></table></figure></li><li><p>然后在 MySQL 提示符下执行以下命令：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">CREATE USER &#x27;replication_user&#x27;@&#x27;%&#x27; IDENTIFIED BY &#x27;password&#x27;;</span><br><span class="line">GRANT REPLICATION SLAVE ON *.* TO &#x27;replication_user&#x27;@&#x27;%&#x27;;</span><br><span class="line">FLUSH PRIVILEGES;</span><br></pre></td></tr></table></figure></li><li><p>获取主服务器当前的二进制日志位置。在 MySQL 提示符下执行以下命令：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">SHOW MASTER STATUS;</span><br></pre></td></tr></table></figure><p>记下输出结果中的 <code>File</code>和 <code>Position</code>值，将在配置从服务器时用到。</p></li></ol><h2 id="在从服务器上进行设置："><a href="#在从服务器上进行设置：" class="headerlink" title="在从服务器上进行设置："></a>在从服务器上进行设置：</h2><blockquote><p>编辑从服务器的 MySQL 配置文件 <code>my.cnf</code>，同样位于 <code>/etc/mysql/my.cnf</code> 或 <code>/etc/my.cnf</code>。</p></blockquote><ol><li><p>在 <code>my.cnf</code> 中，找到 [mysqld] 部分，并添加以下配置：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">server-id = 2  # 从服务器设为不同的ID</span><br></pre></td></tr></table></figure></li><li><p>停止从服务器的 MySQL 进程：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo systemctl stop mysql</span><br></pre></td></tr></table></figure></li><li><p>清空从服务器的数据，这将删除现有的数据库数据：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo rm -rf /var/lib/mysql/*</span><br></pre></td></tr></table></figure></li><li><p>在从服务器上配置连接到主服务器。在 MySQL 提示符下执行以下命令，将其中的参数替换为实际值：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">CHANGE MASTER TO</span><br><span class="line">MASTER_HOST = &#x27;master_server_ip&#x27;,</span><br><span class="line">MASTER_USER = &#x27;replication_user&#x27;,</span><br><span class="line">MASTER_PASSWORD = &#x27;password&#x27;,</span><br><span class="line">MASTER_LOG_FILE = &#x27;mysql-bin.XXXXXX&#x27;,  -- 使用主服务器上 SHOW MASTER STATUS 得到的值</span><br><span class="line">MASTER_LOG_POS = log_position;  -- 使用主服务器上 SHOW MASTER STATUS 得到的值</span><br></pre></td></tr></table></figure></li><li><p>启动从服务器的 MySQL 进程：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo systemctl start mysql</span><br></pre></td></tr></table></figure></li><li><p>在从服务器上运行以下命令开始主从复制：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">START SLAVE;  -- 开启复制</span><br><span class="line">STOP SLAVE; -- 关闭复制</span><br></pre></td></tr></table></figure></li><li><p>可以使用以下命令来检查主从复制状态：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">-- 确保 &quot;Slave_IO_Running&quot; 和 &quot;Slave_SQL_Running&quot; 都显示为 &quot;Yes&quot;，表示复制正在正常运行。</span><br><span class="line">SHOW SLAVE STATUS;</span><br></pre></td></tr></table></figure></li></ol><p>在执行上述步骤时，请确保主服务器和从服务器之间的网络通信正常，防火墙允许数据库端口的通信，并在配置过程中使用正确的主机名、IP 地址和密码。如果遇到问题，可以查看 MySQL 日志以找出问题的根本原因。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;MySQL主从复制原理&quot;&gt;&lt;a href=&quot;#MySQL主从复制原理&quot; class=&quot;headerlink&quot; title=&quot;MySQL主从复制原理&quot;&gt;&lt;/a&gt;MySQL主从复制原理&lt;/h1&gt;&lt;h2 id=&quot;Mysql主从复制原理&quot;&gt;&lt;a href=&quot;#Mysql主</summary>
      
    
    
    
    <category term="安装进阶" scheme="http://hexo.sjava.cn/categories/%E5%AE%89%E8%A3%85%E8%BF%9B%E9%98%B6/"/>
    
    
    <category term="MySQL" scheme="http://hexo.sjava.cn/tags/MySQL/"/>
    
  </entry>
  
</feed>
