分類
發燒車訊

巴基斯坦洩漏不明氣體 至少14死逾600人不適

摘錄自2020年2月19日星島日報報導

巴基斯坦南部信德省卡拉奇洩漏不明氣體,至少14人死亡,約650人不適。

事發在本月16日晚上,卡拉奇洩漏不明氣體,導致數百人身體不適,湧入醫院求診。有市民表示,當晚看到空氣中瀰漫着煙霧,吸入後立即無法呼吸和想嘔吐,有人就出現心跳加速、胸口痛、眼睛痕癢等癥狀。而事故發生後,不少人都帶上口罩,希望避免吸入氣體,有人吸入洩漏氣體後不久就死亡。

當局表示,目前仍無法判斷氣體的種類和洩漏來源,初步無人為破壞跡象,目前將居民暫時撤離至安全地點。巴基斯坦軍方也派出化學兵前往當地進行進一步探測。

另外,該區周二有數百人上街集會以示不滿,要求當局盡快查明氣體來源。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

※專營大陸快遞台灣服務

台灣快遞大陸的貨運公司有哪些呢?

分類
發燒車訊

VS2019打包WPF安裝程序最新教程

VS2019打包WPF安裝程序最新教程,使用Visual Studio 2019開發的WPF程序如果想要打包為安裝程序,除了在VS2019找到WPF項目類庫直接右鍵發布之外,更常用的還是將其打包為exe或者msi的安裝程序;打包成安裝程序的話,客戶得到安裝程序直接安裝即可使用,即使在離線環境情況下,安裝好就可以使用了。

一些傳統行業發布程序時,比較常用這種方法,如醫療,教育等。

演示程序打包一覽

在本教程中,我完整的打包了一個簡單的WPF程序,最終安裝好了以後,在桌面有一個我的程序的快捷方式圖標,點擊這個圖標即可打開應用程序。

WPF安裝程序桌面圖標  

程序運行后的效果如下所示:

VS2019打包WPF安裝程序運行效果 

VS2019打包WPF安裝程序步驟

使用VS2019打包WPF安裝程序有很多種方法,本篇教程基於VS擴展插件Microsoft Visual Studio Installer Projects工具來打包,實際上此工具,在VS2010時自帶有,只是後面版本的Visual Studio取消了此插件,現在需要單獨安裝。

安裝打包Installer插件

安裝Microsoft Visual Studio Installer Projects插件有兩種方式。一是下載插件單獨安裝,二是在VS裏面在線安裝。

Microsoft Visual Studio Installer Projects下載地址:

官方下載地址:

 

下載下來后,你會在你的保存目錄看到此文件的圖標是這樣的,直接雙擊安裝就可以了,如果打開了Visual Studio,先將VS關閉后再安裝即可。

安裝插件

如果你不能從官網下載到,可以從本站直接下載即可。離線下載安裝的方式適用於斷網環境開發。

VS在線安裝Microsoft Visual Studio Installer Projects

Microsoft Visual Studio Installer Projects插件也可以在線直接安裝,步驟為:點擊菜單欄【擴展(X)】,然後在彈出來的一個窗體裏面,在右側搜索框裏面搜索“Microsoft Visual Studio Installer Projects”,一般第1個就是它了,然後點擊Download(下載),然後安裝就可以了。

VS在線安裝Microsoft Visual Studio Installer Projects

點擊Download后如下:

下載插件

下載完畢后,你需要把VS關閉掉,它會自動的安裝。

自動安裝插件

安裝好了后,啟動VS即可。

創建安裝項目

重新打開Visual Studio,打開一個你現有的包含WPF項目的解決方案即可,然後創建安裝項目。在解決方案上右鍵 –> 【新建項目】–> 【Setup Project】,添加Setup Project項目時,VS2019可以搜索項目模板,如下圖所示。

創建安裝項目

創建好了后,主界面變成如下圖所示:

安裝項目主界面

左邊窗口三個文件夾圖片說明如下:

Application Folder:應用程序包含的文件設置,指最終在客戶電腦上的安裝根目錄。如下圖所示:

應用程序目錄子目錄

User’s Desktop:用戶桌面快捷方式設置,用戶桌面,一般放個快捷圖標。

User’s Programs Menu:用戶啟動菜單的快捷方式設置,一般也是放快捷圖標。

Application Folder是安裝程序的根目錄,你編寫的程序生成的dll,安裝后就存放在這個目錄。

添加項目輸出

安裝項目建好了后,需要要往裡面添加項目輸出,操作方式為:右鍵Application Folder —>Add—>項目輸出。

該操作也可以直接在安裝程序項目類庫上面通過右鍵操作來添加項目輸出,如下圖所示:

右鍵設置屬性

設置項目屬性

項目屬性的設置,是用於最終一個生成安裝程序的描述信息,這個描述信息,這個描述信息主要內容有程序的作者,標題,公司信息,技術支持等等。最直觀的方式可以通過2種方式查看。

第一種查看方式:安裝前將鼠標放到安裝程序文件上,會有提示信息,如下圖所示:

屬性提示

第二種查看方式:安裝后在控制面板處,找到安裝程序,即可查看,如下圖所示:

控制面板看到的安裝后程序描述  

項目屬性的設置方式為:(1)左鍵選中項目,(2)點擊解決方案欄屬性,注意,不是右鍵選擇屬性,而是如下圖一樣選擇屬性。

設置安裝程序屬性

當你點了屬性后,會出現如下的窗口。

設置屬性主窗口

在當前的演示程序中,我是按照上圖做的設置,設置都很簡單,不需要做額外的解釋,如果有不明白的,可以加群與我聯繫。

添加快捷方式圖標

程序安裝好,我們當然希望用戶能夠快速的打開我們的應用程序,你就需要為你的安裝程序製作快捷方式,方法很簡單。

方法:(1)中間窗口右鍵,創建新的快捷方式

創建新的快捷方式

(2)彈窗裏面選擇Application Folder,雙擊進入另外一個界面

創建新的快捷方式第2步

雙擊后,進入下圖這個界面,選擇主輸出即可。

創建新的快捷方式第3步

完了後點擊OK按鈕,就進入下圖這個界面。然後將快捷方式名稱改為你應用程序的名稱。

改快捷方式圖標名稱

改名后的效果:

改名后的效果

最後一步,也是最重要一步,在上圖中選中改名后的圖標,將其拖到左側窗口User’s Desktop目錄即可。

拖動快捷方式圖標到對應位置

開始菜單圖標(User’s Programs Menu)設置方式同上面的步驟是一樣的,這裏就不再重複了。

依賴文件

打包正式項目的時候,界面程序可能依賴於很多其它類庫,或者第3方的dll文件,我們需要把它們一起打包,並且這些第3方程序或者dll需要同主程序在同一個安裝路徑下,那麼在打包時,也就需要額外的把這些文件也打包進來。

所有的操作都可以在中間窗口通過右鍵添加文件,程序集來實現,如下圖所示

添加依賴文件

添加註冊表項目

製作的安裝包如果要添加註冊表項目,可以通過選中安裝程序項目,然後右鍵,在彈出的菜單裏面找到【View】,即可以添加註冊表項目,按照提示一步一步操作即可。

另外有些打包的程序,需要在安裝前或者安裝后做一些額外的操作,都可以通過自定義操作來實現,如主程序安裝好了以後,還得安裝一個windows服務程序,再安裝另外一個自動升級程序,都可以通過這裏來實現。

添加註冊表項目

以上的基本操作熟悉后,相信對於簡單的桌面程序打包應該沒有什麼問題了。

另外需要注意的是,對外打包,需要更改為Release模式

打包依賴框架

最後再說一下關於 .net 環境的問題,如果你需要在打包時,將相應版本的.Net Framework一起打包到安裝程序裏面也是可以的,只是要注意,有可能你的打包機器上並沒有安裝相應的.net framework文件,則需要到官方或者網上下載對應版本的文件,例如這個演示程序,我設定的依賴框架是 4.5.2版本的,那麼需要將NDP452-KB2901907-x86-x64-AllOS-CHS.exe(.net framework 4.5.2安裝文件)放到指定目錄才能正常的生成打包文件。

需要將.net 的離線安裝文件放到以下目錄,其它版本則注意下路徑即可,一般C:\Program Files (x86)\Microsoft SDKs\ClickOnce Bootstrapper\Packages

目錄下面有不同版本的以DotNetFX開頭的目錄,如下圖所示:

依賴框架保存目錄 依賴框架保存目錄

將相應的版本的.net framework框架文件放到對應的目錄即可,我這個演示程序是放到下面這個目錄的。

C:\Program Files (x86)\Microsoft SDKs\ClickOnce Bootstrapper\Packages\DotNetFX452\zh-Hans

具體打包步驟為:右鍵安裝項目,選擇屬性,彈出窗口點擊Prerequisites…按鈕。再在彈出的窗口選擇你應用程序需要的框架版本即可。可以選擇多個。

Prerequisites

選擇需要打包的框架版本即可。

框架版本

待安裝程序打包成功后,即可在生成目錄看到該框架的安裝包,如下圖所示:

生成目錄框架文件

好了,以上就是使用VS2019打包WPF安裝程序的完整步驟。

