Работа с 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, какова будет частота?
Может ли потребитель сделать только один раз?
Действительно, это dspace 1.8.2, вырезанный для моей организации CMS, которую я унаследовал. В коде ничего не сказано, это модификация. Я просто проверяю оригинальный код dspace и, действительно, вы правы. Я нахожу это очень сильным, и мне нужно спросить, почему это так. – MaatDeamon
Это, конечно, выглядит странно для меня! Если у вас нет какой-либо местной документации, я думаю, что ваш предшественник добавил этот цикл для решения какой-либо проблемы. Что вы можете узнать, если вы удалите цикл;) Но я не думаю, что кто-то еще сможет вам помочь. – schweerelos