2016-11-21 81 views
0

我有一個用ASP.NET(C#)編寫的簡單測試網站,我可以從中將消息發送到本地主機上的Active MQ隊列,並從隊列接收消息在本地主機上。我的問題是雙摺:aspx:在Active MQ消息上設置消息選擇器

1)如何從我的網站發送郵件到包含特定選擇器值的隊列?

在我創造我發送到隊列這樣的消息的那一刻:

IConnectionFactory factory = new NMSConnectionFactory("tcp://192.168.1.152:61616"); 
     IConnection connection = factory.CreateConnection(); 
     connection.Start(); 

     ISession session = connection.CreateSession(AcknowledgementMode.AutoAcknowledge); 
     IDestination QueueDestination = SessionUtil.GetDestination(session, "Request"); 
     IMessageProducer messageProducer = session.CreateProducer(QueueDestination); 

     ITextMessage request = session.CreateTextMessage(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ": " + tb_Request.Text.Trim()); 
     messageProducer.Send(request); 

2)當建立在我的本地主機ActiveMQ的隊列中的消息,我怎麼選擇值添加到消息?

預先感謝:-)

回答

0

消息選擇是對消費者(訂閱)的方式來過濾他們收到時活性的消息。在發送消息時,您不會對選擇器做任何設置或做任何事情。如果您發送到隊列並且消費者有一個匹配消息的選擇器,那麼它將被分派給它,否則消息將保留在隊列中,直到另一個消費者讀取並確認消息。一些文檔是here

在Google上搜索JMS消息選擇器以瞭解更多信息。

+0

從您引用的鏈接以及我看過的其他鏈接中,您必須將消費者選擇器設置爲鍵/值對。我遇到的困難是將這個鍵/值對放在消息中。 任何人都可以告訴我在選擇器鍵/值對應放置在消息的哪裏和如何? – SorenA

+0

您原來的問題並不能反映您現在所要問的內容,我會更新問題以說明問題。 –

+0

如果我的問題不清楚,我很抱歉。感謝您花時間讓它更清晰。 – SorenA

0

我設法弄明白了,並認爲我會將我的發現分享給其他人看看/評論。

首先我創建了一個OperatorRequestObject類:

public class OperatorRequestObject 
{ 
    string shortcode; 

    public string Shortcode { 
     get { return shortcode; } 
     set { shortcode = value; } 
    } 
} 

當創建要發送到隊列中的消息我用這個代碼:

OperatorRequestObject OperatorRequestObject = new OperatorRequestObject(); 
     OperatorRequestObject.Shortcode = tb_Request.Text.ToString(); 

     IConnectionFactory factory = new NMSConnectionFactory("tcp://192.XXX.X.XXX:61616"); 
     IConnection connection = factory.CreateConnection(); 
     connection.Start(); 

     ISession session = connection.CreateSession(AcknowledgementMode.AutoAcknowledge); 
     IDestination QueueDestination = SessionUtil.GetDestination(session, "Command"); 
     IMessageProducer messageProducer = session.CreateProducer(QueueDestination); 

     ITextMessage request = session.CreateTextMessage(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ": " + tb_Request.Text.Trim()); 
     request.Properties.SetString("deviceID", "12345"); 
     messageProducer.Send(request); 

     session.Close(); 
     connection.Stop(); 

     tb_Request.Text = ""; 
     tb_Request.Focus(); 

線 「request.Properties.SetString(」 設備ID 「,」12345「);」是我添加我的選擇器鍵/值對,我用它來選擇哪個消費者得到什麼消息。

若要檢索基於「設備ID」的值的消息我用這個代碼:

string Selector = "deviceID = '12345'"; 
     IConnectionFactory factory = new NMSConnectionFactory("tcp://192.XXX.X.XXX:61616"); 
     IConnection connection = factory.CreateConnection(); 
     connection.Start(); 
     ISession session = connection.CreateSession(AcknowledgementMode.AutoAcknowledge); 

     IDestination destination = SessionUtil.GetDestination(session, "Command"); 
     IMessageConsumer messageConsumer = session.CreateConsumer(destination, Selector); 

     IMessage message = messageConsumer.Receive(); 

     string NewCommand = ""; 

     if (message != null) { 
      ITextMessage IText = message as ITextMessage; 
      if (IText != null) { 
       if (!string.IsNullOrEmpty(IText.Text)) { 
        NewCommand = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ": " + IText.Text; 
       } 
      } 
     } 
     tb_Command.Text = tb_Command.Text + "\r\n" + NewCommand; 
     messageConsumer.Close(); 
     messageConsumer.Dispose(); 
     connection.Stop(); 
     connection.Close(); 
     connection.Dispose(); 

設置「串選擇=‘設備ID =‘12345’’(不要忘了'「)意味着消費者只能從人發送使用上面所示的選擇的隊列中取出的消息

請注意:上面的代碼很可能不是「最佳實踐」或快速和緊湊,因爲它可以。這就是我如何設法讓我的代碼正常工作的。

希望這可以幫助有同樣問題的人。

隨意評論:-)