演示程序可以點擊這裏下載。

打包后安裝一覽

成生打包文件成功后,就可以雙擊msi或者exe文件進行安裝了,安裝效果圖如下:

安裝打包程序

選擇安裝目錄

安裝打包程序

在演示的這個打包程序裏面,比較簡單,實際上你可以添加用戶協議文件,輸入用戶信息后才能安裝,這些都可以在打包時設置。

演示程序源碼可以在原文鏈接處下載

本文首發於:

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

※專營大陸快遞台灣服務

台灣快遞大陸的貨運公司有哪些呢?

分類
發燒車訊

西伯利亞發現仍遠古死鳥 估計有4.6萬年歷史

摘錄自2020年2月23日星島日報報導

科學家正研究一隻在俄羅斯西伯利亞冰天地雪地中發現、估計由對上一次冰河時期保留到現在的雀鳥屍體,推算牠已有4.6萬年歷史。   

科學家認出那是一隻角百靈,在西伯利亞東北部偏遠的貝拉亞戈拉村內被發現,由於長期被埋及冰封,至今仍然保存良好,沒有腐化。瑞典自然歷史博物館的專家參與研究和化驗,並利用放射性碳技術推算牠已有4.6萬年歷史。   

其中一位專家達倫對記者說,研究顯示,這隻遠古雀鳥是目前常見的兩種百靈鳥的祖先。科學家相信,對上一次冰河時期接近尾聲時,地球的氣候出現變化,令新物種出現。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

※專營大陸快遞台灣服務

台灣快遞大陸的貨運公司有哪些呢?

分類
發燒車訊

加拿大原民癱瘓鐵路抗爭 警強勢驅離

摘錄自2020年2月25日公視報導

不滿天然氣管線的興建工程,加拿大有群眾長達幾個星期阻斷鐵路來表達抗議。不過就在當地時間24號,警方展開強勢驅離,將各重要路線搭建的帳篷拆除,抗爭人士也被警方逮捕。而幾個星期來鐵路停擺,產業供應鍊中斷,經濟遭到重創,大約有1500人因此失業。

這波抗爭的起因,是所謂的「海岸線天然氣管線計畫」,路線跨越卑詩省北部,終點則為基蒂瑪特,並在當地建立天然氣液化廠區,以及可供船舶停靠的港口。這條路線跨越了卑詩省境內的原住民區域,因此在規劃階段,就持續和各有關部落溝通,並獲得沿線20個部落的民選議會或公民投票通過,工程也在2019年展開。

但世襲的部落首領站出來反對,並發動部份族人、串聯加拿大綠黨等環保與政治團體,進行反對管線工程的抗爭。這個月初,警方因為奉法院命令逮捕數十名示威者,引發更大的抗議,導致全國鐵路運輸幾乎停擺。加拿大政府強調,會在經濟發展與環境和原住民權益上,取得平衡點。不過英國廣播公司BBC的報導說,原住民部落內部也是意見分歧。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

※專營大陸快遞台灣服務

台灣快遞大陸的貨運公司有哪些呢?

分類
發燒車訊

航運業減碳新招 看上阿摩尼亞

摘錄自2020年02月20日台灣醒報報導

航運業減碳又有新招。英國研究指出,肥料中常見的氨是取代貨輪柴油的最佳選擇,而且燃燒過程中並不會產生二氧化碳。對此,航運產業也希望能以氨取代柴油,幫助對抗氣候變遷。而最快在10年內,貨輪將可利用氨驅動。

據《BBC》報導,英國皇家學會研究人員大衛表示,「氨是唯一能驅動貨輪航行各地零排碳的燃料。」研究也指出,製造氨雖會產生碳,但可透過新技術製造零碳的氨。首先是在製造時將二氧化碳捕捉並埋在地下,另一方法是利用再生能源製造氨。

負責認證全球船隻的韓國船級社稍早也指出,由於氨作為燃料無須大量專門技術,因此是一種可行的潔淨能源。該組織在報告中指出,「氨的優勢在於相對容易存儲,因為與氫相比,前者具有合理能量、密度與液化溫度,與其他碳中性燃料相比,其生產與運輸成本也較低,並且已具備可穩定生產與運輸的技術。」

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

※專營大陸快遞台灣服務

台灣快遞大陸的貨運公司有哪些呢?

分類
發燒車訊

談一談依賴倒置原則

為獲得良好的閱讀體驗,請訪問原文:

一、概念

依賴倒置原則(Dependence Inversion Principle,DIP)是指設計代碼結構時,高層模塊不應該依賴低層模塊,二者都應該依賴其抽象。

