<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
>
<channel>
<title><![CDATA[代码续命]]></title> 
<atom:link href="https://zk1006.cn/rss.php" rel="self" type="application/rss+xml" />
<description><![CDATA[珍惜-个人博客]]></description>
<link>https://zk1006.cn/</link>
<language>zh-cn</language>
<generator>www.emlog.net</generator>
<item>
    <title>go注册服务到nacos</title>
    <link>https://zk1006.cn/archives/25.html</link>
    <description><![CDATA[<p>先引入nacos的sdk包到项目中,目前最新的是1.0.7版本</p>
<pre><code class="language-go">github.com/nacos-group/nacos-sdk-go v1.0.7</code></pre>
<p>经过无数次的尝试,发现魔改后的nacos-spring 用go注册会提示重试三次都失败，失败内容如下:</p>
<p>call domain error:&lt;request return error code 400&gt; , result:&lt;caused: Param 'serviceName' is required.;&gt;</p>
<p>后来采用nacos docker搭建nacos注册中心可正常与spring项目通讯,至于加密通讯方面可能需要自己动手，先上go代码</p>
<p>nacos工具类:</p>
<pre><code class="language-go">package client

import (
    "fmt"
    "github.com/nacos-group/nacos-sdk-go/clients"
    "github.com/nacos-group/nacos-sdk-go/clients/config_client"
    "github.com/nacos-group/nacos-sdk-go/clients/naming_client"
    "github.com/nacos-group/nacos-sdk-go/common/constant"
    "github.com/nacos-group/nacos-sdk-go/model"
    "github.com/nacos-group/nacos-sdk-go/vo"

    "strings"
)

type NacosClient struct {
    Client config_client.IConfigClient
    NamingClient naming_client.INamingClient
}
//创建nacos客户端
func NewNacos(option *Options,isJwt bool) *NacosClient {
    var clientConfig constant.ClientConfig
    if isJwt {
        clientConfig = constant.ClientConfig{
            TimeoutMs:      option.TimeoutMs,
            BeatInterval:   option.BeatInterval,
            LogDir:"/tmp/nacos/log",
            CacheDir:"/tmp/nacos/cache",
            LogLevel:"debug",
            //NamespaceId:"public",
            //AppName:"unknown",
            //OpenKMS:true,
            //Username:"nacos",
            //Password:"$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu",
            //AccessKey:"pigx",
            //SecretKey:"PBEWithMD5AndDES",
        }
    }else {
        clientConfig = constant.ClientConfig{
            TimeoutMs:      option.TimeoutMs,
            BeatInterval:   option.BeatInterval,
            LogDir:"/tmp/nacos/log",
            CacheDir:"/tmp/nacos/cache",
            LogLevel:"debug",
        }
    }

    serverConfigs := []constant.ServerConfig{
        *constant.NewServerConfig(
            option.Address,
            option.Port,
            constant.WithContextPath("/nacos")),
    }
    // Create Config Center
    client, err := clients.NewConfigClient(vo.NacosClientParam{
        ClientConfig:  &amp;clientConfig,
        ServerConfigs: serverConfigs,
    })
    if err != nil {
        panic(err)
    }
    // Create Register Center
    namingClient,err:=clients.NewNamingClient(vo.NacosClientParam{
        ClientConfig:  &amp;clientConfig,
        ServerConfigs: serverConfigs,
    })
    if err!=nil{
        panic(err)
    }
    return &amp;NacosClient{Client: client,NamingClient: namingClient}
}
//项目公有配置
func (c *NacosClient) Publish(dataId, group, content string) bool {
    ok, err := c.Client.PublishConfig(vo.ConfigParam{
        DataId:  dataId,
        Group:   group,
        Content: content,
    })
    if err != nil {
        return false
    }
    return ok
}
//获取配置文件
func (c *NacosClient) Get(dataId, group string) string {
    s, err := c.Client.GetConfig(vo.ConfigParam{
        DataId: dataId,
        Group:  group,
    })
    if err != nil {
        return ""
    }
    return s
}
//删除nacos配置
func (c *NacosClient) Delete(dataId, group string) bool {
    ok,err:=c.Client.DeleteConfig(vo.ConfigParam{
        DataId:   dataId,
        Group:    group,
    })
    if err!=nil{
        return false
    }
    return ok
}
//监听nacos配置文件变动
func (c *NacosClient) Listen(dataId, group string,OnChange func(namespace, group, dataId, data string)) error {
    return c.Client.ListenConfig(vo.ConfigParam{
        DataId:   dataId,
        Group:    group,
        OnChange: OnChange,
    })
}
//注册到nacos服务
func (c *NacosClient) Register(ip string,port uint64,name string) bool {
    ok,err:=c.NamingClient.RegisterInstance(vo.RegisterInstanceParam{
        Ip:          ip,
        Port:        port,
        ServiceName: name,
        Weight:      1.0,
        //Metadata: ,
        GroupName:  "",
        Enable:      true,
        Healthy:     true,
        Ephemeral:   true,
    })
    if err!=nil{
        fmt.Printf("注册失败:%v",err)
        return false
    }
    return ok
}
//注销nacos服务
func (c *NacosClient) Deregister(ip string,port uint64,name string) bool {
    ok ,err:=c.NamingClient.DeregisterInstance(vo.DeregisterInstanceParam{
        Ip:          ip,
        Port:        port,
        ServiceName: name,
        //Cluster:     "a",
        Ephemeral:   true,
    })
    if err!=nil{
        return false
    }
    return ok
}
//获取nacos服务信息
func (c *NacosClient) GetService(name string) (model.Service,error) {
    return c.NamingClient.GetService(vo.GetServiceParam{
        //Clusters:    []string{"a"},
        ServiceName: name,
    })
}
//获取一个健康的实例（加权随机轮询）
func (c *NacosClient) SelectOneHealthyInstance(name string) (*model.Instance,error) {
    return c.NamingClient.SelectOneHealthyInstance(vo.SelectOneHealthInstanceParam{
        ServiceName: name,
        //Clusters:    []string{"a"},
    })
}</code></pre>
<p>实体</p>
<pre><code class="language-go">package client

type Options struct {
    TimeoutMs      uint64 //请求Nacos服务端的超时时间，默认是10000ms
    BeatInterval   int64  //发送到服务的心跳时间 默认5000ms
    Address        string //注册中心地址
    Port           uint64 //注册中心端口
}
func deafultOptions() *Options {
    return &amp;Options{
        TimeoutMs:      10*1000,
        ListenInterval: 3*1000,
        BeatInterval:   5*1000,
    }
}
func (option *Options) WithAdress(address string) *Options {
    option.Address = address
    return option
}
func (option *Options) WithPort(port uint64) *Options {
    option.Port = port
    return option
}
func NewOption() *Options {
    return deafultOptions()
}
</code></pre>
<p>从nacos读取配置文件方法</p>
<pre><code class="language-go">option:=client.NewOption().WithAdress(nacosIp).WithPort(8848) //nacosIp 注册中心ip
nacosClient:=client.NewNacos(option,false)
content:=nacosClient.Get(global.GVA_DATA_ID,global.GVA_GROUP) //global.GVA_DATA_ID nacos中的配置文件明  global.GVA_GROUP分组
</code></pre>
<p>注册服务到注册中心方法</p>
<pre><code class="language-go">option:=client.NewOption().WithAdress(nacosIp).WithPort(port)  //注册中心和端口
nacosClient:=client.NewNacos(option,true)
if ok :=nacosClient.Register(localhostip,iport,serverName);ok{  //本机ip 本机端口  本服务名称
     //注册成功逻辑处理
}</code></pre>]]></description>
    <pubDate>Tue, 25 May 2021 17:13:52 +0800</pubDate>
    <dc:creator>珍惜</dc:creator>
    <guid>https://zk1006.cn/archives/25.html</guid>
