ActiveMQ學習總結------實戰操作(上)02

来源:https://www.cnblogs.com/arebirth/archive/2019/10/11/activemq02.html
-Advertisement-
Play Games

ActiveMQ學習總結------實戰操作  1.ActiveMQ術語及API介紹   2.ActiveMQ 文本消息處理   3.ActiveMQ 對象消息處理 ...


相信大家通過上一篇博文已經對ActiveMQ有了一個大致的概念了,

那麼本篇博文將帶領大家一步一步去實戰操作我們的ActiveMQ

本篇主要內容:

  1.ActiveMQ術語及API介紹

  2.ActiveMQ 文本消息處理

  3.ActiveMQ 對象消息處理


既然我們要學習如何實戰操作了,那麼久不可不知它的一些術語和API的用於

即使覺得枯燥,我們也要大致看一眼,過後相信你還會再來看的!因為很有用

 

 

一 ActiveMQ 的術語(這麼碉堡的東西怎麼會沒有寫讓人覺得更碉堡的辭彙呢?)

1 Destination

目的地,JMS Provider(消息中間件)負責維護,用於對 Message 進行管理的對象。
MessageProducer 需要指定 Destination 才能發送消息,MessageReceiver 需要指定 Destination
才能接收消息。

 

2 Producer

消息生成者,負責發送 Message 到目的地。

 

3 Consumer | Receiver

消息消費者,負責從目的地中消費【處理|監聽|訂閱】Message。

 

4 Message

消息,消息封裝一次通信的內容。

 


 

 

二 ActiveMQ API簡介

下述API都是介面類型,由定義在javax.jms包中

都是JMS(Java Message Service)標準介面定義

 

1.ConnectionFactory

  鏈接工廠,用於創建鏈接的工廠類型

2.Connection

  鏈接,用於建立訪問ActiveMQ連接的類型,由鏈接工廠ConnectionFactory創建

3.Session

  會話,一次持久有效有狀態的訪問,由鏈接創建

4.Destination & Queue

  目的地。用於描述本次訪問ActiveMQ的消息訪問目的地,即ActiveMQ服務中的具體隊列,由會話創建

  interface Queue extends Destination

5.MessageProducer

  消息生成者、在一次有效會話中,用於發送消息給ActiveMQ服務的工具,由會話創建

6.MessageConsumer

  消息消費者【消息訂閱者|消息處理著】,在一次有效會話中,用於從ActiveMQ服務中獲取消息的工具,由會話創建

7.Message

  消息。通過消息生成者向ActiveMQ服務發送消息時使用的數據載體對象或消費者從ActiveMQ服務中獲取消息時使用的數據載體對象。是所有消息【文本消息|對象消息等】具體類型的頂級介面,可以通過會話創建或通過會話從ActiveMQ服務中獲取

 

 

 


 

三 ActiveMQ處理文本消息

:*本案例將以producer(消息生產者)和consumer(消息發送者)連個模塊為例

 

準備工作:

  確保你的ActiveMQ已經開啟,並且所依賴的埠已經關閉(建議直接關閉防火牆 service iptables stop)

  Maven環境

 

1 消息生產者

1.1創建模塊

 

 

1,2在POM文件添加ActiveMQ的依賴(根據個人的ActiveMQ版本自行查找)

 <dependencies>
        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-all</artifactId>
            <version>5.9.0</version>
        </dependency>
    </dependencies>

 

1.3 編寫消息的生產者

package cn.arebirth.mq;

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

public class ActiveMQTextProducer {
    
