java学习

java学习

 

2018年5月21日

docker 笔记

下载的docker镜像默认存储路径是/var/lib/docker .具体的镜像文件就在containers文件夹中
docker save -o d:/docker/zen.tar easysoft/zentao:15.5
docker run -d -p 80:80  \
        -e ADMINER_USER="admin" -e ADMINER_PASSWD="qqzj126" -e MYSQL_ROOT_PASSWORD=qqzj126  \
        -e BIND_ADDRESS="false" \
        -v /opt/data/zbox/:/opt/zbox/ \
        -v /opt/mysqldata:/var/lib/mysql  \
        --name zentao-server \
        easysoft/zentao:15.5
  docker logs -f 

posted @ 2021-09-22 17:02 杨军威 阅读(79) | 评论 (0)编辑 收藏

后台运行jar包并输出日志

运行命令(注意路径)

java -jar /web/share-book.jar > /web/log.txt &
该命令的意思是:执行share-book.jar这个文件,并且输出到log.txt文件,&表示后台运行

解决更新项目带来的频繁重启操作,创建2个脚本

start.sh

#! /bin/bash
#注意:必须有&让其后台执行,否则没有pid生成   jar包路径为绝对路径
java -jar /web/share-book.jar > /web/log.txt &
 
# 将jar包启动对应的pid写入文件中,为停止时提供pid
echo $! > /web/pid.txt
stop.sh

#! /bin/bash
PID=$(cat /web/pid.txt)
kill -9 $PID

启动项目:./start.sh

停止项目:./stop.sh

posted @ 2021-06-01 13:56 杨军威 阅读(2876) | 评论 (0)编辑 收藏

HADOOP_HOME and hadoop.home.dir are unset

一.问题描述:windows本地调试Hadoop程序时报错
错误信息:
其原因是需要在windows本地搭建Hadoop环境,下载winutils文件,并将hadoop-2.8.4包内的bin文件替换,将下载文件中hadoop.dll放到C:\Windows\System32下
二.解决过程如下:
1.下载hadoop,去官网下载对应的hadoop版本,我在linux集群搭建的是hadoop-2.8.4,因此将hadoop-2.8.4下载到windows本地
https://www.jianshu.com/p/a65a95108620

posted @ 2021-04-19 09:45 杨军威 阅读(513) | 评论 (0)编辑 收藏

从git仓库中删除.idea文件夹

如果不配置.gitignore的文件,带push代码的时候就会把一写不必要的文件push到远程仓库,如.idea文件。如果不小心出现此文件在远程仓库可以通过一下步骤delete此文件:

1.配置.gitignore文件(新建/编辑)

echo '.idea' >> .gitignore

2.将.gitignore文件上传到远程仓库

git pull git add .gitignore git commit -m 'edit .gitignore' git push origin master

3.删除git的.idea文件

git rm --cached -r .idea

4.同步到远程仓库

git commit -m 'delete .idea' git push origin master

完成之后就可以发现git仓库中的.idea文件已经被删除,而且之后push代码也不会再把.idea文件上传。

PS:我在使用PyCharm编写python代码,一般是通过new -> .ignore file -> .gitignore file 自动生成.gitignore文件。
下面是我自己比较常用的.gitignore文件简短配置:

.project .settings/ .prefs .pydevproject .idea/ .idea .DS_Store .cache *.pyc *.html *.xlm

posted @ 2021-01-14 15:15 杨军威 阅读(171) | 评论 (0)编辑 收藏

GC overhead limit exceeded和java heap space

1、java heap space  一次申请太大的内存空间
2、GC overhead limit exceeded   创建太多的对象,gc收集不完

posted @ 2020-12-01 10:19 杨军威 阅读(268) | 评论 (0)编辑 收藏

缓存一致性和缓存雪崩

     摘要:   阅读全文

posted @ 2020-11-19 14:12 杨军威 阅读(70) | 评论 (0)编辑 收藏

linux Tomcat 开机启动配置

1、 vim /etc/rc.d/rc.local
2、添加内容
export JAVA_HOME=/usr/java/jdk1.8.0_111
/app/tomcat/bin/startup.sh start
3、
chmod 777 /etc/rc.d/rc.local

posted @ 2020-11-17 10:40 杨军威 阅读(116) | 评论 (0)编辑 收藏

java synchronized 锁对象