</item>
<item>
    <title>VUE项目build后直接上传阿里OSS</title>
    <link>https://zk1006.cn/archives/24.html</link>
    <description><![CDATA[<p>在项目根目录创建阿里oss相关的js文件，如下</p>
<pre><code class="language-javascript">module.exports = {
    region: 'oss-cn-hongkong',  // 例如：oss-cn-hangzhou
    accessKeyId: 'xxxx',
    accessKeySecret: 'xxx',
    bucket: 'xxx'
}</code></pre>
<p>然后在vue.config.js导入相关包文件</p>
<pre><code class="language-javascript">const WebpackAliyunOss = require("webpack-aliyun-oss"); // 引入webpack-aliyun-oss,如果找不到包，就先npm安装
const Oss = require('./oss.config.js');//阿里云配置文件</code></pre>
<p>在configureWebpack中如下修改,在该方法内可以自行添加环境判断</p>
<pre><code class="language-javascript">configureWebpack: config=&gt;{
   let webpackAliyunOss = [
                new WebpackAliyunOss({
                    from: ['./dist/**'], // 上传那个文件或文件夹  可以是字符串或数组
                    dist: "/",  // 需要上传到oss上的给定文件目录
                    region: Oss.region,
                    accessKeyId: Oss.accessKeyId,
                    accessKeySecret: Oss.accessKeySecret,
                    bucket: Oss.bucket,

                    // test: true,
                    //上面一行，可以在进行测试看上传路径是否正确, 打开后只会显示上传路径并不会真正上传;

                    // 因为文件标识符 "\"  和 "/" 的区别 不进行 setOssPath配置,上传的文件夹就会拼到文件名上, 丢失了文件目录,所以需要对setOssPath 配置。
                    setOssPath: filePath =&gt; {
                        // some operations to filePath
                        let index = filePath.lastIndexOf("dist");
                        let Path = filePath.substring(index + 4, filePath.length);
                        return Path.replace(/\\/g, "/");
                    },
                    setHeaders: filePath =&gt; {
                        // some operations to filePath
                        // return false to use default header
                        return {
                            "Cache-Control": "max-age=31536000"
                        };
                    }
                })
            ];
            config.plugins = [...config.plugins, ...webpackAliyunOss ];
 }</code></pre>]]></description>
    <pubDate>Sun, 23 May 2021 18:36:46 +0800</pubDate>
    <dc:creator>珍惜</dc:creator>
    <guid>https://zk1006.cn/archives/24.html</guid>