    public void sendTextActiveMQ(String msg) {
        //定義鏈接工廠
        ConnectionFactory connectionFactory = null;

        //定義鏈接對象
        Connection connection = null;

        //定義會話
        Session session = null;

        //目的地
        Destination destination = null;

        //定義消息的發送者
        MessageProducer producer = null;

        //定義消息
        Message message = null;


        try {
            /**
             * userName:訪問ActiveMQ服務的用戶名,預設為admin。
             * password:訪問ActiveMQ服務的密碼,預設為admin
             * 用戶名和用戶密碼都可以通過ActiveMQ安裝目錄的oonf目錄下的jetty-ream.properties文件進行修改
             *
             * borkerURL:訪問ActiveMQ服務的路徑地址。
             *  路徑結構為:協議名://主機地址:埠號
             *  在conf/activemq.xml文件中可以找到修改
             *  在上一篇文章中都有介紹
             */
            connectionFactory = new ActiveMQConnectionFactory("admin", "admin", "tcp://169.254.18.20:61616");

            //創建鏈接對象
            connection = connectionFactory.createConnection();

            //啟動連接
            connection.start();

            /**
             * 參數一:transacted 是否使用事務 可選值為:true|false
             *      ture:使用事務 設置第二個參數變數這為 Session.SESSION_TRANSACTION 交由session管理
             *      false:不使用事務,則設置我們的參數即可
             *
             * acknowledgeMode:
             * * Session.AUTO_ACKNOWLEDGE:自動消息確認機制
             * * Session.CLIENT_ACKNOWLEDGE:客戶端確認機制
             * * Session.DUPS_OK_ACKNOWLEDGE:有副本的客戶端確認消息機制
             這裡設置 這兩個參數的含義為:
             不使用事務,並由Session自動確認提交
             * 這裡對此不作過多講解,初學者跟著敲,其後在慢慢瞭解原理
             *
             */
            session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

            //創建目的地,目的地名稱即隊列的名稱,也就是保存我們消息地方的名稱。消息的消費者需要通過此名稱訪問對應的隊列
            //名稱不固定
            destination = session.createQueue("hello-mq");

            //創建消息的生產者 需要指定目的地(也就是把Destination傳入參數)
            producer = session.createProducer(destination);

            //創建消息對象 並傳入我們需要放入隊列的消息
            message = session.createTextMessage(msg);

            //發送消息
            producer.send(message);

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //回收消息發送者資源
            if (producer != null) {
                try {
                    producer.close();
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }
            if (session != null) {
                try {
                    session.close();
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }
            if (connection != null) {
                try {
                    connection.close();
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }
        }


    }
}

 

 

2. 消息消費者

2.1創建模塊

 

 

 

2,2在POM文件添加ActiveMQ的依賴(根據個人的ActiveMQ版本自行查找)

 <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-all</artifactId>
            <version>5.9.0</version>
        </dependency>

 

2.3編寫消息的消費者

package cn.arebirth.mq;

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

public class ActiveMQTextConsumer {

    public void receiveTextActiveMQ() {
        //定義鏈接工廠
        ConnectionFactory connectionFactory = null;

        //定義鏈接對象
        Connection connection = null;

        //定義會話
        Session session = null;

        //目的地
        Destination destination = null;

        //定義消息的消費者(接收者)
        MessageConsumer consumer = null;

        //定義消息
        Message message = null;


        try {
            /**
             * userName:訪問ActiveMQ服務的用戶名,預設為admin。
             * password:訪問ActiveMQ服務的密碼,預設為admin
             * 用戶名和用戶密碼都可以通過ActiveMQ安裝目錄的oonf目錄下的jetty-ream.properties文件進行修改
             *
             * borkerURL:訪問ActiveMQ服務的路徑地址。
             *  路徑結構為:協議名://主機地址:埠號
             *  在conf/activemq.xml文件中可以找到修改
             *  在上一篇文章中都有介紹
             */
            connectionFactory = new ActiveMQConnectionFactory("admin", "admin", "tcp://169.254.18.20:61616");

            //創建鏈接對象
            connection = connectionFactory.createConnection();

            //啟動連接
            connection.start();

            /**
             * 參數一:transacted 是否使用事務 可選值為:true|false
             *      ture:使用事務 設置第二個參數變數這為 Session.SESSION_TRANSACTION 交由session管理
             *      false:不使用事務,則設置我們的參數即可
             *
             * acknowledgeMode:
             * * Session.AUTO_ACKNOWLEDGE:自動消息確認機制
             * * Session.CLIENT_ACKNOWLEDGE:客戶端確認機制
             * * Session.DUPS_OK_ACKNOWLEDGE:有副本的客戶端確認消息機制
             這裡設置 這兩個參數的含義為:
             不使用事務,並由Session自動確認提交
             * 這裡對此不作過多講解,初學者跟著敲,其後在慢慢瞭解原理
             *
             */
            session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

            //創建目的地,目的地名稱即隊列的名稱,也就是保存我們消息地方的名稱。消息的消費者需要通過此名稱訪問對應的隊列
            //名稱不固定
            destination = session.createQueue("hello-mq");

            //創建消息的消費者 需要指定目的地(也就是把Destination傳入參數)
            consumer = session.createConsumer(destination);

            //創建消息對象 由消費者接收消息
            message = consumer.receive();

            //處理消息
            String msg = ((TextMessage) message).getText();
            System.out.println("ActiveMQ say:" + msg);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //回收消息接收者資源
            if (consumer != null) {
                try {
                    consumer.close();
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }
            if (session != null) {
                try {
                    session.close();
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }
            if (connection != null) {
                try {
                    connection.close();
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }
        }

    }
}

 

 

3 測試成果

定義測試類,來測試我們的成果!

 

3.1 定義producer測試類

package cn.arebirth.mq;

public class ProducerTest {
    public static void main(String[] args) {
        ActiveMQTextProducer producer = new ActiveMQTextProducer();
        producer.sendTextActiveMQ("Hello,ActiveMQ!");
    }
}

當我們執行完這段代碼後,我們打開我們的ActiveMQ的控制面板(首先你要啟動你的ActiveMQ,上一篇有介紹到!)

 

 

接下來,當我們看到此圖片內容即說明producer成果運行!(hello-mq我們自定義的隊列名稱!)

 

 

 


 

3.2 定義 Consumer測試類

package cn.arebirth.mq;

public class ConsumerTest {
    public static void main(String[] args) {
        ActiveMQTextConsumer consumer = new ActiveMQTextConsumer();
        consumer.receiveTextActiveMQ();
    }
}

 

運行結果出現如下內容即成果!

 

 

 

 

 

當我們仔細觀察ActiveMQ控制台的時候會發現,

  producer每產生一條消息對應的Number Of Pending Message和Message Enqueued就+1

  consumer每次啟動消費消息的時候,Number Of pending Message就會-1  Message Dequeued +1 

為什麼呢?哈哈  相信大家已經大概猜出來了或者看英文的意思  

介紹下:

  • Name:消息的名字
  • Number Of Pending Message:為消費的消息數量
  • Number Of Consumers:消費者的數量
  • Message Enqueued:隊列共有過多少消息
  • Message Dequeued:消費者消費了多少條消息

 

鼓搗完文本消息,那麼有的人會說,只能鼓搗文本??錯了,接下來我們搞實用的對象!(不是你和我,是我們和電腦 -. -)


 

 

三 ActiveMQ處理對象消息

有了上面處理文本消息的基礎,我們將很容易掌握處理對象消息的能力!這裡面的步驟,我們將略省一部分,和上面及其相似

 

1 對象創建(處理對象消息,那麼一定是要有個數據載體的對象啦,我們自己創建一個即可     生產者和消費者均需要此對象!)

package cn.arebirth.pojo;

import java.io.Serializable;

/**
 * 一定要序列化!!
 */
public class User implements Serializable {
    private String username;
    private String pwd;
    private String content;

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", pwd='" + pwd + '\'' +
                ", content='" + content + '\'' +
                '}';
    }

    public User() {
    }

    public User(String username, String pwd, String content) {
        this.username = username;
        this.pwd = pwd;
        this.content = content;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }
}

 

2 消息生產者

2.1 還是需要pom的jar包依賴的的,如果還在原來的環境上,則不需要添加啦!

<dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-all</artifactId>
            <version>5.9.0</version>
        </dependency>

 

2.2 編寫消息的生產者

package cn.arebirth.mq;

import cn.arebirth.pojo.User;
import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

public class ActiveMQObjectProducer {

    public void sendObjectActiveMQ(User user){
        //定義鏈接工廠
        ConnectionFactory connectionFactory = null;

        //定義鏈接對象
        Connection connection = null;

        //定義會話
        Session session = null;

        //目的地
        Destination destination = null;

        //定義消息的發送者
        MessageProducer producer = null;

        //定義消息
        Message message = null;


        try {
            /**
             * userName:訪問ActiveMQ服務的用戶名,預設為admin。
             * password:訪問ActiveMQ服務的密碼,預設為admin
             * 用戶名和用戶密碼都可以通過ActiveMQ安裝目錄的oonf目錄下的jetty-ream.properties文件進行修改
             *
             * borkerURL:訪問ActiveMQ服務的路徑地址。
             *  路徑結構為:協議名://主機地址:埠號
             *  在conf/activemq.xml文件中可以找到修改
             *  在上一篇文章中都有介紹
             */
            connectionFactory = new ActiveMQConnectionFactory("admin", "admin", "tcp://169.254.18.20:61616");

            //創建鏈接對象
            connection = connectionFactory.createConnection();

            //啟動連接
            connection.start();

            /**
             * 參數一:transacted 是否使用事務 可選值為:true|false
             *      ture:使用事務 設置第二個參數變數這為 Session.SESSION_TRANSACTION 交由session管理
             *      false:不使用事務,則設置我們的參數即可
             *
             * acknowledgeMode:
             * * Session.AUTO_ACKNOWLEDGE:自動消息確認機制
             * * Session.CLIENT_ACKNOWLEDGE:客戶端確認機制
             * * Session.DUPS_OK_ACKNOWLEDGE:有副本的客戶端確認消息機制
             這裡設置 這兩個參數的含義為:
             不使用事務,並由Session自動確認提交
             * 這裡對此不作過多講解,初學者跟著敲,其後在慢慢瞭解原理
             *
             */
            session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

            //創建目的地,目的地名稱即隊列的名稱,也就是保存我們消息地方的名稱。消息的消費者需要通過此名稱訪問對應的隊列
            //名稱不固定
            destination = session.createQueue("hello-mq-obj");

            //創建消息的生產者 需要指定目的地(也就是把Destination傳入參數)
            producer = session.createProducer(destination);

            //創建消息對象 並傳入我們需要放入隊列的消息
            message = session.createObjectMessage(user);

            //發送消息
            producer.send(message);

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //回收消息發送者資源
            if (producer != null) {
                try {
                    producer.close();
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }
            if (session != null) {
                try {
                    session.close();
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }
            if (connection != null) {
                try {
                    connection.close();
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

 

 

3 消息消費者

3.1 還是需要pom的jar包依賴的的,如果還在原來的環境上,則不需要添加啦!

<dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-all</artifactId>
            <version>5.9.0</version>
        </dependency>

 

3.2  編寫消息的消費者

package cn.arebirth.mq;

import cn.arebirth.pojo.User;
import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

public class ActiveMQObjectConsumer {
    public void receiveObjectActiveMQ() {
        //定義鏈接工廠
        ConnectionFactory connectionFactory = null;

        //定義鏈接對象
        Connection connection = null;

        //定義會話
        Session session = null;

        //目的地
        Destination destination = null;

        //定義消息的消費者(接收者)
        MessageConsumer consumer = null;

        //定義消息
        Message message = null;


        try {
            /**
             * userName:訪問ActiveMQ服務的用戶名,預設為admin。
             * password:訪問ActiveMQ服務的密碼,預設為admin
             * 用戶名和用戶密碼都可以通過ActiveMQ安裝目錄的oonf目錄下的jetty-ream.properties文件進行修改
             *
             * borkerURL:訪問ActiveMQ服務的路徑地址。
             *  路徑結構為:協議名://主機地址:埠號
             *  在conf/activemq.xml文件中可以找到修改
             *  在上一篇文章中都有介紹
             */
            connectionFactory = new ActiveMQConnectionFactory("admin", "admin", "tcp://169.254.18.20:61616");

            //創建鏈接對象
            connection = connectionFactory.createConnection();

            //啟動連接
            connection.start();

            /**
             * 參數一:transacted 是否使用事務 可選值為:true|false
             *      ture:使用事務 設置第二個參數變數這為 Session.SESSION_TRANSACTION 交由session管理
             *      false:不使用事務,則設置我們的參數即可
             *
             * acknowledgeMode:
             * * Session.AUTO_ACKNOWLEDGE:自動消息確認機制
             * * Session.CLIENT_ACKNOWLEDGE:客戶端確認機制
             * * Session.DUPS_OK_ACKNOWLEDGE:有副本的客戶端確認消息機制
             這裡設置 這兩個參數的含義為:
             不使用事務,並由Session自動確認提交
             * 這裡對此不作過多講解,初學者跟著敲,其後在慢慢瞭解原理
             *
             */
            session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

            //創建目的地,目的地名稱即隊列的名稱,也就是保存我們消息地方的名稱。消息的消費者需要通過此名稱訪問對應的隊列
            //名稱不固定
            destination = session.createQueue("hello-mq-obj");

            //創建消息的消費者 需要指定目的地(也就是把Destination傳入參數)
            consumer = session.createConsumer(destination);

            //創建消息對象 由消費者接收消息
            message = consumer.receive();

            //處理消息
            ObjectMessage objectMessage = (ObjectMessage) message;
            User user = (User) objectMessage.getObject();
            System.out.println("ActiveMQ say:" + user);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //回收消息接收者資源
            if (consumer != null) {
                try {
                    consumer.close();
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }
            if (session != null) {
                try {
                    session.close();
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }
            if (connection != null) {
                try {
                    connection.close();
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }
        }

    }
}

 

 

 

4 創建測試類

4.1 Produce生產者測試代碼

package cn.arebirth.mq;

import cn.arebirth.pojo.User;

public class ProducerTest {
    public static void main(String[] args) {
        ActiveMQObjectProducer producer = new ActiveMQObjectProducer();
        producer.sendObjectActiveMQ(new User("Arebirth","123","Hello,ActiveMQ!"));
    }
}

 

當我們執行完這段代碼後,我們打開我們的ActiveMQ的控制面板(首先你要啟動你的ActiveMQ,上一篇有介紹到!)

 

 會看到 隊列中增加了我們的消息!

 

4.2 Consumer消費者測試代碼

package cn.arebirth.mq;

public class ConsumerTest {
    public static void main(String[] args) {
        ActiveMQObjectConsumer consumer = new ActiveMQObjectConsumer();
        consumer.receiveObjectActiveMQ();
    }
}

當我們執行後,出現下麵的內容即可!成功啦!

 

 在看下,控制面板,

 

 

是不是已經和上一個列子一樣啦!

 

 

ps

  本篇內容就到這裡了,希望各位勤加敲代碼,畢竟代碼不是看出來的~

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 手工操作 —— 穿孔卡片 1946年第一臺電腦誕生--20世紀50年代中期,電腦工作還在採用手工操作方式。此時還沒有操作系統的概念。 程式員將對應於程式和數據的已穿孔的紙帶(或卡片)裝入輸入機,然後啟動輸入機把程式和數據輸入電腦記憶體,接著通過控制台開關啟動程式針對數據運行;計算完畢,印表機輸出 ...
  • 一、基本介紹 logging 模塊是python自帶的一個包,因此在使用的時候,不必安裝,只需要import即可。 logging有 5 個不同層次的日誌級別,可以將給定的 logger 配置為這些級別: DEBUG:詳細信息,用於診斷問題。Value=10。 INFO:確認代碼運行正常。Value ...
  • 1. 多線程 如果有多個線程在同時運行,而這些線程可能會同時運行這段代碼。程式每次運行結果和單線程運行的結果是一樣的,而且其他的變數的值也和預期的是一樣的,就是線程安全的。 我們通過一個案例,演示線程的安全問題: 電影院要賣票,我們模擬電影院的賣票過程。假設要播放的電影是 “功夫熊貓3”,本次電影的 ...
  • 線程 什麼是線程 官方定義: 線程(thread)是操作系統能夠進行運算調度的最小單位。它被包含在進程之中,是進程中的實際運作單位。一條線程指的是進程中一個單一順序的控制流,一個進程中可以併發多個線程,每條線程並行執行不同的任務。 說人話: 假如 進程 是保潔公司, 線程 就是公司的員工。當公司接到 ...
  • 1. 多線程 1.1 多線程介紹 學習多線程之前,我們先要瞭解幾個關於多線程有關的概念。 進程:進程指正在運行的程式。確切的來說,當一個程式進入記憶體運行,即變成一個進程,進程是處於運行過程中的程式,並且具有一定獨立功能。 線程:線程是進程中的一個執行單元,負責當前進程中程式的執行,一個進程中至少有一 ...
  • 區分環境的配置 properties 配置 yml 配置 區分環境的代碼 修飾類 修飾註解 修飾方法 激活 profile 插件激活 profile main 方法激活 profile jar 激活 profile 在 Java 代碼中激活 profile ...
  • [TOC] 組合 什麼是組合 組合指的是一個對象中的屬性,是另一個對象 為什麼要使用組合 減少代碼冗餘 如何使用組合 繼承實現: 組合實現: 總結: 繼承是類與類的關係,一種什麼是什麼的關係,子類與父類是一種從屬關係 組合是對象與對象的關係,一種什麼有什麼的關係,一個對象擁有另一個對象 組合練習 封 ...
  • 刷新token 前面的例子和配置都是從頭開始申請授權碼和令牌,現在來看一下如何根據獲取令牌時,回參中的 refresh_token 來刷新令牌。現在在項目中配置的是記憶體模式的預設用戶名密碼,第一步先改成資料庫查詢的方式,具體過程參考前面的文章即可,來看security配置類: 然後修改授權服務配置類 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...