/**
* synchronized 放在普通方法上,内置锁就是当前类的实例
* @return
*/
public synchronized int getNext() {
return value ++;
}
/**
* 修饰静态方法,内置锁是当前的Class字节码对象
* Sequence.class
* @return
*/
public static synchronized int getPrevious() {
// return value --;
return 0;
}

posted @ 2020-10-30 16:37 杨军威 阅读(76) | 评论 (0)编辑 收藏

canal简单安装使用

1、数据库配置

首先使用canal需要修改数据库配置

[mysqld] 
log-bin=mysql-bin # 开启
binlog binlog-format=ROW # 选择 ROW 模式
server_id=1 # 配置 MySQL replaction 需要定义,不要和 canal 的 slaveId 重复

创建canal数据库用户

CREATE USER canal IDENTIFIED BY 'canal';  
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON
*.* TO 'canal'@'%';
FLUSH PRIVILEGES;

 

2、安装canal

下载:https://github.com/alibaba/canal/releases

解压(修改版本号):tar zxvf canal.deployer-1.1.4.tar.gz -C ./canal

配置开放服务器端口:11110、11111、11112

修改canal配置文件(这里设置了两个instance,即两个数据库):

vi canal/conf/canal.properties 
canal.destinations
= example1,example2

 配置instance:

cp -R canal/conf/example conf/example1
mv conf/example conf/example2

第一个数据库配置

vi canal/conf/example1/instance.properties
canal.instance.master.address
=32.1.2.140:3306

第二个数据库配置

vi canal/conf/example2/instance.properties
canal.instance.master.address
=32.1.2.140:3307

#如果需要新增一个instance,只需要修改canal.properties文件,并新增一个instance配置即可,无需重启canal。

运行:

sh canal/bin/startup.sh # 查看日志
cat canal/logs/canal/canal

 

3、Java使用样例

引入pom依赖,需要与安装的canal版本一致

复制代码
<dependencies>     <dependency>         <groupId>com.alibaba.otter</groupId>         <artifactId>canal.client</artifactId>         <version>1.1.4</version>     </dependency> </dependencies>
复制代码

示例代码(异步打印两个数据库的修改内容):

