// 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(); }