抽象不應該依賴細節,細節應該依賴抽象。通過依賴倒置,可以減少類與類之間的耦合性,提高系統的穩定性,提高代碼的可讀性和可維護性,並且能夠降低修改程序所造成的風險。

二、為什麼

先來看一個例子

可是依賴倒置原則是怎麼做到的呢?我們先來看一個例子:一個愛學習的「我沒有三顆心臟」同學現在正在學習「設計模式」和「Java」的課程,偽代碼如下:

public class Wmyskxz {

    public void studyJavaCourse() {
        System.out.println("「我沒有三顆心臟」同學正在學習「Java」課程");
    }

    public void studyDesignPatternCourse() {
        System.out.println("「我沒有三顆心臟」同學正在學習「設計模式」課程");
    }
}

我們來模擬上層調用一下:

public static void main(String[] args) {
    Wmyskxz wmyskxz = new Wmyskxz();
    wmyskxz.studyJavaCourse();
    wmyskxz.studyDesignPatternCourse();
}

原因一:有效控制影響範圍

由於「我沒有三顆心臟」同學熱愛學習,隨着學習興趣的 “暴增”,可能會繼續學習 AI(人工智能)的課程。這個時候,因為「業務的擴展」,要從底層實現到高層調用依次地修改代碼。

我們需要在 Wmyskxz 類中新增 studyAICourse() 方法,也需要在高層調用中增加調用,這樣一來,系統發布后,其實是非常不穩定的。顯然在這個簡單的例子中,我們還可以自信地認為,我們能 Hold 住這一次的修改帶來的影響,因為都是新增的代碼,我們回歸的時候也可以很好地 cover 住,但實際的情況和實際的軟件環境要複雜得多。

最理想的情況就是,我們已經編寫好的代碼可以 “萬年不變”,這就意味着已經覆蓋的單元測試可以不用修改,已經存在的行為可以保證保持不變,這就意味着「穩定」。任何代碼上的修改帶來的影響都是有未知風險的,不論看上去多麼簡單。

原因二:增強代碼可讀性和可維護性

另外一點,你有沒有發現其實加上新增的 AI 課程的學習,他們三節課本質上行為都是一樣的,如果我們任由這樣行為近乎一樣的代碼在我們的類裏面肆意擴展的話,很快我們的類就會變得臃腫不堪,等到我們意識到不得不重構這個類以緩解這樣的情況的時候,或許成本已經變得高得可怕了。

原因三:降低耦合

《資本論》中有這樣一段描述:

在商品經濟的萌芽時期,出現了物物交換。假設你要買一個 iPhone,賣 iPhone 的老闆讓你拿一頭豬跟他換,可是你並沒有養豬,你只會編程。所以你找到一位養豬戶,說給他做一個養豬的 APP 來換他一頭豬,他說換豬可以,但是得用一條金項鏈來換…

所以這裏就出現了一連串的對象依賴,從而造成了嚴重的耦合災難。解決這個問題的最好的辦法就是,買賣雙發都依賴於抽象——也就是貨幣——來進行交換,這樣一來耦合度就大為降低了。

三、怎麼做

我們現在的代碼是上層直接依賴低層實現,現在我們需要定義一個抽象的 ICourse 接口,來對這種強依賴進行解耦(就像上面《資本論》中的例子那樣):

接下來我們可以參考一下偽代碼,先定一個課程的抽象 ICourse 接口:

public interface ICourse {
    void study();
}

然後編寫分別為 JavaCourseDesignPatternCourse 編寫一個類:

public class JavaCourse implements ICourse {

    @Override
    public void study() {
        System.out.println("「我沒有三顆心臟」同學正在學習「Java」課程");
    }
}

public class DesignPatternCourse implements ICourse {

    @Override
    public void study() {
        System.out.println("「我沒有三顆心臟」同學正在學習「設計模式」課程");
    }
}

然後把 Wmyskxz 類改造成如下的樣子:

public class Wmyskxz {

    public void study(ICourse course) {
        course.study();
    }
}

再來是我們的調用:

public static void main(String[] args) {
    Wmyskxz wmyskxz = new Wmyskxz();
    wmyskxz.study(new JavaCourse());
    wmyskxz.study(new DesignPatternCourse());
}

這時候我們再來看代碼,無論「我沒有三顆心臟」的興趣怎麼暴漲,對於新的課程,都只需要新建一個類,通過參數傳遞的方式告訴它,而不需要修改底層的代碼。實際上這有點像大家熟悉的依賴注入的方式了。

總之,切記:以抽象為基準比以細節為基準搭建起來的架構要穩定得多,因此在拿到需求后,要面相接口編程,先頂層設計再細節地設計代碼結構。