复制代码
package cn.spicybar.dblog;  import com.alibaba.otter.canal.client.CanalConnector; import com.alibaba.otter.canal.client.CanalConnectors; import com.alibaba.otter.canal.protocol.CanalEntry.Entry; import com.alibaba.otter.canal.protocol.CanalEntry.EntryType; import com.alibaba.otter.canal.protocol.CanalEntry.RowChange; import com.alibaba.otter.canal.protocol.Message;  import java.net.InetSocketAddress; import java.util.List;  public class CanalClient {      public static void main(String[] args) {         new Thread(() -> initConnector("example1")).start();         new Thread(() -> initConnector("example2")).start();     }      private static void initConnector(String destination) {         CanalConnector connector = CanalConnectors.newSingleConnector(new InetSocketAddress("32.1.0.237", 11111), destination, "", "");         try {             connector.connect();             connector.subscribe(".*\\..*");             connector.rollback();             while (true) {                 Message message = connector.getWithoutAck(1000);                 if (message.getId() != -1 && message.getEntries().size() > 0) {                     printEntry(message.getEntries());                 }                 connector.ack(message.getId());             }         } finally {             connector.disconnect();         }     }      private static void printEntry(List<Entry> entries) {         for (Entry entry : entries) {             if (entry.getEntryType() == EntryType.TRANSACTIONBEGIN || entry.getEntryType() == EntryType.TRANSACTIONEND) {                 continue;             }             try {                 RowChange rowChange = RowChange.parseFrom(entry.getStoreValue());                 System.out.println(rowChange.getSql());             } catch (Exception e) {                 throw new RuntimeException("ERROR ## parser error, data:" + entry.toString(), e);             }         }     }

posted @ 2020-08-31 10:55 杨军威 阅读(642) | 评论 (0)编辑 收藏

java 二分法查询数据

public int binarySearch(long value) {
int middle = 0;
int low = 0;
int pow = arr.length;

while(true) {
middle = (pow + low) / 2;
if(arr[middle] == value) {
return middle;
} else if(low > pow) {
return -1;
} else {
if(arr[middle] > value) {
pow = middle - 1;
} else {
low = middle + 1;
}
}
}
}

posted @ 2020-08-07 11:00 杨军威 阅读(124) | 评论 (0)编辑 收藏

redis windows安装

1.首先先把下载的压缩包解压到一个文件夹中
2.打开cmd指令窗口
3.输入你刚才解压的文件路径
4.然后输入redis-server redis.windows.conf 命令

接下来部署Redis为windows下的服务 首先关掉上一个窗口再打开一个新的cmd命令窗口

然后输入指令redis-server --service-install redis.windows.conf
随后,进入右击此电脑–管理–服务和应用程序–服务 启动服务
Redis常用的指令
卸载服务:redis-server --service-uninstall
开启服务:redis-server --service-start
停止服务:redis-server --service-stop
测试redis,通过cd到我们解压的目录,输入指令通过Set get指令查看是否成功

posted @ 2020-07-30 11:08 杨军威 阅读(393) | 评论 (0)编辑 收藏

修改了表结构,canal监控报错

检查配置文件/canal.deployer-1.1.1/conf/canal.properties
canal.instance.tsdb.spring.xml=classpath:spring/tsdb/h2-tsdb.xml
以及
# table meta tsdb info
canal.instance.tsdb.enable=true
canal.instance.tsdb.dir=${canal.file.data.dir:../conf}/${canal.instance.destination:}
canal.instance.tsdb.url=jdbc:h2:${canal.instance.tsdb.dir}/h2;CACHE_SIZE=1000;MODE=MYSQL;
canal.instance.tsdb.dbUsername=canal
canal.instance.tsdb.dbPassword=canal
检查 tsdb是否已经开启 
如果都已开启还是有这个问题 则需要清除canal对表结构的缓存
conf/example/h2.mv.db
问题2:找不到binlog日志文件
清空缓存
canal.deployer-1.1.1/conf/example/meta.dat

posted @ 2020-07-23 10:12 杨军威 阅读(1483) | 评论 (0)编辑 收藏

git 添加 gitignore

常规的windows操作

  • 根目录下创建gitignore.txt;
  • 编辑gitignore.txt,写下你的规则,例如加上node_modules/;
  • 打开命令行窗口,切换到根目录(可以直接在文件夹上面的地址栏输入cmd回车);
  • 执行命令ren gitignore.txt .gitignore。
在.gitignore中已经声明了忽略路径也是不起作用的,
这时候我们就应该先把本地缓存删除,然后再进行git的提交,这样就不会出现忽略的文件了。
  
解决方法: git清除本地缓存(改变成未track状态),然后再提交:
[root@kevin ~]# git rm -r --cached .
[root@kevin ~]# git add .
[root@kevin ~]# git commit -m 'update .gitignore'
[root@kevin ~]# git push -u origin master

posted @ 2020-05-18 16:55 杨军威 阅读(164) | 评论 (0)编辑 收藏

k8s 安装

安装k8s
systemctl disable firewalld
systemctl stop firewalld
yum update
yum install -y etcd kubernetes


vim /etc/kubernetes/apiserver
KUBE_ADMISSION_CONTROL改为下面的值
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRange
 vi /etc/kubernetes/manifests/kube-apiserver.yaml
--service-node-port-range: 1-65535
systemctl start etcd
systemctl start docker
如果启动docker 失败,修改 /etc/sysconfig/selinux 
     把 selinux后面改成 disabled , 重启机器,reboot -n  再启动docker就好了
systemctl start kube-apiserver
systemctl start kube-controller-manager
systemctl start kube-scheduler
systemctl start kubelet
systemctl start kube-proxy
kubectl create -f mytomcat-rc.yaml

posted @ 2020-04-27 13:37 杨军威 阅读(129) | 评论 (0)编辑 收藏

jenkins 编译并生成docker镜像

clean package docker:build -DpushImage

posted @ 2020-04-21 12:15 杨军威 阅读(156) | 评论 (0)编辑 收藏

DockerMaven的使用

1.使用DockerMaven,可以实现我们项目一键式部署,简便操作流程。
Maven插件自动部署步骤:
 a.首先我们要设置docker的宿主机开启权限.
修改宿主机的docker配置,让其可以远程访问     vi /lib/systemd/system/docker.service
其中ExecStart=后添加配置 -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
 b.刷新配置,重启服务
     systemctl daemon-reload
     systemctl restart docker
     docker start registry
 c.在工程pom.xml 增加配置
<build>
<finalName>app</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!-- docker的maven插件,官网:https://github.com/spotify/docker-maven-plugin
-->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.13</version>
<configuration>
<imageName>192.168.184.141:5000/${project.artifactId}:${project.version}
</imageName>
<baseImage>jdk1.8</baseImage>
<entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]
</entryPoint>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
<dockerHost>http://192.168.184.141:2375</dockerHost>
</configuration>
</plugin>
</plugins>
</build>

