// JMSCommunicationThread
  @Override
  protected void createProducersAndConsumers() throws Exception {
    final String configuration = model.getConfigurationName();
    // Write (if allowed) and also read the client topic
    if (model.isWriteAllowed())
      client_producer = createProducer(Preferences.getJMS_AlarmClientTopic(configuration));
    else client_producer = null;
    client_consumer = createConsumer(Preferences.getJMS_AlarmClientTopic(configuration));
    // Read messages from server
    server_consumer = createConsumer(Preferences.getJMS_AlarmServerTopic(configuration));

    // Handle MapMessages
    final MessageListener message_listener =
        new MessageListener() {
          @Override
          public void onMessage(final Message message) {
            if (message instanceof MapMessage) handleMapMessage((MapMessage) message);
            else
              Activator.getLogger()
                  .log(Level.WARNING, "Message type {0} not handled", message.getClass().getName());
          }
        };
    client_consumer.setMessageListener(message_listener);
    server_consumer.setMessageListener(message_listener);
  }
  /** Invoked for received messages */
  private void handleMapMessage(final MapMessage message) {
    try {
      final String text = message.getString(JMSLogMessage.TEXT);
      Runnable action = null;

      // Create action, or handle the message right away

      // Alarm state change?
      if (JMSAlarmMessage.TEXT_STATE.equals(text)) {
        // Received a state update from server, reset timeout
        timeout_timer.reset();
        action = new UpdateAction(AlarmUpdateInfo.fromMapMessage(message));
        model.updateServerState(false);
      } else if (JMSAlarmMessage.TEXT_STATE_MAINTENANCE.equals(text)) {
        timeout_timer.reset();
        action = new UpdateAction(AlarmUpdateInfo.fromMapMessage(message));
        model.updateServerState(true);
      }
      // Idle messages in absence of 'real' traffic?
      else if (JMSAlarmMessage.TEXT_IDLE.equals(text)) {
        timeout_timer.reset();
        model.updateServerState(false);
      } else if (JMSAlarmMessage.TEXT_IDLE_MAINTENANCE.equals(text)) {
        timeout_timer.reset();
        model.updateServerState(true);
      }
      // Enable/disable?
      else if (JMSAlarmMessage.TEXT_ENABLE.equals(text)) {
        timeout_timer.reset();
        final String name = message.getString(JMSLogMessage.NAME);
        action = new EnableAction(name, true);
      } else if (JMSAlarmMessage.TEXT_DISABLE.equals(text)) {
        timeout_timer.reset();
        final String name = message.getString(JMSLogMessage.NAME);
        action = new EnableAction(name, false);
      }
      // Configuration change
      else if (JMSAlarmMessage.TEXT_CONFIG.equals(text)) {
        final String name = message.getString(JMSLogMessage.NAME);
        model.readConfig(name);
      }
      // Debug trigger
      else if (JMSAlarmMessage.TEXT_DEBUG.equals(text)) model.dump();

      if (action == null) return;
      // Queue or dispatch?
      synchronized (queue) {
        if (use_queue) {
          queue.execute(action);
          return;
        }
      }
      // else: Not using queue, and queue no longer locked
      action.run();
    } catch (Throwable ex) {
      Activator.getLogger().log(Level.SEVERE, "Message handler error", ex);
    }
  }
 /**
  * Create message initialized with basic alarm & application info
  *
  * @param text TEXT property
  * @return MapMessage
  * @throws Exception on error.
  */
 private MapMessage createMapMessage(final String text) throws Exception {
   final MapMessage map = createMapMessage();
   map.setString(JMSLogMessage.TYPE, JMSAlarmMessage.TYPE_ALARM);
   map.setString(JMSAlarmMessage.CONFIG, model.getConfigurationName());
   map.setString(JMSLogMessage.TEXT, text);
   map.setString(JMSLogMessage.APPLICATION_ID, APPLICATION);
   map.setString(JMSLogMessage.HOST, host);
   User loggedUser = SecurityFacade.getInstance().getCurrentUser();
   if (loggedUser == null) // if no user logged in...
   user = System.getProperty("user.name"); // $NON-NLS-1$
   else user = loggedUser.getUsername();
   map.setString(JMSLogMessage.USER, user);
   return map;
 }
 @Override
 protected void timeout() {
   model.fireServerTimeout();
 }