參考資料

  1. – 那些年搞不懂的高深術語——依賴倒置•控制反轉•依賴注入•面向接口編程
  2. 《Spring 5 核心原理 與 30 個類手寫實戰》 – 譚勇德 著

按照慣例黏一個尾巴:

歡迎轉載,轉載請註明出處!
獨立域名博客:wmyskxz.com
簡書ID:
github:
歡迎關注公眾微信號:wmyskxz
分享自己的學習 & 學習資料 & 生活
想要交流的朋友也可以加qq群:3382693

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

※專營大陸快遞台灣服務

台灣快遞大陸的貨運公司有哪些呢?

分類
發燒車訊

Spring Cloud gateway 七 Sentinel 註解方式使用

Sentinel 註解支持

@SentinelResource 用於定義資源,並提供可選的異常處理和 fallback 配置項。 @SentinelResource 註解包含以下屬性:

  • value:資源名稱,必需項(不能為空)
  • entryType:entry 類型,可選項(默認為 EntryType.OUT)
  • blockHandler / blockHandlerClass: blockHandler 對應處理 BlockException 的函數名稱,可選項。blockHandler 函數訪問範圍需要是 public,返回類型需要與原方法相匹配,參數類型需要和原方法相匹配並且最後加一個額外的參數,類型為 BlockException。blockHandler 函數默認需要和原方法在同一個類中。若希望使用其他類的函數,則可以指定 blockHandlerClass 為對應的類的 Class 對象,注意對應的函數必需為 static 函數,否則無法解析。
  • fallback:fallback 函數名稱,可選項,用於在拋出異常的時候提供 fallback 處理邏輯。fallback 函數可以針對所有類型的異常(除了 – exceptionsToIgnore 裏面排除掉的異常類型)進行處理。fallback 函數簽名和位置要求:
    • 返回值類型必須與原函數返回值類型一致;
    • 方法參數列表需要和原函數一致,或者可以額外多一個 Throwable 類型的參數用於接收對應的異常。
    • fallback 函數默認需要和原方法在同一個類中。若希望使用其他類的函數,則可以指定 fallbackClass 為對應的類的 Class 對象,注意對應的函數必需為 static 函數,否則無法解析。
  • defaultFallback(since 1.6.0):默認的 fallback 函數名稱,可選項,通常用於通用的 fallback 邏輯(即可以用於很多服務或方法)。默認 fallback 函數可以針對所有類型的異常(除了 exceptionsToIgnore 裏面排除掉的異常類型)進行處理。若同時配置了 fallback 和 defaultFallback,則只有 fallback 會生效。defaultFallback 函數簽名要求:
    • 返回值類型必須與原函數返回值類型一致;
    • 方法參數列表需要為空,或者可以額外多一個 Throwable 類型的參數用於接收對應的異常。
    • defaultFallback 函數默認需要和原方法在同一個類中。若希望使用其他類的函數,則可以指定 fallbackClass 為對應的類的 Class 對象,注意對應的函數必需為 static 函數,否則無法解析。
  • exceptionsToIgnore(since 1.6.0):用於指定哪些異常被排除掉,不會計入異常統計中,也不會進入 fallback 邏輯中,而是會原樣拋出。

注:1.6.0 之前的版本 fallback 函數只針對降級異常(DegradeException)進行處理,不能針對業務異常進行處理。

特別地,若 blockHandler 和 fallback 都進行了配置,則被限流降級而拋出 BlockException 時只會進入 blockHandler 處理邏輯。若未配置 blockHandler、fallback 和 defaultFallback,則被限流降級時會將 BlockException 直接拋出。

使用注意點采坑日記

@SentinelResource 註解不單單用於controller的接口流控。同時也可以用於方法上面。如果看過實現方式代碼。可以知道他底層是基於cglib動態代理實現的。進行切面處理。注意點:

  • 不能修飾在接口上面。只能修飾在實現類的方法上
  • 不能修飾在靜態的方法上面。
  • 同一個bean方法A調用方法B,假設方法A和B都進行了註解。B方法註解失效,請參考@Transactional 失效。
    • @Transactional 加於private方法, 無效
    • @Transactional 加於未加入接口的public方法, 再通過普通接口方法調用, 無效
    • @Transactional 加於接口方法, 無論下面調用的是private或public方法, 都有效
    • @Transactional 加於接口方法后, 被本類普通接口方法直接調用, 無效
    • @Transactional 加於接口方法后, 被本類普通接口方法通過接口調用, 有效
    • @Transactional 加於接口方法后, 被它類的接口方法調用, 有效
    • @Transactional 加於接口方法后, 被它類的私有方法調用后, 有效

blockHandler 和 blockHandlerClass 的使用

