C#實(shí)現(xiàn)同Active MQ通訊的方法
本文實(shí)例講述了C#實(shí)現(xiàn)同Active MQ通訊的方法。分享給大家供大家參考,具體如下:
內(nèi)容概要:
主要以源碼的形式介紹如何用C#實(shí)現(xiàn)同Active MQ 的通訊。本文假設(shè)你已經(jīng)正確安裝JDK1.6.x,了解Active MQ并有一定的編程基礎(chǔ)。
正文:
JMS 程序的最終目的是生產(chǎn)和消費(fèi)的消息能被其他程序使用,JMS 的 Message 是一個(gè)既簡(jiǎn)單又不乏靈活性的基本格式,允許創(chuàng)建不同平臺(tái)上符合非JMS 程序格式的消息。
Message 由消息頭,屬性和消息體三部份組成。
Active MQ支持過(guò)濾機(jī)制,即生產(chǎn)者可以設(shè)置消息的屬性(Properties),該屬性與消費(fèi)者端的Selector對(duì)應(yīng),只有消費(fèi)者設(shè)置的selector與消息的Properties匹配,消息才會(huì)發(fā)給該消費(fèi)者。Topic和Queue都支持Selector。
示例代碼:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using Apache.NMS; using System.Diagnostics; using Apache.NMS.Util; using System.Windows.Threading; /* * 功能描述:C#使用ActiveMQ示例 * 修改次數(shù):2 * 最后更新: by Kagula,2012-07-31 * * 前提條件: * [1]apache-activemq-5.4.2 * [2]Apache.NMS.ActiveMQ-1.5.6-bin * [3]WinXP SP3 * [4]VS2008 SP1 * [5]WPF工程 With .NET Framework 3.5 * * 啟動(dòng) * * 不帶安全控制方式啟動(dòng) * [你的解壓路徑]\apache-activemq-5.4.2\bin\activemq.bat * * 安全方式啟動(dòng) * 添加環(huán)境變量: ACTIVEMQ_ENCRYPTION_PASSWORD=activemq * [你的解壓路徑]\apache-activemq-5.4.2\bin>activemq xbean:file:../conf/activemq-security.xml * * Active MQ 管理地址 * http://127.0.0.1:8161/admin/ * 添加訪問(wèn)"http://127.0.0.1:8161/admin/"的限制 * * 第一步:添加訪問(wèn)限制 * 修改D:\apache\apache-activemq-5.4.2\conf\jetty.xml文件 * 下面這行編碼,原 * <property name="authenticate" value="true" /> * 修改為 * <property name="authenticate" value="false" /> * * 第二步:修改登錄用戶名密碼,缺省分別為admin,admin * D:\apache\apache-activemq-5.4.2\conf\jetty-realm.properties * * 用戶管理(前提:以安全方式啟動(dòng)ActiveMQ) * * 在[你的解壓路徑]\apache-activemq-5.4.2\conf\credentials.properties文件中修改默認(rèn)的用戶名密碼 * 在[你的解壓路徑]\apache-activemq-5.4.2\conf\activemq-security.xml文件中可以添加新的用戶名 * e.g. 添加oa用戶,密碼同用戶名。 * <authenticationUser username="oa" password="oa" groups="users,admins"/> * * 在[你的解壓路徑]\apache-activemq-5.4.2\conf\activemq-security.xml文件中你還可以設(shè)置指定的Topic或Queue * 只能被哪些用戶組read 或 write。 * * * 配置C# with WPF項(xiàng)目 * 項(xiàng)目的[Application]->[TargetFramework]屬性設(shè)置為[.NETFramework 3.5](這是VS2008WPF工程的默認(rèn)設(shè)置) * 添加[你的解壓路徑]\Apache.NMS.ActiveMQ-1.5.6-bin\lib\Apache.NMS\net-3.5\Apache.NMS.dll的引用 * Apache.NMS.dll相當(dāng)于接口 * * 如果是以Debug方式調(diào)試 * 把[你的解壓路徑]\Apache.NMS.ActiveMQ-1.5.6-bin\build\net-3.5\debug\目錄下的 * Apache.NMS.ActiveMQ.dll文件復(fù)制到你項(xiàng)目的Debug目錄下 * Apache.NMS.ActiveMQ.dll相當(dāng)于實(shí)現(xiàn) * * 如果是以Release方式調(diào)試 * 參考上文,去取Apache.NMS,Release目錄下相應(yīng)的DLL文件,并復(fù)制到你項(xiàng)目的Release目錄下。 * * * 參考資料 * [1]《C#調(diào)用ActiveMQ官方示例》 http://activemq.apache.org/nms/examples.html * [2]《ActiveMQ NMS下載地址》http://activemq.apache.org/nms/activemq-downloads.html * [3]《Active MQ在C#中的應(yīng)用示例》//www.jb51.net/article/87956.htm * [4]《NMS API Reference》http://activemq.apache.org/nms/nms-api.html */ namespace testActiveMQSubscriber { /// <summary> /// Interaction logic for Window1.xaml /// </summary> public partial class Window1 : Window { private static IConnectionFactory connFac; private static IConnection connection; private static ISession session; private static IDestination destination; private static IMessageProducer producer; private static IMessageConsumer consumer; protected static ITextMessage message = null; public Window1() { InitializeComponent(); initAMQ("MyFirstTopic"); } private void initAMQ(String strTopicName) { try { connFac = new NMSConnectionFactory(new Uri("activemq:failover:(tcp://localhost:61616)")); //新建連接 //connection = connFac.CreateConnection("oa","oa");//設(shè)置連接要用的用戶名、密碼 //如果你要持久“訂閱”,則需要設(shè)置ClientId,這樣程序運(yùn)行當(dāng)中被停止,恢復(fù)運(yùn)行時(shí),能拿到?jīng)]接收到的消息! connection.ClientId = "testing listener"; connection = connFac.CreateConnection();//如果你是缺省方式啟動(dòng)Active MQ服務(wù),則不需填用戶名、密碼 //創(chuàng)建Session session = connection.CreateSession(); //發(fā)布/訂閱模式,適合一對(duì)多的情況 destination = SessionUtil.GetDestination(session, "topic://" + strTopicName); //新建生產(chǎn)者對(duì)象 producer = session.CreateProducer(destination); producer.DeliveryMode = MsgDeliveryMode.NonPersistent;//ActiveMQ服務(wù)器停止工作后,消息不再保留 //新建消費(fèi)者對(duì)象:普通“訂閱”模式 //consumer = session.CreateConsumer(destination);//不需要持久“訂閱” //新建消費(fèi)者對(duì)象:持久"訂閱"模式: // 持久“訂閱”后,如果你的程序被停止工作后,恢復(fù)運(yùn)行, //從第一次持久訂閱開(kāi)始,沒(méi)收到的消息還可以繼續(xù)收 consumer = session.CreateDurableConsumer( session.GetTopic(strTopicName) , connection.ClientId, null, false); //設(shè)置消息接收事件 consumer.Listener += new MessageListener(OnMessage); //啟動(dòng)來(lái)自Active MQ的消息偵聽(tīng) connection.Start(); } catch (Exception e) { //初始化ActiveMQ連接失敗,往VS2008的Output窗口寫(xiě)入出錯(cuò)信息! Debug.WriteLine(e.Message); } } private void SendMsg2Topic_Click(object sender, RoutedEventArgs e) { //發(fā)送消息 ITextMessage request = session.CreateTextMessage(DateTime.Now.ToLocalTime()+" "+tbMsg.Text); producer.Send(request); } protected void OnMessage(IMessage receivedMsg) { //接收消息 message = receivedMsg as ITextMessage; //UI線程,顯示收到的消息 Dispatcher.Invoke(DispatcherPriority.Normal, new Action(() => { DateTime dt = new DateTime(); ListBoxItem lbi = new ListBoxItem(); lbi.Content = DateTime.Now.ToLocalTime() + " " + message.Text; lbR.Items.Add(lbi); })); } } }
隊(duì)列通訊方式,消費(fèi)者例子
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Apache.NMS; using System.Diagnostics; using log4net; using Apache.NMS.Util; using System.Collections; namespace Cat8637AutoCallServer { public class SMTask { public String Callee { get; set; } public String CheckNumber { get; set; } public int Deadline { get; set; } public override String ToString() { return String.Format("Callee={0},CheckNumber={1},Deadline={2}", Callee,CheckNumber,Deadline); } } /* * 負(fù)責(zé)接收任務(wù),并把任務(wù)放在任務(wù)等待隊(duì)列中。 */ public class MQClient { private static readonly ILog logger = LogManager.GetLogger(typeof(MQClient)); private static IConnection connection = null; private static ISession session = null; Queue _voiceSMTasks = new Queue(); public MQClient() { try { IConnectionFactory factory = new NMSConnectionFactory(new Uri("activemq:failover:(tcp://localhost:61616)")); //新建連接 //connection = connFac.CreateConnection("oa","oa");//設(shè)置連接要用的用戶名、密碼 connection = factory.CreateConnection(); session = connection.CreateSession(); IMessageConsumer consumer = session.CreateConsumer(session.GetQueue("TaskIssue_VoiceSM")); consumer.Listener += new MessageListener(OnMessage); connection.Start(); } catch (Exception ex) { Debug.WriteLine(ex.Message); } } protected void OnMessage(IMessage receivedMsg) { IMessage message = receivedMsg as ITextMessage; SMTask smTask = new SMTask(); smTask.Callee = message.Properties["Callee"] as String; smTask.CheckNumber = message.Properties["Message"] as String; smTask.Deadline = Convert.ToInt32(message.Properties["deadline"] as String); logger.Info("Received: "+smTask.ToString()); lock (_voiceSMTasks) { _voiceSMTasks.Enqueue(smTask); } } public SMTask GetVoiceSMTask() { SMTask result = null; lock (_voiceSMTasks) { if (_voiceSMTasks.Count > 0) { result = _voiceSMTasks.Dequeue() as SMTask; } } return result; } } }
隊(duì)列通訊方式,生產(chǎn)者例子
private void Send_Click(object sender, RoutedEventArgs e) { try { IDestination destination = SessionUtil.GetDestination(session, "queue://TaskIssue_VoiceSM"); //新建生產(chǎn)者對(duì)象 IMessageProducer producer = session.CreateProducer(destination); producer.DeliveryMode = MsgDeliveryMode.NonPersistent;//ActiveMQ服務(wù)器停止工作后,消息不再保留 ITextMessage request = session.CreateTextMessage(); request.NMSCorrelationID = "TestVoiceSM";//這里我填了應(yīng)用程序的名稱(chēng)。 request.Properties["Callee"] = tbCallee.Text; request.Properties["Message"] = tbCheckNumber.Text; request.Properties["deadline"] = tbValidDuration.Text; producer.Send(request); } catch (Exception ex) { //初始化ActiveMQ連接失敗,往VS2008的Output窗口寫(xiě)入出錯(cuò)信息! Debug.WriteLine(ex.Message); } } private void Window_Closed(object sender, EventArgs e) { try { if (session == null) return; //if (connection == null) // return; session.Close(); //connection.Close(); } catch (Exception ex) { Debug.WriteLine(ex.Message); } }
更多關(guān)于C#相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《C#窗體操作技巧匯總》、《C#常見(jiàn)控件用法教程》、《WinForm控件用法總結(jié)》、《C#程序設(shè)計(jì)之線程使用技巧總結(jié)》、《C#操作Excel技巧總結(jié)》、《C#中XML文件操作技巧匯總》、《C#數(shù)據(jù)結(jié)構(gòu)與算法教程》、《C#數(shù)組操作技巧總結(jié)》及《C#面向?qū)ο蟪绦蛟O(shè)計(jì)入門(mén)教程》
希望本文所述對(duì)大家C#程序設(shè)計(jì)有所幫助。
上一篇:淺談C# 非模式窗體show()和模式窗體showdialog()的區(qū)別
欄 目:C#教程
本文標(biāo)題:C#實(shí)現(xiàn)同Active MQ通訊的方法
本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/6355.html
您可能感興趣的文章
- 01-10C#實(shí)現(xiàn)txt定位指定行完整實(shí)例
- 01-10WinForm實(shí)現(xiàn)仿視頻 器左下角滾動(dòng)新聞效果的方法
- 01-10C#實(shí)現(xiàn)清空回收站的方法
- 01-10C#實(shí)現(xiàn)讀取注冊(cè)表監(jiān)控當(dāng)前操作系統(tǒng)已安裝軟件變化的方法
- 01-10C#實(shí)現(xiàn)多線程下載文件的方法
- 01-10C#實(shí)現(xiàn)Winform中打開(kāi)網(wǎng)頁(yè)頁(yè)面的方法
- 01-10C#實(shí)現(xiàn)遠(yuǎn)程關(guān)閉計(jì)算機(jī)或重啟計(jì)算機(jī)的方法
- 01-10C#自定義簽名章實(shí)現(xiàn)方法
- 01-10C#文件斷點(diǎn)續(xù)傳實(shí)現(xiàn)方法
- 01-10winform實(shí)現(xiàn)創(chuàng)建最前端窗體的方法


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 01-10C#通過(guò)反射獲取當(dāng)前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁(yè)無(wú)法打開(kāi)的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實(shí)現(xiàn)txt定位指定行完整實(shí)例
- 01-10WinForm實(shí)現(xiàn)仿視頻 器左下角滾動(dòng)新
- 01-10C#停止線程的方法
- 01-10C#實(shí)現(xiàn)清空回收站的方法
- 01-10C#通過(guò)重寫(xiě)Panel改變邊框顏色與寬度的
- 01-10C#實(shí)現(xiàn)讀取注冊(cè)表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機(jī)閱讀
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-11Mac OSX 打開(kāi)原生自帶讀寫(xiě)NTFS功能(圖文
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-10C#中split用法實(shí)例總結(jié)
- 04-02jquery與jsp,用jquery
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 01-10delphi制作wav文件的方法