2015-05-20 1 views
0

Работа с dspace 1.8.x Я пытаюсь понять механизм потребительского преобразователя, например, зарегистрировать надлежащего потребителя.Диспетчер событий в Dspace, как он работает?

Однако что-то странное происходит в классе BasicDispatcher.

Он повторяет выполнение потребителем в цикле. Я не знаю почему.

Здесь тревожная линия и код можно найти ниже

время (! Vnts.isEmpty() & & dispatchLoop < ConfigurationManager.getIntProperty ("maxDispatchLoops", 3))

прямо вверху.

/** 
* Dispatch all events added to this Context according to configured 
* consumers. 
* 
* @param ctx 
*   the execution context 
*/ 
public void dispatch(Context ctx) 
{ 
    if (!consumers.isEmpty()) 
    { 
     List<Event> vnts = ctx.getEvents(); 
     int dispatchLoop=0; 

     while (!vnts.isEmpty() && dispatchLoop < ConfigurationManager.getIntProperty("maxDispatchLoops", 3)) { 
      List<Event> events=new LinkedList<Event>(vnts); 
      log.debug(dispatchLoop + " - " + ctx.getEvents().size()); 
      vnts.clear(); 
      log.debug(ctx.getEvents().size()); 

      if (events == null) 
      { 
       return; 
      } 

      if (log.isDebugEnabled()) 
      { 
       log.debug("Processing queue of " 
         + String.valueOf(events.size()) + " events."); 
      } 

      // transaction identifier applies to all events created in 
      // this context for the current transaction. Prefix it with 
      // some letters so RDF readers don't mistake it for an integer. 
      String tid = "TX" + Utils.generateKey(); 

      for (Event event : events) 
      { 
       event.setDispatcher(getIdentifier()); 
       event.setTransactionID(tid); 

       if (log.isDebugEnabled()) 
       { 
        log.debug("Iterating over " 
          + String.valueOf(consumers.values().size()) 
          + " consumers..."); 
       } 

       for (Iterator ci = consumers.values().iterator(); ci.hasNext();) 
       { 
        ConsumerProfile cp = (ConsumerProfile) ci.next(); 

        if (event.pass(cp.getFilters())) 
        { 
         if (log.isDebugEnabled()) 
         { 
          log.debug("Sending event to \"" + cp.getName() 
            + "\": " + event.toString()); 
         } 

         try 
         { 
          consume(cp, event, ctx); 
         } 
         catch (Exception e) 
         { 
          log.error("Consumer(\"" + cp.getName() 
            + "\").consume threw: " + e.toString(), e); 
         } 
        } 

       } 
      } 

      // Call end on the consumers that got synchronous events. 
      for (Iterator ci = consumers.values().iterator(); ci.hasNext();) 
      { 
       ConsumerProfile cp = (ConsumerProfile) ci.next(); 
       if (cp != null) 
       { 
        if (log.isDebugEnabled()) 
        { 
         log.debug("Calling end for consumer \"" + cp.getName() 
           + "\""); 
        } 

        try 
        { 
         if (cp.isAsynchronous()) { 
          if (thread == null || !thread.isAlive()) { 
           thread = new ConsumerThread(); 
           thread.queue.add(new ConsumerStuff(cp)); 
           thread.start(); 
          } else 
           thread.queue.add(new ConsumerStuff(cp)); 
         } else { 
          cp.getConsumer().end(ctx); 
         } 
        } 
        catch (Exception e) 
        { 
         log.error("Error in Consumer(\"" + cp.getName() 
           + "\").end: " + e.toString(), e); 
        } 
       } 
      } 
      dispatchLoop++; 
      if(ctx.getEvents()!=null) 
      vnts = Collections.synchronizedList(ctx.getEvents()); 

     } 
    } 
} 

У кого-нибудь есть идея причины. Также как кто-то может изменить maxDispatchLoops, какова будет частота?

Может ли потребитель сделать только один раз?

ответ

0

Вы можете сообщить нам, где вы нашли этот код? Он не находится в официальной базе данных DSpace, по крайней мере, не в классе BasicDispatcher в dspace-1_7, dspace-1_8 или главных ветвях. Свойство конфигурации также не существует. Возможно, это локальная настройка?

+0

Действительно, это dspace 1.8.2, вырезанный для моей организации CMS, которую я унаследовал. В коде ничего не сказано, это модификация. Я просто проверяю оригинальный код dspace и, действительно, вы правы. Я нахожу это очень сильным, и мне нужно спросить, почему это так. – MaatDeamon

+0

Это, конечно, выглядит странно для меня! Если у вас нет какой-либо местной документации, я думаю, что ваш предшественник добавил этот цикл для решения какой-либо проблемы. Что вы можете узнать, если вы удалите цикл;) Но я не думаю, что кто-то еще сможет вам помочь. – schweerelos