blockHandler 是可選的。如果使用blockHandlerClass,必須搭配blockHandler使用, blockHandler指定blockHandlerClass類中對應的方法名稱。方法名稱、參數、返回值、static 必須按照上述文檔描述一樣。官方文檔沒有強調要必須要搭配使用。

同理 fallback 和 fallbackClass也是上面講述的注意點。

改造client 服務

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>

bootstrap.yml 配置文件

spring:
    cloud:
        sentinel:
                filter:
                    # sentienl 默認生效,本地調試false
                    enabled: true
                transport:
                    dashboard: localhost:8890
                    port: 8719
                # 飢餓加載
                eager: true
                datasource:
                    # Sentinel基於nacos存儲獲取配置信息
                    na:
                        nacos:
                            server-addr: 47.99.209.72:8848
                            groupId: DEFAULT_GROUP
                            dataId: ${spring.application.name}-${spring.profiles.active}-sentinel
                            # 類型
    #            FLOW("flow", FlowRule.class),
    #            DEGRADE("degrade", DegradeRule.class),
    #            PARAM_FLOW("param-flow", ParamFlowRule.class),
    #            SYSTEM("system", SystemRule.class),
    #            AUTHORITY("authority", AuthorityRule.class),
    #            GW_FLOW("gw-flow", "com.alibaba.csp.sentinel.adapter.gateway.common.rule.GatewayFlowRule"),
    #            GW_API_GROUP("gw-api-group", "com.alibaba.csp.sentinel.adapter.gateway.common.api.ApiDefinition");
                            rule-type: flow

nacos 創建 cloud-discovery-client-dev-sentinel 配置文件

[
    {
        "resource": "client:log:save",
        "limitApp": "default",
        "grade": 1,
        "count": 1,
        "strategy": 0,
        "controlBehavior": 0,
        "clusterMode": false
    },
    {
        "resource": "client:fegin:test",
        "limitApp": "default",
        "grade": 1,
        "count": 1,
        "strategy": 0,
        "controlBehavior": 0,
        "clusterMode": false
    },
     {
        "resource": "user:service:saveTx",
        "limitApp": "default",
        "grade": 1,
        "count": 1,
        "strategy": 0,
        "controlBehavior": 0,
        "clusterMode": false
    },
    {
        "resource": "user:service:save:test",
        "limitApp": "default",
        "grade": 1,
        "count": 1,
        "strategy": 0,
        "controlBehavior": 0,
        "clusterMode": false
    }
]

創建 BackHandlerClass DiscoveryClientControllerBackHandler

package com.xian.cloud.common.handler;

import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.xian.cloud.entity.UserEntity;
import lombok.extern.slf4j.Slf4j;

/**
 *  對應處理 BlockException 的函數名稱 服務限流
 * @Author: xlr
 * @Date: Created in 9:08 PM 2019/11/16
 */
@Slf4j
public class DiscoveryClientControllerBackHandler {

    public static String defaultMessage(BlockException e){
        
        log.warn( "DiscoveryClientControllerBackHandler  defaultMessage BlockException : {}",e );
        return "defaultMessage 服務限流,請稍後嘗試";
    }

    public static String saveTx(UserEntity entity,BlockException e) {

        log.warn( "DiscoveryClientControllerBackHandler  saveTx BlockException : {}",e );
        return "saveTx 服務限流,請稍後嘗試";
    }
}

創建 FallBackHandlerClass

package com.xian.cloud.common.handler;

import com.xian.cloud.entity.UserEntity;
import lombok.extern.slf4j.Slf4j;

/**
 * 僅針對降級功能生效(DegradeException)
 * @Author: xlr
 * @Date: Created in 9:13 PM 2019/11/16
 */
@Slf4j
public class DiscoveryClientControllerFallBackHandler {

    public static String defaultMessage(Throwable t){
        
        log.warn( "DiscoveryClientControllerFallBackHandler defaultMessage Throwable : {}",t );
        return "defaultMessage 服務降級,請稍後嘗試";
    }

    public static String saveTx(UserEntity entity,Throwable t) {

        log.warn( "DiscoveryClientControllerFallBackHandler saveTx Throwable : {}",t );
        return "saveTx 服務降級,請稍後嘗試";
    }
}

對外接口DiscoveryClientController 添加接口