d.进入微服务项目路径  执行 mvn install

 e.然后执行mvn docker:build -DpushImage  执行完后会有输出
f.访问  http://192.168.1.9:5000/v2/_catalog  查看镜像是否上传成功

posted @ 2020-04-20 15:56 杨军威 阅读(1187) | 评论 (0)编辑 收藏

oracle interval分区

create table SAP_E_DSOQQZT_TMP
(
  id          NUMBER not null,
  request     NUMBER,
)
tablespace USERS
  pctfree 10
  initrans 1
  maxtrans 255
  storage
  (
    initial 16K
    next 8K
    minextents 1
    maxextents unlimited
  )
  partition by range(request) interval(1000000) 
(
partition SAP_E_DSOQQZT_part values less than(700000000)
);
-- Add comments to the columns 
comment on column SAP_E_DSOQQZT_TMP.id
  is 'ID';
comment on column SAP_E_DSOQQZT_TMP.request
  is '请求号';
-- Create/Recreate indexes 
create index FCREATETIMEA on SAP_E_DSOQQZT_TMP ( REQUEST)
  tablespace ZHFXBEMS
  pctfree 10
  initrans 2
  maxtrans 255
  storage
  (
    initial 1847M
    next 1M
    minextents 1
    maxextents unlimited
  );
-- Create/Recreate primary, unique and foreign key constraints 
alter table SAP_E_DSOQQZT_TMP
  add constraint PK_SAP_E_DSOQQZTA primary key (ID)
  using index 
  tablespace USERS
  pctfree 10
  initrans 2
  maxtrans 255
  storage
  (
    initial 112M
    next 1M
    minextents 1
    maxextents unlimited
  );
第二步:判断表是否可以在线从新定义
begin
 dbms_redefinition.can_redef_table('ERPSU','SAP_E_DSOQQZT',DBMS_REDEFINITION.CONS_USE_PK);
 end;
第三步:开始执行数据的迁移(30分钟)
begin
 DBMS_REDEFINITION.START_REDEF_TABLE('ERPSU','SAP_E_DSOQQZT', 'SAP_E_DSOQQZT_TMP');
end;
第四步:进行权限对象的迁移
 DECLARE
num_errors PLS_INTEGER;
BEGIN
DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS('ERPSU','SAP_E_DSOQQZT', 'SAP_E_DSOQQZT_TMP',
DBMS_REDEFINITION.CONS_ORIG_PARAMS, TRUE, TRUE, TRUE, TRUE, num_errors);
END;
第五步:结束整个重定义
BEGIN
DBMS_REDEFINITION.FINISH_REDEF_TABLE('ERPSU','SAP_E_DSOQQZT', 'SAP_E_DSOQQZT_TMP');
END;
第六步,删除临时表  SAP_E_DSOQQZT_TMP
万一哪一步出错,执行:
BEGIN
DBMS_REDEFINITION.ABORT_REDEF_TABLE(uname => 'ERPSU',
orig_table => 'SAP_E_DSOQQZT',
int_table => 'SAP_E_DSOQQZT_TMP'
);
END;
-----------------------------------------------------------------------------

posted @ 2020-04-16 17:11 杨军威 阅读(127) | 评论 (0)编辑 收藏

docker 命令

