2019 第二週 開發筆記

2019.1.7

  • Spring Boot中使用@Async實現異步調用
    java.lang.IllegalStateException: Failed to load ApplicationContext
    @Async Demo 報錯

  • ThreadPoolTaskExecutor
    public Executor taskExecutor() {
            ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
            executor.setCorePoolSize(10);
            executor.setMaxPoolSize(20);
            executor.setQueueCapacity(200);
            executor.setKeepAliveSeconds(60);
            executor.setThreadNamePrefix("taskExecutor-");
            executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
            return executor;
    }

    核心線程數10:線程池創建時候初始化的線程數
    最大線程數20:線程池最大的線程數,只有在緩衝隊列滿了之後纔會申請超過核心線程數的線程
    緩衝隊列200:用來緩衝執行任務的隊列
    允許線程的空閒時間60秒:當超過了核心線程出之外的線程在空閒時間到達之後會被銷燬
    線程池名的前綴:設置好了之後可以方便我們定位處理任務所在的線程池
    線程池對拒絕任務的處理策略:這裏採用了CallerRunsPolicy策略,當線程池沒有處理能力的時候,該策略會直接在 execute 方法的調用線程中運行被拒絕的任務;如果執行程序已關閉,則會丟棄該任務
    setWaitForTasksToCompleteOnShutdown(true)該方法就是這裏的關鍵,用來設置線程池關閉的時候等待所有任務都完成再繼續銷燬其他的Bean,這樣這些異步任務的銷燬就會先於Redis線程池的銷燬。同時,這裏還設置了setAwaitTerminationSeconds(60),該方法用來設置線程池中任務的等待時間,如果超過這個時候還沒有銷燬就強制銷燬,以確保應用最後能夠被關閉,而不是阻塞住。


  • 啓動maven打的jar包 報錯
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.class]: Invocation of init method failed; nested exception is java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException
    在idea環境下跑項目沒有問題 不知道爲什麼命令啓動方式就報錯
    搜索資料後:
    翻譯一段:JAXB api被認爲是Java EE api,因此不再包含在Java SE 9默認的類路徑。在Java中11他們完全從JDK中刪除。
    加入下方依賴後解決問題 Java啓動jar包成功
    <dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.0</version>
    </dependency>

    那麼爲什麼idea下成功java執行jar包會失敗呢? 猜測:idea配置的jdk版本爲1.8 而本地默認jdk版本是11


  • 記錄一下最簡單的投產上線的方式
    如果你使用的是maven來管理項目,執行以下命令既可以