@SentinelResource(
            value = "client:fegin:test",
            blockHandler = "defaultMessage",
            fallback = "defaultMessage",
            blockHandlerClass = DiscoveryClientControllerBackHandler.class,
            fallbackClass = DiscoveryClientControllerFallBackHandler.class
    )
    @RequestMapping(value = "fegin/test",method = RequestMethod.GET)
    public String feginTest() {
        String result = serverService.hello( "fegin" );
        return  " 返回 : " + result;
    }
        
        
 @GetMapping("/log/save")
    @SentinelResource(
            value = "client/log/save",
            blockHandler = "defaultMessage",
            fallback = "defaultMessage",
            blockHandlerClass = DiscoveryClientControllerBackHandler.class,
            fallbackClass = DiscoveryClientControllerFallBackHandler.class
    )
    public String save(){
        UserEntity entity = new UserEntity();
        entity.setUsername("tom");
        entity.setPassWord("1232131");
        entity.setEmail("222@qq.com");
        userService.saveTx(entity);
        return "success";
    }
        
    @GetMapping("user/service/save")
    public String userServiceSaveTx(){
        UserEntity entity = new UserEntity();
        String result = userService.saveTx( entity );
        return result;
    }

UserServiceImpl 方法

  @Override
    @Transactional
    @SentinelResource(
            value = "user:service:saveTx",
            blockHandler = "saveTx",
            fallback = "saveTx",
            blockHandlerClass = DiscoveryClientControllerBackHandler.class,
            fallbackClass = DiscoveryClientControllerFallBackHandler.class
    )
    public String saveTx(UserEntity entity) {

        return "success";
    }

以上就配置完畢。然後進行測試在頁面瘋狂刷新

http://localhost:9011/client/user/service/save

http://localhost:9011/client/fegin/test

停止 server服務 再次調用 fegin、test

服務降級和服務限流來回切換提示在前端頁面。blockHandlerClass、fallbackClass。

如何喜歡可以關注分享本公眾號。

版權聲明:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。轉載請附帶公眾號二維碼

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

※專營大陸快遞台灣服務

台灣快遞大陸的貨運公司有哪些呢?

分類
發燒車訊

戶外空污使全球人類平均減壽三年 比吸菸、愛滋和傳染病還慘

環境資訊中心綜合外電;姜唯 編譯;林大利 審校

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

※專營大陸快遞台灣服務

台灣快遞大陸的貨運公司有哪些呢?

分類
發燒車訊

標緻新能源車最晚將於2019年推出

據外媒報導,標緻產品總監Jerome Micheron日前透露,由於歐洲的排放法規日益嚴格,公司計畫在這個十年結束前(2020年前)開展綠色行動,其中標緻將在2019年推出一款插電式混動車型,新車將搭載由小型汽油發動機和電動機組成的混動系統,純電動續航里程為50km。

此外,外媒稱,標緻的新能源計畫中還有一款純電動車型,這款車型將基於EMP2平臺打造,而該平臺正是現款標緻308(國內稱308S)所採用的平臺,這款車型也將在2019年正式亮相。

標緻目前在新能源車方面還比較空白,相比其它品牌來說,似乎起步較晚,但標緻產品總監卻不這麼認為,中國有句古話叫好飯不怕晚,也許就是標緻產品總監想表達的意思吧。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

※專營大陸快遞台灣服務

台灣快遞大陸的貨運公司有哪些呢?

分類
發燒車訊

Windows下編譯最新版ChezScheme

    據說ChezScheme是最快的神級編譯器,一秒鐘幾百萬行,王垠說的2秒內編譯自身絕不是誇張(看這裏《》,Scheme中文社區)。ChezScheme由美國印第安納大學的Kent Dybvig博士發明,後來賣給了思科CISCO,作為內部絕密的編譯器工具來運行苛刻的計算任務,現在已經開源,倉庫地址是。有關如何開始使用Chez Scheme,請看官方的文檔:,有關Scheme的使用入門,這裏推薦一本中文翻譯的《》,這是一本面向初學者的溫和且循序漸進的Scheme教程。目標讀者是僅有些許編程經驗的PC用戶。

    下面來介紹下截止到2019.11.19日的最新版如何在Windows下編譯一個ChezScheme,其它環境下如何編譯請看源碼下的文件BUILDING的介紹:Building Chez Scheme Version 9.5.3。請注意這個版本號,之前的版本編譯方法可能與本文介紹的不同,本人也為此踩坑了不少時間。

1,首先,安裝Visual Studio 2015/2017,注意必須選擇按照Visual C++ 桌面開發組件,否則你在最後一步無法編譯Scheme。

2,安裝msys2,這是一個Windows下的Linux Shell環境,可以讓你在Windows上使用Linux命令,並且它還自帶包管理功能。安裝完後按照官網提示更新下msys2,會給你安裝一堆組件,默認都安裝。

3,打開Visual Studio命令提示符,選擇“vs2015 x64 native tools command prompt”,vs2017類似,中文名稱是“適用於VS2017的本機命令工具提示”。

