2009-07-09 2 views
0

저는 Spring.NET을 사용하여 ActiveMQ에 연결하고 일부 간단한 pub 서브 라우팅을 수행합니다. 내 선택기가 Car = 'Honda'와 같은 간단한 표현이지만 Car = 'Honda'및 Make = 'Pilot'과 같은 복합 표현식을 사용하면 가입에 대한 일치 항목을 얻지 못할 때 모든 것이 올바르게 작동합니다.복합 문을 사용하는 Spring.Net 메시지 선택기가 작동하지 않는 것 같습니다.

다음은 구독을 생성하는 코드입니다. 내가 잘못 처리 한 부분을 누가 볼 수 있습니까?

public bool AddSubscription(string topicName, Dictionary<string,string> selectorList, GDException exp) 
     { 
      try 
      { 
       ActiveMQTopic topic = new ActiveMQTopic(topicName); 
       string selectorString = ""; 

       if (selectorList.Keys.Count == 0) 
       { 
        // Select all items for this topic 
        selectorString = "2>1"; 
       } 
       else 
       { 
        foreach (string key in selectorList.Keys) 
        { 
         selectorString += key + " = '" + selectorList[key] + "'" + " AND "; 
        } 
        selectorString = selectorString.Remove(selectorString.Length - 5, 5); 
       } 

       IMessageConsumer consumer = this._subSession.CreateConsumer(topic, selectorString, false); 
       if (consumer != null) 
       { 
        _consumers.Add(consumer); 
        consumer.Listener += new MessageListener(HandleRecieveMessage); 
        return true; 
       } 
       else 
       { 
        exp.SetValues("Error adding subscription, null consumer returned"); 
        return false; 
       } 
      } 
      catch (Exception ex) 
      { 
       exp.SetValues(ex); 
       return false; 
      } 
     } 

그리고 코드

나에게 충분히

public void SendMessage(GDPubSubMessage messageToSend) 
     { 
      if (!this.isDisposed) 
      { 
       if (_producers.ContainsKey(messageToSend.Topic)) 
       { 
        IBytesMessage bytesMessage = this._pubSession.CreateBytesMessage(messageToSend.Payload); 
        foreach (string key in messageToSend.MessageProperties.Keys) 
        { 
         bytesMessage.Properties.SetString(key, messageToSend.MessageProperties[key]); 
        } 

        _producers[messageToSend.Topic].Send(bytesMessage, false, (byte)255, TimeSpan.FromSeconds(1)); 
       } 
       else 
       { 
        ActiveMQTopic topic = new ActiveMQTopic(messageToSend.Topic); 
        _producers.Add(messageToSend.Topic, this._pubSession.CreateProducer(topic)); 
        IBytesMessage bytesMessage = this._pubSession.CreateBytesMessage(messageToSend.Payload); 
        foreach (string key in messageToSend.MessageProperties.Keys) 
        { 
         bytesMessage.Properties.SetString(key, messageToSend.MessageProperties[key]); 
        } 

        _producers[messageToSend.Topic].Send(bytesMessage); 
       } 
      } 
      else 
      { 
       throw new ObjectDisposedException(this.GetType().FullName); 
      } 
     } 

07/102009를 간단한데 메시지를 보낼 :

확인 업데이트, 문제를 발견

bytesMessage.Properties.SetString(key, messageToSend.MessageProperties[key]); 

이 정의는 단일 속성을 설정하므로 내 메시지는 단일 속성으로 태그가 지정되므로 콤보 하위 scription은 절대로 안타. 누구든지 더 많은 속성을 추가하는 방법을 알고 있습니까? bytesMessage.Properties에는 Add 메서드가 있다고 생각 하겠지만 그렇지 않습니다.

답변

0

이 좋아, 그래서 여기에 (그것도 다른 사람에게 발생한다)

Spring.NET이 추가 속성을 처리 할 Apache.NMS.ActiveMQ.MessagePropertyHelper 클래스를 사용하여 일어나고 결국거야.

내게 알려지지 않은 경우, 거기에 어떤 반향이 진행 중입니다. 어딘가 내 작은 애플 리케이션을 테스트하는 동안 나는 아프고 "MessageType"속성 이름을 입력하는 것에 질려서, "Type"으로 줄였다.

어디서 잘못되었는지 알 수는 없지만 명확하게 Type은 예약어이며 작동하지 않으며 어떤 종류의 예외도 발생시키지 않습니다.