/** * Stellt die Nachricht an alle Consumer zu. * * @param consumers die Message-Consumer. * @param msg */ private void deliver(Message msg) { if (pool.isTerminating() || pool.isTerminated()) { Logger.warn("shutdown in progress, no more messages accepted"); return; // wir nehmen keine Nachrichten mehr entgegen. } // BUGZILLA 1413 Wir koennen leider doch nicht auf einer Kopie der Liste arbeiten, weil // diese waehrend der Zustellung erweitert werden kann. Z.bsp. der "AutoRegisterMessageConsumer" // erhaelt die SYSTEM_STARTED-Message und registriert daraufhin neue Consumer. Unter anderem // den DeployMessageConsumer aus jameica.webadmin, der ebenfalls auf die SYSTEM_STARTED-Message // lauscht. Logger.debug("deliver message " + msg.toString()); MessageConsumer consumer = null; for (int i = 0; i < this.consumers.size(); ++i) { consumer = this.consumers.get(i); Class[] expected = consumer.getExpectedMessageTypes(); boolean send = expected == null; if (expected != null) { for (int j = 0; j < expected.length; ++j) { if (expected[j].isInstance(msg)) { send = true; break; } } } try { if (send) consumer.handleMessage(msg); } catch (ApplicationException ae) { Application.getMessagingFactory() .sendSyncMessage(new StatusBarMessage(ae.getMessage(), StatusBarMessage.TYPE_ERROR)); } catch (OperationCanceledException oce) { Logger.debug("consumer " + consumer.getClass().getName() + " cancelled message " + msg); } catch (Throwable t) { Logger.error( "consumer " + consumer.getClass().getName() + " produced an error (" + t.getClass().getName() + ": " + t + ") while consuming message " + msg); Logger.write(Level.INFO, "error while processing message", t); } } }