2013-09-09 7 views
1

Я использую Mule 3.3.1пользовательских компонент для чтения сообщений из очереди

Я пытаюсь написать компонент, который считывает все имеющиеся сообщения из очереди, которые я намереваюсь быть опрошены с помощью планировщика Quartz.

Вот мой код.

@Override 
public Object onCall(MuleEventContext muleEventContext) throws Exception { 
    MuleMessage[] messages = null; 

    MuleMessage result = muleEventContext.getMessage(); 
    do { 
     if (result == null) { 
      break; 
     } 
     if (result instanceof MuleMessageCollection) { 
      MuleMessageCollection resultsCollection = (MuleMessageCollection) result; 
      System.out.println("Number of messages: " + resultsCollection.size()); 
      messages = resultsCollection.getMessagesAsArray(); 
     } else { 
      messages = new MuleMessage[1]; 
      messages[0] = result; 
     } 
     result = muleEventContext.getMessage(); 
    } while (result !=null); 
    return messages; 
} 

К сожалению, на первом сообщении он бесконечно петляет. Мысли?

+0

Вы не где результат настройки как null, так что он продолжает цикл –

+0

@Learner Извините. Мое требование - перебирать все сообщения в очереди. Любая идея, как я могу это достичь? – Jeet

+0

Пожалуйста, добавьте конфигурацию, в которой этот компонент вызывается, и входящую очередь. – user1760178

ответ

2

OnCall метод(), предусмотренный в пост будет бесконечно цикла, потому что

muleEventContext.getMessage() 

всегда возвращает MuleMessage. И поэтому цикл будет проходить бесконечно.

Объект MuleEventContext здесь не является итератором или потоком, где указатель указывает на следующий элемент после считывания текущего элемента.

Чтобы прочитать все доступные сообщения из очереди. Вы можете подключить JMS для чтения путем опроса в очереди и прочитать все сообщения. Но помните, что каждое сообщение в очереди будет одной итерацией (одно сообщение) из вашей входящей JMS.

Если вы хотите собрать все сообщения очереди как набор объектов, а затем продолжить, то это совсем другая история. Это невозможно сделать с кодом компонента.

Если вы собираетесь собирать все свои сообщения в виде коллекции и затем начинать обработку, попробуйте использовать что-то вроде collection-aggregator мула на вашем входящем.

Надеюсь, это поможет.

+0

Спасибо. Есть ли какой-нибудь серьезный скрипт, который может достичь агрегации? Я пытаюсь найти ответ для простого требования ... http: //stackoverflow.com/questions/18644411/mule-quartz-scheduler-process-multiple-messages, но еще найти решение. – Jeet

 Смежные вопросы

  • Нет связанных вопросов^_^