</item>
<item>
    <title>layuiAdmin中的layim上传图片使用阿里oss</title>
    <link>https://zk1006.cn/archives/17.html</link>
    <description><![CDATA[<p>pc端layim.js和手机端mobile.js文件中</p>
<p>下载aliossUploader放入controller中</p>
<p>region为阿里oss节点，bucket为存储</p>
<p>PC端搜索 image:function(i){ 下面代码放到后方</p>
<pre><code class="language-javascript">layui.use("aliossUploader",function(){var&amp;nbsp;a=layui.aliossUploader,e=i.data("type")||"images",n=_();a.render({elm:i.find("input")[0],region:"oss-cn-hongkong",bucket:"xxxx",layerTitle:"上传图片",accessidFiled:"accessid",policyFiled:"policy",signatureFiled:"signature",policyData:{},policyHeader:{Authorization:"Bearer&amp;nbsp;"+layui.data(layui.setter.tableName).Authorization},policyUrl:"/rg/rgaccount/getOss",fileType:"images",multiple:!1,httpStr:"http",prefixPath:"rgAccQrUrlDir/",allUploaded:function(i){console.log("上传响应",i),"images"===e?ai(n.textarea[0],"img["+(i[0].ossUrl||"")+"]"):"file"===e&amp;amp;&amp;amp;ai(n.textarea[0],"file("+(i[0].ossUrl||"")+")["+(i.data.name||"下载文件")+"]"),_()},policyFailed:function(i){t.msg(i.msg||"上传失败")}})})}</code></pre>
<p>手机端搜索 image:function(i){ 下面代码放到后方</p>
<pre><code class="language-javascript">layui.use("aliossUploader",function(){var&amp;nbsp;e=layui.aliossUploader,a=i.data("type")||"images",t=T();e.render({elm:i.find("input")[0],region:"oss-cn-hongkong",bucket:"xxxx",layerTitle:"上传图片",accessidFiled:"accessid",policyFiled:"policy",signatureFiled:"signature",policyData:{},policyUrl:"/rg/rgaccount/getOss",fileType:"images",multiple:!1,httpStr:"http",prefixPath:"rgAccQrUrlDir/",allUploaded:function(i){console.log("上传响应",i),"images"===a?P(t.textarea[0],"img["+(i[0].ossUrl||"")+"]"):"file"===a&amp;amp;&amp;amp;P(t.textarea[0],"file("+(i[0].ossUrl||"")+")["+(i[0].name||"下载文件")+"]"),I()},policyFailed:function(i){layer.msg(i.msg||"上传失败")}})})}</code></pre>]]></description>
    <pubDate>Wed, 07 Oct 2020 01:32:34 +0800</pubDate>
    <dc:creator>珍惜</dc:creator>
    <guid>https://zk1006.cn/archives/17.html</guid>