1.cd 項目跟目錄(和pom.xml同級)
mvn clean package
或者執行下面的命令
排除測試代碼後進行打包
mvn clean package -Dmaven.test.skip=true
2.把jar包放到服務器上
3.打包完成後jar包會生成到target目錄下,命名一般是 項目名+版本號.jar
啓動jar包命令
java -jar target/spring-boot-scheduler-1.0.0.jar
重啓:
ps -ef|grep java
##拿到對於Java程序的pid
kill -9 pid
##再次重啓
Java -jar xxxx.jar


  • 服務器安裝java 環境
    jdk
    下載Linux環境下的jdk1.8,請去(官網)中下載jdk的安裝文件;
    1 由於我的Linux是64位的,因此我下載jdk-8u131-linux-x64.tar.gz。http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.tar.gz
    如果Linux本身連接到互聯網,我們可以直接通過wget命令直接把JDK安裝包下載下來
    要是沒有外網的環境,還是安裝上面的方法下載安裝包,然後上傳到服務器當中
    解壓命令進行解壓
    2 $ tar -zxvf jdk-8u131-linux-x64.tar.gz
    3 修改環境變量
    用vim編輯器來編輯profile文件,在文件末尾添加一下內容
    export JAVA_HOME=/usr/local/src/jdk1.8.0_131
    export JRE_HOME=${JAVA_HOME}/jre
    export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:$CLASSPATH
    export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin
    export PATH=$PATH:${JAVA_PATH}
    然後,保存並退出(按:esc+Q+wq!)
    保存完之後,我們還需要讓這個環境變量配置信息裏面生效,要不然只能重啓電腦生效了。
    通過命令source /etc/profile讓profile文件立即生效
    ①、使用javac命令,不會出現command not found錯誤
    ②、使用java -version,出現版本爲java version "1.8.0_131"
    ③、echo $PATH,看看自己剛剛設置的的環境變量配置是否都正確
    maven
    1wget http://mirror.bit.edu.cn/apache/maven/maven-3/3.6.0/binaries/apache-maven-3.6.0-bin.tar.gz
    下載最新maven安裝包
    2tar vxf apache-maven-3.6.0-bin.tar.gz
    解壓縮
    3然後配置環境變量,執行 vim /etc/profile 打開環境變量配置文件,在PATH後追加: :$MAVEN_HOME/bin
    然後在最後添加兩行代碼,設置maven安裝目錄
    MAVEN_HOME=/usr/local/maven/apache-maven-3.3.9
    export MAVEN_HOME
    4mvn -v
    jekins
    http://www.ityouknow.com/springboot/2017/11/11/springboot-jenkins.html 參考純潔的微笑文章
    在下載過程中SSH Slaves 一直下載失敗 跳過了。

    2019.1.8

  • spring cloud 註冊eureka註冊服務消費者 報錯
    Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.example.demo.Feign.SchedualServiceHi': FactoryBean threw exception on object creation; nested exception is java.lang.NullPointerException
    待解決。重新建項目沒有此問題

  • 修改 varchar類型字段長度
    ALTER TABLE 表名 modify 字段名 類型(varchar(101))

    2019.1.9

  • docker部署springboot項目(最簡易)
    在項目中增加依賴略過
    安裝 Docker 環境
    安裝JDK
    安裝MAVEN
    https://www.cnblogs.com/ityouknow/p/8599093.html
    純潔的微笑教程
    需要補充的是需要在pom文件目錄下執行mvn package docker:build
    dockerfile在pom文件下目錄要匹配
    遇到的問題
    The goal you specified requires a project to execute but there is no POM in 沒有在pom文件目錄下執行命令
    java.lang.Exception: No runnable methodsbr/>這是因爲在單測方法前沒有加@Test。。。
    啓動成功

  • mac idea狀態欄開啓方式/切換jdk版本/以及開發環境跑不起來原因/
    1 選項欄view-toolbar
    2 2019 第二週 開發筆記
    點擊右邊第三個按鈕-project Settings-project 就可以切換版本了
    3 項目開發環境裏有rabbitmq消息隊列,報錯連不上,可以手邊有兩臺電腦,另一臺跑項目無問題,一下就想到了跑不起來這臺電腦是開着***。。。。

  • mysql連接問題
    Wed Jan 09 22:36:00 CST 2019 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
    Wed Jan 09 22:36:02 CST 2019 WARN: Caught while disconnecting...

EXCEPTION STACK TRACE:
BEGIN NESTED EXCEPTION

javax.net.ssl.SSLException
MESSAGE: closing inbound before receiving peer's close_notify

STACKTRACE:

javax.net.ssl.SSLException: closing inbound before receiving peer's close_notify
1.在數據庫連接的url中添加useSSL=false;
2.url中添加useSSL=true,並且提供服務器的驗證證書。
如果只是做一個測試的話,沒必要搞證書那麼麻煩啦,在連接後添加一個useSSL=false即可,例如:
spring.datasource.url=jdbc:mysql://localhost:3306/project?useSSL=false&useUnicode=true&characterEncoding=UTF-8


  • 實體類序列化問題
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'controller': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userRepository': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Not a managed type: class com.example.demo.entity.User

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userRepository': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Not a managed type: class com.example.demo.entity.User

Caused by: java.lang.IllegalArgumentException: Not a managed type: class com.example.demo.entity.User
at org.hibernate.jpa.internal.metamodel.MetamodelImpl.managedType(MetamodelImpl.java:210) ~[hibernate-entitymanager-5.0.12.Final.jar:5.0.12.Final]

缺少實體類序列化 public class User implements Serializable

2019.1.10

2019.1.11

一上班項目跑不起來 eureka連接不上。。maven clean /install 好使了 下次一定先試這個方法 耽誤了半小時。。哎

繼續dockerDemo
jpa連接數據庫報錯:
org.hibernate.InstantiationException: No default constructor for entity: :com.example.demo.entity.User
沒有實體的默認構造函數 居然犯了這種錯誤 。只寫了一個有參構造函數

自定義filter
import javax.servlet.*;
public class MyFilter implements Filter {}

@ControllerAdvice
攔截異常 做處理

配置swagger

配置log

配置 Actuator

docker查看對應容器日誌
ocker logs -f -t --since="2017-05-31" --tail=10 edu_web_1
--since : 此參數指定了輸出日誌開始日期,即只輸出指定日期之後的日誌。
-f : 查看實時日誌
-t : 查看日誌產生的日期
-tail=10 : 查看最後的10條日誌。
edu_web_1 : 容器名稱

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章