沒網的日子真的不好過啊 1.背景: 對於常見業務中,數據併發是一個很頭疼的問題,很多時候,會出現資源共用導致線程阻塞的問題,這時候問題就來了,,,老闆也尾隨來了,來找你麻煩了,錢哪去了?,具體點兒, 比如生成訂單時候,多用戶同時下單並支付,這都是白花花的銀子啊,算錯了,真的出現上面的情況了,還一個就
沒網的日子真的不好過啊
- 1.背景:
- 2.系統環境:
windows 10 企業版本 64位
- 3.獲取 與 安裝 :
a) http://activemq.apache.org/ 自行選擇中意版本(或 文章底部,我上傳了,是目前的最新版本), 註意看功能變數名稱,apache,所以肯定離不開 jdk了, jdk獲取:
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html ,同時配置 JAVA_HOME環境 b) 安裝 ActiveMQ: 首先,解壓下載的zip文件包,文件目錄如下: bin 不用說了,和tomcat一樣的,都是bat的啟動或者停止的批處理和幾個相關的jar包, conf 顧名思義就是存放配置文件的 data 數據,什麼數據?執行過程中生成的log等文件都在裡面 docs 就是現在要用到的,安裝以及使用:- 4 安裝使用:
- 5. 參考 p2p 案例代碼:
namespace TestActiveMQ { class Program { private static IConnectionFactory factory //需要引用 Apache.NMS; = new ConnectionFactory("tcp://localhost:61616");//需要引用Apache.NMS.ActiveMQ; static void Main(string[] args) { //建立連接 using (IConnection connection = factory.CreateConnection()) { //通過連接創建session會話 using (ISession session = connection.CreateSession()) { //通過會話創建生產者,方法裡面new出來的是MQ中的Queue IMessageProducer producer = session.CreateProducer(new Apache.NMS.ActiveMQ.Commands.ActiveMQQueue("firstQueue")); //創建一個發送的消息對象 ITextMessage message = producer.CreateTextMessage(); //給這個對象賦實際的消息 message.Text = "12321321321"; //設置消息對象的屬性,這個很重要哦,是Queue的過濾條件,也是P2P消息的唯一指定屬性 message.Properties.SetString("filter", "demo"); //生產者把消息發送出去,幾個枚舉參數MsgDeliveryMode是否長鏈,MsgPriority消息優先順序別,發送最小單位,當然還有其他重載 producer.Send(message, MsgDeliveryMode.NonPersistent, MsgPriority.Normal, TimeSpan.MinValue); Console.WriteLine("發送成功!"); Console.ReadLine(); } } } } }
客戶端:
public partial class Form1 : Form { public Form1() { InitializeComponent(); InitConsumer(); } public void InitConsumer() { //創建連接工廠 IConnectionFactory factory = new ConnectionFactory("tcp://localhost:61616"); //通過工廠構建連接 IConnection connection = factory.CreateConnection(); //這個是連接的客戶端名稱標識 connection.ClientId = "firstQueueListener"; //啟動連接,監聽的話要主動啟動連接 connection.Start(); //通過連接創建一個會話 ISession session = connection.CreateSession(); //通過會話創建一個消費者,這裡就是Queue這種會話類型的監聽參數設置 IMessageConsumer consumer = session.CreateConsumer(new Apache.NMS.ActiveMQ.Commands.ActiveMQQueue("firstQueue"), "filter='demo'"); //註冊監聽事件 consumer.Listener += new MessageListener(consumer_Listener); //connection.Stop(); //connection.Close(); } void consumer_Listener(IMessage message) { ITextMessage msg = (ITextMessage)message; //非同步調用下,否則無法回歸主線程 tbReceiveMessage.Invoke(new DelegateRevMessage(RevMessage), msg); } public delegate void DelegateRevMessage(ITextMessage message); public void RevMessage(ITextMessage message) { tbReceiveMessage.Text += string.Format(@"接收到:{0}{1}", message.Text, Environment.NewLine); } }
執行結果: