/** * 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); } } }
/** * @see * de.willuhn.jameica.messaging.MessagingQueue#unRegisterMessageConsumer(de.willuhn.jameica.messaging.MessageConsumer) */ public void unRegisterMessageConsumer(MessageConsumer consumer) { if (consumer == null) return; if (this.consumers.size() == 0) { Logger.debug("queue contains no consumers, skip unregistering"); return; } Logger.debug( "queue " + this.name + ": unregistering message consumer " + consumer.getClass().getName()); this.consumers.remove(consumer); }
/** * @see * de.willuhn.jameica.messaging.MessagingQueue#registerMessageConsumer(de.willuhn.jameica.messaging.MessageConsumer) */ public void registerMessageConsumer(MessageConsumer consumer) { if (consumer == null) return; Logger.debug( "queue " + this.name + ": registering message consumer " + consumer.getClass().getName()); this.consumers.add(consumer); // Wir haben mindestens eine zwischengespeicherte Message und wenigstens einen Consumer - wir // koennen die Queue jetzt leeren int size = this.queue.size(); if (size > 0) { Logger.info("delivering " + size + " queued messages to queue: " + this.name); this.queue.drainTo(messages); } }