删除所有的docker镜像
docker rmi `docker images -q`   (`符号是esc下面的按键)
交互式方式创建容器
docker run -it --name=容器名称 镜像名称:标签 /bin/bash
进入守护式的容器
docker exec -it 容器名称 /bin/bash
-i  表示运行容器
-t  表示容器启动后进入容器命令行,容器创建后可以登录进去
--name  给容器命名
-v  表示目录映射关系(前者是宿主机目录,后者是容器目录),可以用多个-v做多个目录或者文件映射,最好做目录映射,在宿主机上做修改,然后共享到容器上。
-d  创建一个守护容器在后台运行,如果只加-i-t,创建后会自动进去容器。
-p  表示端口映射,前者是宿主机端口,后者是容器内的端口,可以多个端口映射
docker stop 容器id      (停止容器)
docker start 容器id      (停止容器)
向容器内复制文件
docker cp 需要复制的文件目录  容器:容器内的目录
从容器内复制文件
docker cp  容器:容器内的目录 需要复制的文件目录

posted @ 2020-04-12 17:31 杨军威 阅读(69) | 评论 (0)编辑 收藏

centos7 安装docker

 1、yum包更新到最新
  sudo yum update
    2 、安装需要的软件包
 sudo yum install -y yum-utils device-mapper-persistent-data lvm2
    3、设置yum源为阿里云
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    4、 安装docker
 sudo yum install docker-ce
    5、查看版本
 docker -v
6、修改镜像下载源
 vi /etc/docker/daemon.json
写入:
{
"registry-mirrors": ["http://docker.mirrors.ustc.edu.cn"]
}
7、启动docker
systemctl start docker
8、docker 开机自动启动
systemctl enable docker

posted @ 2020-04-08 14:14 杨军威 阅读(100) | 评论 (0)编辑 收藏

docker build和run命令

编写完Dockerfile,执行构建命令
docker build -t 192.168.1.9:5000/admin-service .
docker run -p 8888:8888 192.168.1.9:5000/admin-service

posted @ 2020-04-03 17:36 杨军威 阅读(577) | 评论 (0)编辑 收藏

分布式锁应该具备的条件

1、在分布上系统环境下,一个方法在同一时间只能被一个机器上的一个线程访问
2、高可用的获取锁和释放锁
3、高效的获取锁和释放锁
4、具备可重入特性(重新进入,由多个任务并发使用,不比担心数据错误)
5、具备锁的失效机制,防止死锁
6、具备非阻塞锁的特性,没有获取到锁,直接返回获取锁失败

posted @ 2020-03-24 12:47 杨军威 阅读(532) | 评论 (0)编辑 收藏

docker 安装 registry

1。新建/usr/local/docker/registry  文件夹
2、在registry中新建docker-compose.yml文件,编辑此文件
version: '3.1'
services:
 registry:
  image: registry:2.7.1
  restart: always
  container_name: registry
  ports:
   - 5000:5000
  volumes:
   - /usr/local/docker/registry/data:/var/lib/registry
 frontend:
    image: konradkleine/docker-registry-frontend:v2
    ports:
      - 8080:80
    volumes:
      - ./certs/frontend.crt:/etc/apache2/server.crt:ro
      - ./certs/frontend.key:/etc/apache2/server.key:ro
    environment:
      - ENV_DOCKER_REGISTRY_HOST=192.168.1.8
      - ENV_DOCKER_REGISTRY_PORT=5000
3.运行 docker-compose up
4.上传镜像
docker tag tomcat 192.168.1.8:5000/tomcat:8.1
 docker push 192.168.1.8:5000/tomcat:8.1

posted @ 2020-03-19 18:17 杨军威 阅读(124) | 评论 (0)编辑 收藏

docker 安装MySQL

version: '3.1' services: mysql: restart: always image: mysql:5.7.22 container_name: mysql ports: - 3306:3306 environment: TZ: Asia/Shanghai MYSQL_ROOT_PASSWORD: 123456 command: --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci --explicit_defaults_for_timestamp=true --lower_case_table_names=1 --max_allowed_packet=128M --sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO" volumes: - mysql-data:/var/lib/mysql volumes: mysql-data:

version: '3.1' services: db: image: mysql restart: always environment: MYSQL_ROOT_PASSWORD: 123456 command: --default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci --explicit_defaults_for_timestamp=true --lower_case_table_names=1 ports: - 3306:3306 volumes: - ./data:/var/lib/mysql adminer: image: adminer restart: always ports: - 8080:8080

posted @ 2020-03-19 13:29 杨军威 阅读(114) | 评论 (0)编辑 收藏

docker离线安装

批量安装依赖包:rpm -Uvh *.rpm --nodeps --force

安装 container-selinux-2.9-4.el7.noarch.rpm : rpm -Uvh container-selinux-2.9-4.el7.noarch.rpm

pasting

安装 dockerrpm -Uvh docker-ce-18.03.1.ce-1.el7.centos.x86_64.rpm

pasting
  • 启动docker:systemctl start docker
  • 查看docker启动容器列表: docker ps

posted @ 2020-03-17 13:50 杨军威 阅读(225) | 评论 (0)编辑 收藏

oracle 表空间修改

select d.file_name,d.tablespace_name,d.autoextensible from dba_temp_files d;
select d.file_name,d.tablespace_name,d.autoextensible from DBA_DATA_FILES d;
drop tablespace tablespace_name including contents and datafiles;
ALTER TABLESPACE users ADD DATAFILE
'/app/oradata/orclnew/orclnew/users02.dbf' 
size 7167M autoextend on ;


SELECT sid, serial#, username, osuser FROM v$session where sid in (select session_id from v$locked_object);
删除连接的session
ALTER SYSTEM KILL SESSION '9,4335';
导出oracle数据
exp xxx/xxx@orclnew file=/app/backup.dmp owner=xxx rows=n 
当导出报错信息是 EXP-00091: Exporting questionable statistics时,执行下面的语句
select userenv('language') from dual;
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK

posted @ 2019-11-28 17:13 杨军威 阅读(81) | 评论 (0)编辑 收藏

反编译jar重新打包jar

1、使用反编译工具找到需要修改的class文件,保存成Java文件。
2、新建Java项目,导入所有需要的jar,在src中放入需要修改的Java文件。
3、修改完毕后,在bin中找到新生成的class文件,解压原来的jar,替换class文件。
4.有三种方式重新打包,a 把解压替换过的jar文件导入到eclipse中,导出jar
b 使用zip压缩格式,修改后缀名jar
c  进入文件目录,使用执行jar -cvf aa.jar

posted @ 2019-06-06 12:32 杨军威 阅读(1527) | 评论 (0)编辑 收藏

java future 线程模式

public interface Data {
String getResult();
}
public class FutureData implements Data{
protected Data data=null;
protected boolean f=false;
public synchronized void setData(Data data) {
if(f) {
return;
}
f=true;
this.data=data;
notifyAll();
}
@Override
public synchronized String getResult() {
while (!f) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return data.getResult();
}
}
public class RealData implements Data{
protected  String s;
public RealData(String name) {
StringBuffer sb=new StringBuffer("");
for (int i = 0; i < 10; i++) {
sb.append(name);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
s=sb.toString();
}
@Override
public String getResult() {
// TODO Auto-generated method stub
return s;
}
}
public class Client {
public Data request(final String ss) {
final FutureData f=new FutureData();
new Thread() {
public void run() {
RealData r=new RealData(ss);//模拟复杂的数据封装和处理
f.setData(r);
};
}.start();
return f;
public static void main(String[] args) {
Client client=new Client();
Data d = client.request("123");
System.out.println(d.getResult());
}
}
public class FutureTest {
public static void main(String[] args) throws InterruptedException, ExecutionException {
ExecutorService e=Executors.newFixedThreadPool(11);
FutureTask<String> f=new FutureTask<>(new Callable<String>() {
@Override
public String call() throws Exception {
Thread.sleep(5000);
return "aa";
}
}); 
e.submit(f);
System.out.println(f.get());
}
}

posted @ 2019-02-18 10:08 杨军威 阅读(114) | 评论 (0)编辑 收藏

定期清理tomcat日志


vi clean.sh


logs_path="/appqqq/tomcat/logs"

find $logs_path -mtime +3 -name "localhost.*.log" -exec rm -rf {} \;
find $logs_path -mtime +3 -name "localhost_access_log.*.txt" -exec rm -rf {} \;
find $logs_path -mtime +3 -name "catalina.*.log" -exec rm -rf {} \;
find $logs_path -mtime +3 -name "manager.*.log" -exec rm -rf {} \;
find $logs_path -mtime +3 -name "host-manager.*.log" -exec rm -rf {} \;
find $logs_path -mtime +3 -name "fileservice.log.*" -exec rm -rf {} \;
>$logs_path/catalina.out;




chmod 777 clean.sh

crontab -e

0 2 * * * sh /appqqq/tomcat/logs/clean.sh

posted @ 2018-11-29 18:09 杨军威 阅读(370) | 评论 (0)编辑 收藏

elasticsearch 商品搜索信息的crud简单操作

课程大纲
1、document数据格式
2、电商网站商品管理案例:背景介绍
3、简单的集群管理
4、商品的CRUD操作(document CRUD操作)
----------------------------------------------------------------------------------------------------------------------------
1、document数据格式
面向文档的搜索分析引擎
(1)应用系统的数据结构都是面向对象的,复杂的
(2)对象数据存储到数据库中,只能拆解开来,变为扁平的多张表,每次查询的时候还得还原回对象格式,相当麻烦
(3)ES是面向文档的,文档中存储的数据结构,与面向对象的数据结构是一样的,基于这种文档数据结构,es可以提供复杂的索引,全文检索,分析聚合等功能
(4)es的document用json数据格式来表达
2、电商网站商品管理案例背景介绍
有一个电商网站,需要为其基于ES构建一个后台系统,提供以下功能:
(1)对商品信息进行CRUD(增删改查)操作
(2)执行简单的结构化查询
(3)可以执行简单的全文检索,以及复杂的phrase(短语)检索
(4)对于全文检索的结果,可以进行高亮显示
(5)对数据进行简单的聚合分析
----------------------------------------------------------------------------------------------------------------------------
3、简单的集群管理
(1)快速检查集群的健康状况
es提供了一套api,叫做cat api,可以查看es中各种各样的数据
GET /_cat/health?v
epoch      timestamp cluster       status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1488006741 15:12:21  elasticsearch yellow          1         1      1   1    0    0        1             0                  -                 50.0%
epoch      timestamp cluster       status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1488007113 15:18:33  elasticsearch green           2         2      2   1    0    0        0             0                  -                100.0%
epoch      timestamp cluster       status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1488007216 15:20:16  elasticsearch yellow          1         1      1   1    0    0        1             0                  -                 50.0%
如何快速了解集群的健康状况?green、yellow、red?
green:每个索引的primary shard和replica shard都是active状态的
yellow:每个索引的primary shard都是active状态的,但是部分replica shard不是active状态,处于不可用的状态
red:不是所有索引的primary shard都是active状态的,部分索引有数据丢失了
为什么现在会处于一个yellow状态?
我们现在就一个笔记本电脑,就启动了一个es进程,相当于就只有一个node。现在es中有一个index,就是kibana自己内置建立的index。由于默认的配置是给每个index分配5个primary shard和5个replica shard,而且primary shard和replica shard不能在同一台机器上(为了容错)。现在kibana自己建立的index是1个primary shard和1个replica shard。当前就一个node,所以只有1个primary shard被分配了和启动了,但是一个replica shard没有第二台机器去启动。
做一个小实验:此时只要启动第二个es进程,就会在es集群中有2个node,然后那1个replica shard就会自动分配过去,然后cluster status就会变成green状态。
(2)快速查看集群中有哪些索引
GET /_cat/indices?v
health status index   uuid                   pri rep docs.count docs.deleted store.size pri.store.size
yellow open   .kibana rUm9n9wMRQCCrRDEhqneBg   1   1          1            0      3.1kb          3.1kb
(3)简单的索引操作
创建索引:PUT /test_index?pretty
health status index      uuid                   pri rep docs.count docs.deleted store.size pri.store.size
yellow open   test_index XmS9DTAtSkSZSwWhhGEKkQ   5   1          0            0       650b           650b
yellow open   .kibana    rUm9n9wMRQCCrRDEhqneBg   1   1          1            0      3.1kb          3.1kb
删除索引:DELETE /test_index?pretty
health status index   uuid                   pri rep docs.count docs.deleted store.size pri.store.size
yellow open   .kibana rUm9n9wMRQCCrRDEhqneBg   1   1          1            0      3.1kb          3.1kb
----------------------------------------------------------------------------------------------------------------------------
4、商品的CRUD操作
(1)新增商品:新增文档,建立索引
PUT /index/type/id
{
  "json数据"
}
PUT /ecommerce/product/1
{
    "name" : "gaolujie yagao",
    "desc" :  "gaoxiao meibai",
    "price" :  30,
    "producer" :      "gaolujie producer",
    "tags": [ "meibai", "fangzhu" ]
}
{
  "_index": "ecommerce",
  "_type": "product",
  "_id": "1",
  "_version": 1,
  "result": "created",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "created": true
}
PUT /ecommerce/product/2
{
    "name" : "jiajieshi yagao",
    "desc" :  "youxiao fangzhu",
    "price" :  25,
    "producer" :      "jiajieshi producer",
    "tags": [ "fangzhu" ]
}
PUT /ecommerce/product/3
{
    "name" : "zhonghua yagao",
    "desc" :  "caoben zhiwu",
    "price" :  40,
    "producer" :      "zhonghua producer",
    "tags": [ "qingxin" ]
}
es会自动建立index和type,不需要提前创建,而且es默认会对document每个field都建立倒排索引,让其可以被搜索
(2)查询商品:检索文档
GET /index/type/id
GET /ecommerce/product/1
{
  "_index": "ecommerce",
  "_type": "product",
  "_id": "1",
  "_version": 1,
  "found": true,
  "_source": {
    "name": "gaolujie yagao",
    "desc": "gaoxiao meibai",
    "price": 30,
    "producer": "gaolujie producer",
    "tags": [
      "meibai",
      "fangzhu"
    ]
  }
}
(3)修改商品:替换文档
PUT /ecommerce/product/1
{
    "name" : "jiaqiangban gaolujie yagao",
    "desc" :  "gaoxiao meibai",
    "price" :  30,
    "producer" :      "gaolujie producer",
    "tags": [ "meibai", "fangzhu" ]
}
{
  "_index": "ecommerce",
  "_type": "product",
  "_id": "1",
  "_version": 1,
  "result": "created",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "created": true
}
{
  "_index": "ecommerce",
  "_type": "product",
  "_id": "1",
  "_version": 2,
  "result": "updated",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "created": false
}
PUT /ecommerce/product/1
{
    "name" : "jiaqiangban gaolujie yagao"
}
替换方式有一个不好,即使必须带上所有的field,才能去进行信息的修改
(4)修改商品:更新文档
POST /ecommerce/product/1/_update
{
  "doc": {
    "name": "jiaqiangban gaolujie yagao"
  }
}
{
  "_index": "ecommerce",
  "_type": "product",
  "_id": "1",
  "_version": 8,
  "result": "updated",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  }
}
我的风格,其实有选择的情况下,不太喜欢念ppt,或者照着文档做,或者直接粘贴写好的代码,尽量是纯手敲代码
(5)删除商品:删除文档
DELETE /ecommerce/product/1
{
  "found": true,
  "_index": "ecommerce",
  "_type": "product",
  "_id": "1",
  "_version": 9,
  "result": "deleted",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  }
}
{
  "_index": "ecommerce",
  "_type": "product",
  "_id": "1",
  "found": false
}

posted @ 2018-11-10 18:31 杨军威 阅读(135) | 评论 (0)编辑 收藏

每个班的前10名的MySQL 查询方法

  1. select a.class,a.score
  2. from student a
  3. where (select count(*) from student where class=a.class and a.score<score)<3
  4. order by a.class,a.score desc;

posted @ 2018-08-09 14:32 杨军威 阅读(508) | 评论 (0)编辑 收藏

git ssl tls 报错需要执行的命令

 git config --global http.sslVerify false

posted @ 2018-07-04 15:27 杨军威 阅读(441) | 评论 (0)编辑 收藏

java值传递的例子

public class Test {
//不能正确调换值
public static void swap(Integer a,Integer b){
Integer t=a;
a=b;
b=t;
System.out.println("a="+a);
System.out.println("b="+b);
}
public static void main(String[] args) {
Integer a=1;
Integer b=2;
System.out.println("a="+a);
System.out.println("b="+b);
System.out.println("----------");
swap(a, b);
System.out.println("----------");
System.out.println("a="+a);
System.out.println("b="+b);
}
}
在内存中,真实的值放在heap中,变量a,b放在栈中,a,b保存的是值在heap中的地址,当调用swap方法时,形参也是保存在栈中,是新的变量,指向heap中真的值,并没有修改原先a,b的指向,所以无法交换值。

posted @ 2018-06-08 14:24 杨军威 阅读(156) | 评论 (0)编辑 收藏

spring中Condition接口的用法

matches方法返回true,装配bean,返回false,不装配bean,在需要可能装配的bean的方法和类上加上注解@Conditional(XXXCondition.class)

posted @ 2018-05-21 15:42 杨军威 阅读(560) | 评论 (0)编辑 收藏

spring中BeanPostProcessor接口的使用

@Component
public class AllBeanPostProcessor implements BeanPostProcessor{
//对象属性设置方法完成后,init方法执行前执行
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("BeforeInit="+beanName);
return bean;
}
//init方法执行后执行
public  Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("AfterInit="+beanName);
return bean;
}
}

posted @ 2018-05-21 10:04 杨军威 阅读(106) | 评论 (0)编辑 收藏

spring中BeanDefinitionRegistryPostProcessor接口的使用

@Component
public class MyBeanFactoryPostProcessor2 implements BeanDefinitionRegistryPostProcessor{
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
// TODO Auto-generated method stub
}
//可以动态把对象注入spring对象
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
for (int i = 0; i < 10; i++) {
BeanDefinitionBuilder b=BeanDefinitionBuilder.rootBeanDefinition(User.class);
b.addPropertyValue("name", "admin"+i);
registry.registerBeanDefinition("user"+i, b.getBeanDefinition());
}
}
}

posted @ 2018-05-21 10:03 杨军威 阅读(2862) | 评论 (0)编辑 收藏

导航

统计

常用链接

留言簿

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