4,在上面的Visual Studio命令提示工具裏面,輸入c:\msys64\msys2_shell.cmd,打開msys2的命令提示窗口。

5,在msys2裏面安裝GCC編譯工具和Git工具,如果Git已經安裝跳過。

pacman -S gcc base- devel
pacman -S git

 

6,下載Chez Scheme源碼,然後進行編譯前配置,最後編譯。如果源碼已經下載跳過。

git clone https: // github.com/cisco/ChezScheme.git 
cd ChezScheme
cd wininstall
make workareas
 make

 

7,最後等make完成,我們在ChezScheme目錄a6nt\bin\a6nt 下可以看到scheme.exe,雙擊它即可運行。

8,將a6nt目類下的bin目錄和boot目錄都複製到一個新建的build目錄下,然後創建一個run.bat 文件,文件內容如下:

@ECHO  off 
ECHO Chez Scheme for Windows. make by bluedoctor. 2019.11.18 
bin \a6nt\scheme.exe

build目錄的文件結構如下:

E:\ChezScheme\build\ChezScheme>dir /s
 驅動器E 中的捲是LENOVO
 卷的序列號是E2D7-2E41

 E:\ChezScheme\build\ChezScheme 的目錄

2019/11/18 23:23 <DIR> .
2019/11/18 23:23 <DIR> ..
2019/11/18 23:23 <DIR> bin
2019/11/18 23:19 <DIR> boot
2019/11/19 10:38 94 run.bat
               1 個文件94 字節

 E:\ChezScheme\build\ChezScheme\bin 的目錄

2019/11/18 23:23 <DIR> .
2019/11/18 23:23 <DIR> ..
2019/11/18 23:19 <DIR> a6nt
               0 個文件0 字節

 E:\ChezScheme\build\ChezScheme\bin\a6nt 的目錄

2019/11/18 23:19 <DIR> .
2019/11/18 23:19 <DIR> ..
2019/11/18 20:25 764,928 csv953.dll
2019/11/18 20:25 7,102 csv953.exp
2019/11/18 20:25 1,581,688 csv953.ilk
2019/11/18 20:25 12,368 csv953.lib
2019/11/18 20:25 2,084,864 csv953.pdb
2019/11/18 20:25 112,640 scheme.exe
2019/11/18 20:25 430,080 scheme.pdb
               7 個文件4,993,670 字節

 E:\ChezScheme\build\ChezScheme\boot 的目錄

2019/11/18 23:19 <DIR> .
2019/11/18 23:19 <DIR> ..
2019/11/18 23:19 <DIR> a6nt
               0 個文件0 字節

 E:\ChezScheme\build\ChezScheme\boot\a6nt 的目錄

2019/11/18 23:19 <DIR> .
2019/11/18 23:19 <DIR> ..
2019/11/18 20:25 2,751,464 csv953md.lib
2019/11/18 20:25 2,564,910 csv953mt.lib
2019/11/18 17:14 36,556 equates.h
2019/11/18 20:24 27,609 mainmd.obj
2019/11/18 20:25 25,538 mainmt.obj
2019/11/18 17:14 1,624,450 petite.boot
2019/11/18 17:14 982,321 scheme.boot
2019/11/18 17:14 8,675 scheme.h
2019/11/18 20:24 92,444 scheme.res
               9 個文件8,113,967 字節

     所列文件總數:
              17 個文件13,107,731 字節
              14 個目錄514,061,447,168 可用字節

9,最後運行run.bat文件,就可以看到期待已久的Chez Scheme了:

Chez Scheme for Windows. make by bluedoctor. 2019.11.18
Chez Scheme Version 9.5.3
Copyright 1984-2019 Cisco Systems, Inc.

> (+ 1 2 3 4 5 6 7 8 9 10)
55
> (/ 1 3)
1/3
>

 

10,上面是在Chez Scheme運行的簡單Scheme程序,第一行代碼運行的是一個累加多個自然數的程序,如果用C#,需要一個List<int>變量來存儲列表數據,然後循環處理,代碼量要多好幾行。第二行Scheme代碼,它的結果直接以分數表示了,很高級。

有關Scheme更多的程序介紹,請看本文推薦的學習鏈接。如果你不想這麼麻煩的自己來編譯,也可以考慮直接使用給予.NET DLR的IronScheme,具體請看我原來的文章:《》。

如果你不想編譯或者安裝任何一個Scheme程序,但又想看看Scheme是什麼樣子,推薦訪問下面的網址,它提供了一個Web版本的Scheme編譯運行環境:

 

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

※專營大陸快遞台灣服務

台灣快遞大陸的貨運公司有哪些呢?