</item>
<item>
    <title>debian系统替换阿里源</title>
    <link>https://zk1006.cn/archives/16.html</link>
    <description><![CDATA[<pre><code>deb http://mirrors.aliyun.com/debian/ stretch main contrib non-free

deb http://mirrors.aliyun.com/debian/ stretch-updates main contrib non-free

deb http://mirrors.aliyun.com/debian/ stretch-proposed-updates main non-free contrib

deb http://mirrors.aliyun.com/debian/ stretch-backports main non-free contrib

deb-src http://mirrors.aliyun.com/debian/ stretch-updates main contrib non-free

deb-src http://mirrors.aliyun.com/debian/ stretch main contrib non-free

deb-src http://mirrors.aliyun.com/debian/ stretch-proposed-updates main contrib non-free

deb-src http://mirrors.aliyun.com/debian/ stretch-backports main contrib non-free

deb http://mirrors.aliyun.com/debian-security/ stretch/updates main non-free contrib

deb-src http://mirrors.aliyun.com/debian-security/ stretch/updates main non-free contrib</code></pre>]]></description>
    <pubDate>Thu, 05 Mar 2020 06:36:12 +0800</pubDate>
    <dc:creator>珍惜</dc:creator>
    <guid>https://zk1006.cn/archives/16.html</guid>
</item>
<item>
    <title>mac上使用使用rz,sz命令</title>
    <link>https://zk1006.cn/archives/15.html</link>
    <description><![CDATA[<p>首先安装iTerm2</p>
<p>使用brew 安装lrzsz</p>
<p>终端输入brew install lrzsz，如果没有安装homeBrew需要先安装</p>
<p>安装完成后检查 ls -alh /usr/local/bin/sz 是否存在</p>
<p>修改iterm2的配置：</p>
<pre><code>打开iterm2

同时按 command和,键 ------- Profiles ------  Default ---- Advanced ----- Triggers的Edit按钮</code></pre>
<p>下载 <a href="http://file.zk1006.cn/mac/iterm-lrszs.zip">http://file.zk1006.cn/mac/iterm-lrszs.zip</a></p>
<p>解压至/usr/local/bin/并赋执行权限</p>
<p>添加如下trigger</p>
<pre><code>Regular expression: \*\*B0100

Action: Run Silent Coprocess

Parameters: /usr/local/bin/iterm2-send-zmodem.sh</code></pre>
<hr />
<pre><code>Regular expression: \*\*B00000000000000

Action: Run Silent Coprocess

Parameters: /usr/local/bin/iterm2-recv-zmodem.sh</code></pre>]]></description>
    <pubDate>Thu, 05 Mar 2020 06:20:07 +0800</pubDate>
    <dc:creator>珍惜</dc:creator>
    <guid>https://zk1006.cn/archives/15.html</guid>
</item>
<item>
    <title>MAC-安装zsh</title>
    <link>https://zk1006.cn/archives/14.html</link>
    <description><![CDATA[<p>终端执行</p>
<pre><code class="language-shell">curl -Lo install.sh https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh
sh install.sh</code></pre>
<p>切换当前默认shell</p>
<pre><code class="language-shell">chsh -s /bin/zsh</code></pre>
<p>重新打开终端即可生效</p>
<p>zsh的配置文件在~/.zshrc</p>]]></description>
    <pubDate>Sat, 29 Feb 2020 01:30:00 +0800</pubDate>
    <dc:creator>珍惜</dc:creator>
    <guid>https://zk1006.cn/archives/14.html</guid>
</item>
<item>
    <title>git 提交报错 error: RPC failed; curl 92 HTTP/2 stream 0 was not closed cleanly: PROTOCOL_ERROR (err 1)</title>
    <link>https://zk1006.cn/archives/13.html</link>
    <description><![CDATA[<p>问题原因</p>
<p>1.搜罗一大堆最终指向这是http2本身的bug。</p>
<p>解决方式</p>
<p>1.(推荐)直接换掉Git的http版本</p>
<pre><code class="language-shell">git config --global http.version HTTP/1.1</code></pre>
<p>2.更改Git的http克隆为ssh，使用ssh进行提交和拉取代码</p>
<p>附：使用ssh连接Git操作指南</p>
<p>其他网上方式我也均有试过，但是都治标不治本。</p>
<ol>
<li>更改http buffer，第一次还有用，后面也歇菜了。</li>
</ol>
<pre><code class="language-shell">git config --global http.postBuffer 524288000</code></pre>
<p>2.重新克隆，好了几天，也完蛋了。尤其是合并别人大量代码之后立马就会出现</p>]]></description>
    <pubDate>Sun, 14 Jul 2019 17:31:00 +0800</pubDate>
    <dc:creator>珍惜</dc:creator>
    <guid>https://zk1006.cn/archives/13.html</guid>
</item>
<item>
    <title>docker安装kafka和zookeeper及spring-boot使用示例</title>
    <link>https://zk1006.cn/archives/12.html</link>
    <description><![CDATA[<p>先安装zookeeper</p>
<pre><code class="language-shell">docker run -d --restart=always --name zookeeper --volume /etc/localtime:/etc/localtime -p 2181:2181 -p 2888:2888 -p 3888:3888 -t zookeeper</code></pre>
<p>再安装kafka</p>
<pre><code class="language-shell">docker run -d --name kafka --publish 9092:9092 \
--link zookeeper \
--env KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 \
--env KAFKA_ADVERTISED_HOST_NAME=192.168.1.22 \
--env KAFKA_ADVERTISED_PORT=9092 --restart=always \
--volume /etc/localtime:/etc/localtime \
wurstmeister/kafka</code></pre>
<p>192.168.1.22为访问地址</p>
<p>下面为application.yml关于kafka配置</p>
<pre><code class="language-yaml">kafka:
  producer:
retries: 1
servers: 192.168.1.22:9092
linger: 1
batch:
  size: 4096
buffer:
  memory: 40960

  consumer:
auto:
  offset:
reset: latest
  commit:
interval: 100
servers: 192.168.1.22:9092
session:
  timeout: 20000
enable:
  auto:
commit: true
concurrency: 10
group:
  id: ${spring.application.name}-group</code></pre>
<p>java消费者配置类</p>
<pre><code class="language-java">
@Configuration
@EnableKafka
public class KafkaConsumerConfig {

    @Value("${kafka.consumer.servers}")
    private String servers;
    @Value("${kafka.consumer.enable.auto.commit}")
    private boolean enableAutoCommit;
    @Value("${kafka.consumer.session.timeout}")
    private String sessionTimeout;
    @Value("${kafka.consumer.auto.commit.interval}")
    private String autoCommitInterval;
    @Value("${kafka.consumer.group.id}")
    private String groupId;
    @Value("${kafka.consumer.auto.offset.reset}")
    private String autoOffsetReset;
    @Value("${kafka.consumer.concurrency}")
    private int concurrency;
    @Bean
    public KafkaListenerContainerFactory&lt;ConcurrentMessageListenerContainer&lt;String, String&gt;&gt; kafkaListenerContainerFactory() {
        ConcurrentKafkaListenerContainerFactory&lt;String, String&gt; factory = new ConcurrentKafkaListenerContainerFactory&lt;&gt;();
        factory.setConsumerFactory(consumerFactory());
        factory.setConcurrency(concurrency);
        factory.getContainerProperties().setPollTimeout(1500);
        return factory;
    }
    public ConsumerFactory&lt;String, String&gt; consumerFactory() {
        return new DefaultKafkaConsumerFactory&lt;&gt;(consumerConfigs());
    }
    public Map&lt;String, Object&gt; consumerConfigs() {
        Map&lt;String, Object&gt; propsMap = new HashMap&lt;&gt;(8);
        propsMap.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, servers);
        propsMap.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, enableAutoCommit);
        propsMap.put(ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG, autoCommitInterval);
        propsMap.put(ConsumerConfig.SESSION_TIMEOUT_MS_CONFIG, sessionTimeout);
        propsMap.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
        propsMap.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
        propsMap.put(ConsumerConfig.GROUP_ID_CONFIG, groupId);
        propsMap.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, autoOffsetReset);
        return propsMap;
    }
}</code></pre>
<p>java生产者配置类</p>
<p>@Configuration<br />
@EnableKafka<br />
public class KafkaProducerConfig {<br />
@Value(&quot;${kafka.producer.servers}&quot;)<br />
private String servers;<br />
@Value(&quot;${kafka.producer.retries}&quot;)<br />
private int retries;<br />
@Value(&quot;${kafka.producer.batch.size}&quot;)<br />
private int batchSize;<br />
@Value(&quot;${kafka.producer.linger}&quot;)<br />
private int linger;<br />
@Value(&quot;${kafka.producer.buffer.memory}&quot;)<br />
private int bufferMemory;<br />
@Bean<br />
public KafkaTemplate&lt;String, String&gt; kafkaTemplate() {<br />
return new KafkaTemplate(producerFactory());<br />
}<br />
public ProducerFactory&lt;String, String&gt; producerFactory() {<br />
return new DefaultKafkaProducerFactory&lt;&gt;(producerConfigs());<br />
}<br />
public Map&lt;String, Object&gt; producerConfigs() {<br />
Map&lt;String, Object&gt; props = new HashMap&lt;&gt;();<br />
props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, servers);<br />
props.put(ProducerConfig.RETRIES_CONFIG, retries);<br />
props.put(ProducerConfig.BATCH_SIZE_CONFIG, batchSize);<br />
props.put(ProducerConfig.LINGER_MS_CONFIG, linger);<br />
props.put(ProducerConfig.BUFFER_MEMORY_CONFIG, bufferMemory);<br />
props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);<br />
props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);<br />
return props;<br />
}<br />
}<br />
发送kafka消息类</p>
<pre><code class="language-java">
@Component
@Slf4j
public class KafkaMessageProducer {

   @Resource
   KafkaTemplate kafkaTemplate;

   /**
    * 发送消息
    *
    * @param message
    */
   public void sendMessage(ProducerMessage message) {
      log.info("kafka 请求参数:[{}]", JsonUtils.toJSONString(message));
      try {
         if (StringUtils.isNotBlank(message.getKey())) {
            this.kafkaTemplate.send(message.getTopic(), message.getKey(), message.getBody());
         } else {
            this.kafkaTemplate.send(message.getTopic(), message.getBody());
         }
      } catch (Exception e) {
         log.error("发送kafka异常:[{}]", message, e.getMessage(), e);
      }
      log.info("kafka response:[{}]", message);
   }
}</code></pre>
<p>接受kafka消息</p>
<pre><code class="language-java">
@KafkaListener(topics = {Constants.CREATE_ORDER_DELIVERY_TOPIC})
public void createReceivingAddress(String message){
   log.info("CREATE_ORDER_DELIVERY_TOPIC kafak message:{[]}",message);
   ReceivingAddress receivingAddress = JsonUtils.parseObject(message,ReceivingAddress.class);
   if(receivingAddress!=null){
      ReceivingAddress receivingAddressOld = receivingAddressService.findOneByEntity(receivingAddress);
      if(receivingAddressOld==null){
         receivingAddress.setStatus(DeliveryStatus.TO_BE_PAID);
         receivingAddressService.create(receivingAddress);
         return;
      }else{
         log.error("已存在订单:{[]}",JsonUtils.toJSONString(receivingAddressOld));
      }
   }else{
      log.error("CREATE_ORDER_DELIVERY_TOPIC kafka 消息异常");
   }
}</code></pre>]]></description>
    <pubDate>Tue, 09 Jul 2019 03:43:14 +0800</pubDate>
    <dc:creator>珍惜</dc:creator>
    <guid>https://zk1006.cn/archives/12.html</guid>
