C#完成同Active MQ通信的辦法。本站提示廣大學習愛好者:(C#完成同Active MQ通信的辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是C#完成同Active MQ通信的辦法正文
本文實例講述了C#完成同Active MQ通信的辦法。分享給年夜家供年夜家參考,詳細以下:
內容概要:
重要以源碼的情勢引見若何用C#完成同Active MQ 的通信。本文假定你曾經准確裝置JDK1.6.x,懂得Active MQ並有必定的編程基本。
注釋:
JMS 法式的終究目標是臨盆和花費的新聞能被其他法式應用,JMS 的 Message 是一個既簡略又不乏靈巧性的根本格局,許可創立分歧平台上相符非JMS 法式格局的新聞。
Message 由新聞頭,屬性和新聞體三部分構成。
Active MQ支撐過濾機制,即臨盆者可以設置新聞的屬性(Properties),該屬性與花費者真個Selector對應,只要花費者設置的selector與新聞的Properties婚配,新聞才會發給該花費者。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示例 * 修正次數: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 * * 啟動 * * 不帶平安掌握方法啟動 * [你的解壓途徑]\apache-activemq-5.4.2\bin\activemq.bat * * 平安方法啟動 * 添加情況變量: 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/ * 添加拜訪"http://127.0.0.1:8161/admin/"的限制 * * 第一步:添加拜訪限制 * 修正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 * * 用戶治理(條件:以平安方法啟動ActiveMQ) * * 在[你的解壓途徑]\apache-activemq-5.4.2\conf\credentials.properties文件中修正默許的用戶名暗碼 * 在[你的解壓途徑]\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文件中你還可以設置指定的Topic或Queue * 只能被哪些用戶組read 或 write。 * * * 設置裝備擺設C# with WPF項目 * 項目標[Application]->[TargetFramework]屬性設置為[.NETFramework 3.5](這是VS2008WPF工程的默許設置) * 添加[你的解壓途徑]\Apache.NMS.ActiveMQ-1.5.6-bin\lib\Apache.NMS\net-3.5\Apache.NMS.dll的援用 * Apache.NMS.dll相當於接口 * * 假如是以Debug方法調試 * 把[你的解壓途徑]\Apache.NMS.ActiveMQ-1.5.6-bin\build\net-3.5\debug\目次下的 * Apache.NMS.ActiveMQ.dll文件復制到你項目標Debug目次下 * Apache.NMS.ActiveMQ.dll相當於完成 * * 假如是以Release方法調試 * 參考上文,去取Apache.NMS,Release目次下響應的DLL文件,並復制到你項目標Release目次下。 * * * 參考材料 * [1]《C#挪用ActiveMQ官方示例》 http://activemq.apache.org/nms/examples.html * [2]《ActiveMQ NMS下載地址》http://activemq.apache.org/nms/activemq-downloads.html * [3]《Active MQ在C#中的運用示例》http://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");//設置銜接要用的用戶名、暗碼 //假如你要耐久“定閱”,則須要設置ClientId,如許法式運轉傍邊被停滯,恢復運轉時,能拿到沒吸收到的新聞! connection.ClientId = "testing listener"; connection = connFac.CreateConnection();//假如你是缺省方法啟動Active MQ辦事,則不需填用戶名、暗碼 //創立Session session = connection.CreateSession(); //宣布/定閱形式,合適一對多的情形 destination = SessionUtil.GetDestination(session, "topic://" + strTopicName); //新建臨盆者對象 producer = session.CreateProducer(destination); producer.DeliveryMode = MsgDeliveryMode.NonPersistent;//ActiveMQ辦事器停滯任務後,新聞不再保存 //新建花費者對象:通俗“定閱”形式 //consumer = session.CreateConsumer(destination);//不須要耐久“定閱” //新建花費者對象:耐久"定閱"形式: // 耐久“定閱”後,假如你的法式被停滯任務後,恢復運轉, //從第一次耐久定閱開端,充公到的新聞還可以持續收 consumer = session.CreateDurableConsumer( session.GetTopic(strTopicName) , connection.ClientId, null, false); //設置新聞吸收事宜 consumer.Listener += new MessageListener(OnMessage); //啟動來自Active MQ的新聞偵聽 connection.Start(); } catch (Exception e) { //初始化ActiveMQ銜接掉敗,往VS2008的Output窗口寫入失足信息! Debug.WriteLine(e.Message); } } private void SendMsg2Topic_Click(object sender, RoutedEventArgs e) { //發送新聞 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); })); } } }
隊列通信方法,花費者例子
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); } } /* * 擔任吸收義務,並把義務放在義務期待隊列中。 */ 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");//設置銜接要用的用戶名、暗碼 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; } } }
隊列通信方法,臨盆者例子
private void Send_Click(object sender, RoutedEventArgs e) { try { IDestination destination = SessionUtil.GetDestination(session, "queue://TaskIssue_VoiceSM"); //新建臨盆者對象 IMessageProducer producer = session.CreateProducer(destination); producer.DeliveryMode = MsgDeliveryMode.NonPersistent;//ActiveMQ辦事器停滯任務後,新聞不再保存 ITextMessage request = session.CreateTextMessage(); request.NMSCorrelationID = "TestVoiceSM";//這裡我填了運用法式的稱號。 request.Properties["Callee"] = tbCallee.Text; request.Properties["Message"] = tbCheckNumber.Text; request.Properties["deadline"] = tbValidDuration.Text; producer.Send(request); } catch (Exception ex) { //初始化ActiveMQ銜接掉敗,往VS2008的Output窗口寫入失足信息! 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); } }
願望本文所述對年夜家C#法式設計有所贊助。