</item>
<item>
    <title>linux定时执行</title>
    <link>https://zk1006.cn/archives/11.html</link>
    <description><![CDATA[<p>定时语法说明<br />
crontab的基本格式：</p>
<ul>
<li>
<ul>
<li>
<ul>
<li>
<ul>
<li>
<ul>
<li>command<br />
星号分别为：分 时 日 月 周<br />
特殊的符号就是* / - ：</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><em>代表所有的取值范围内的数字<br />
/ 代表每的意思<br />
</em>/5 表示每5个单位<br />
-代表从某个数字到某个数字<br />
,分开几个离散的数字</p>
<p>例子<br />
0 3 <em> </em> * /root/test.sh 每天凌晨3点执行test.sh文件</p>
<ul>
<li>23-7/1 <em> </em> <em> /root/lnmp restart 晚上11点到早上7点之间，每隔一小时重启lnmp套件<br />
</em>/30 <em> </em> <em> </em> /usr/sbin/ntpdate 每半小时同步一下时间<br />
0 23 <em> </em> 6 /lnmp restart 每星期六的11 : 00 pm重启重启lnmp套件。<br />
<em>/1 </em> <em> </em> * echo “i am running.”&gt;&gt;/tmp/running.txt 每隔1分钟向/tmp/running.txt写一个”i am running.”字符串</li>
</ul>
<p>定时服务操作<br />
启动</p>
<pre><code class="language-shell">/etc/init.d/cron start</code></pre>
<p>关闭</p>
<pre><code class="language-shell">/etc/init.d/cron stop</code></pre>
<p>重启</p>
<pre><code class="language-shell">/etc/init.d/cron restart</code></pre>
<p>定时主文件目录：/etc/crontab<br />
根据用户所执行的定时设置目录：/var/spool/cron/crontabs/<br />
关联定时任务 crontab filename</p>
<p>crontab -u //设定某个用户的cron服务，一般root用户在执行这个命令的时候需要此参数<br />
crontab -l //列出某个用户cron服务的详细内容<br />
crontab -r //删除每个用户的cron服务<br />
crontab -e //编辑某个用户的cron服务</p>]]></description>
    <pubDate>Tue, 09 Jul 2019 03:39:00 +0800</pubDate>
    <dc:creator>珍惜</dc:creator>
    <guid>https://zk1006.cn/archives/11.html</guid>
</item>
<item>
    <title>java使用selenium示例</title>
    <link>https://zk1006.cn/archives/10.html</link>
    <description><![CDATA[<p>java网页爬虫感兴趣的可以了解下</p>
<p>pom.xml中配置如下</p>
<pre><code class="language-xml">&lt;dependency&gt;
    &lt;groupId&gt;org.seleniumhq.selenium&lt;/groupId&gt;
    &lt;artifactId&gt;selenium-java&lt;/artifactId&gt;
    &lt;version&gt;3.141.59&lt;/version&gt;
&lt;/dependency&gt;</code></pre>
<p>java代码如下</p>
<pre><code class="language-java">private ChromeOptions options = new ChromeOptions();
private ChromeDriver webDriver;

/**
 * 创建浏览器驱动和打开一个浏览器窗口
 * @return
 */
private ChromeDriver getChromeDriver(){
    this.options.addArguments("--incognito");
    List excludeSwitches=new ArrayList&lt;String&gt;();
    Map&lt;String, Object&gt; prefs = new HashMap&lt;String, Object&gt;();
    prefs.put("profile.managed_default_content_settings.images", 2);
    excludeSwitches.add("enable-automation");
    this.options.setExperimentalOption("excludeSwitches",excludeSwitches);
    this.options.setExperimentalOption("prefs",prefs);

    File file = new File(System.getProperty("user.dir") + "\\Google\\Chrome\\Application\\chromedriver.exe");
    if (file.exists()) {
        System.setProperty("webdriver.chrome.driver", file.getAbsolutePath());
    } else {
        System.setProperty("webdriver.chrome.driver", dir);
    }
    log.info("当前读取驱动路径:{}", System.getProperty("webdriver.chrome.driver"));

    return new ChromeDriver(this.options);
}</code></pre>
<p>webdriver.chrome.driver用于指定谷歌浏览器驱动路径</p>
<p>--incognito参数为隐身模式打开浏览器</p>
<p>profile.managed_default_content_settings.images参数为无图模式</p>
<p>enable-automation参数为屏蔽浏览器自动化控制提示(有部分网站会检测当前页面是否为自动化控制,请勿关闭右上角提示,否则会失效)</p>
<p>打开指定网站</p>
<p>this.webDriver.get(&quot;<a href="https://baidu.com">https://baidu.com</a>&quot;);<br />
获取当前浏览器打开的所有页面元素</p>
<p>this.webDriver.getPageSource();</p>]]></description>
    <pubDate>Tue, 09 Jul 2019 03:23:00 +0800</pubDate>
    <dc:creator>珍惜</dc:creator>
    <guid>https://zk1006.cn/archives/10.html</guid>
</item></channel>
</rss>