Статьи

MessageAlerts в JBossESB 4.7


JBossESB 4.7 включает в себя несколько замечательных новых функций. В этой статье я хотел выделить функцию, которая может помочь вам определить, не засоряет ли какой-либо из ваших сервисов или действий.

Новая функция «MessageAlerts» (org.jboss.soa.esb.listeners.message.MessageAlerts). Эта функция позволяет собирать точную информацию о времени обработки или количестве байтов, которые требуется конкретной службе или конкретному действию в службе для обработки одного сообщения.

Вы используете MessageAlerts, определяя время обработки и общие пороговые значения для каждого сервиса и / или действия. Когда соответствующая служба или действие требует больше времени, чем определенный временной интервал, для обработки сообщения, ПРЕДУПРЕЖДЕНИЕ записывается в журнал сервера и становится доступным в консоли JMX. Пороги определяются с помощью следующих свойств:

alertTimeThreshold = «420»

alertLengthThreshold = «10»

Порог, связанный со временем, измеряется в миллисекундах. Порог, связанный с длиной, измеряется в байтах.

Когда бы вы использовали общий порог байтов? Это может быть полезно, если, например, отслеживаемая служба или действие выполняет преобразования и внезапно начинает обрабатывать больше байтов, чем вы ожидаете.

Пример в быстром запуске

Функция MessageAlerts демонстрируется в кратком руководстве, названном, соответственно, «messagealert». Если вы когда-либо запускали быстрый запуск «helloworld», то этот быстрый запуск должен быть знакомым. Единственными изменениями являются добавление класса действия org.jboss.soa.esb.samples.quickstart.messagealerts.DelayAction (как вы можете догадаться по названию, этот класс вводит задержку, которая приводит к достижению alertTimeThreshold, и изменения в файле jboss-esb.xml, указанном ниже:

   <services>
<service
category="FirstServiceESB"
name="SimpleListener"
description="Hello World"
alertTimeThreshold="420"
alertLengthThreshold="10"
>
<listeners>
<jms-listener name="JMS-Gateway"
busidref="quickstartGwChannel"
is-gateway="true"
/>
<jms-listener name="helloWorld"
busidref="quickstartEsbChannel"
/>
</listeners>
<actions mep="OneWay">
<action name="action1"
class="org.jboss.soa.esb.samples.quickstart.messagealerts.MyJMSListenerAction"
process="displayMessage"
/>
<action name="action2" class="org.jboss.soa.esb.actions.SystemPrintln">
<property name="printfull" value="false"/>
</action>
<action name="action3"
class="org.jboss.soa.esb.samples.quickstart.messagealerts.DelayAction"
process="delayMessage"
alertTimeThreshold="30"
alertLengthThreshold="50">
</action>
</actions>
</service>
</services>

Изменения, связанные с MessageAlerts:

  • Строки 6-7: они устанавливают пороги обслуживания на 420 миллисекунд по времени и 10 байтов по длине.
  • Строки 29-30: И они устанавливают пороги действия на 30 миллисекунд по времени и 50 байтов по длине.

Когда мы внедряем и запускаем быстрый запуск, в server.log записывается следующее:

 22:00:28,833 INFO [STDOUT] &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
22:00:28,837 INFO [STDOUT] Body: Message Alerts
22:00:28,837 INFO [STDOUT] &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
22:00:28,850 INFO [STDOUT] Message structure:
22:00:28,850 INFO [STDOUT] [Message Alerts].
22:00:31,852 WARN [ServiceMessageCounter] jboss.esb:category=MessageCounter,deployment=Quickstart_messagealerts.esb,service-category=FirstServiceESB,service-name=SimpleListener service, action3 action alert time 3001 took longer than 30 ms
22:00:31,853 WARN [ServiceMessageCounter] jboss.esb:category=MessageCounter,deployment=Quickstart_messagealerts.esb,service-category=FirstServiceESB,service-name=SimpleListener service, action3 action message size 2960 was larger than 50 bytes
22:00:31,853 WARN [ServiceMessageCounter] jboss.esb:category=MessageCounter,deployment=Quickstart_messagealerts.esb,service-category=FirstServiceESB,service-name=SimpleListener service alert time 3007 took longer than 420 ms
22:00:31,854 WARN [ServiceMessageCounter] jboss.esb:category=MessageCounter,deployment=Quickstart_messagealerts.esb,service-category=FirstServiceESB,service-name=SimpleListener service message size 2960 was larger than 10 bytes

И та же информация доступна в журнале JMX в jboss.esb, service = MessageAlerts:
как вы можете видеть на этом скриншоте, вы можете сбросить счетчики через консоль JMX. (И да, как вы также можете видеть на этом снимке экрана, я слишком поздно ложусь спать и пишу об этом материале.)
Вы также можете получить доступ к той же информации непосредственно из mbean jboss.esb:

sh ./twiddle.sh get "jboss.esb:service=MessageAlerts"

И, за дополнительную плату, вы можете получить доступ к службе MessageAlerts программно. Для этого, во-первых, мы изменим файл быстрого запуска jboss-esb.xml, чтобы переместить действие, которое печатает информацию, в журнал сервера, чтобы оно произошло после задержки (и, следовательно, после генерации MessageAlerts).

Затем мы заменим код в MyJMSListenerAction.java следующим образом:

   package org.jboss.soa.esb.samples.quickstart.messagealerts;  

import org.jboss.soa.esb.actions.AbstractActionLifecycle;
import org.jboss.soa.esb.helpers.ConfigTree;
import org.jboss.soa.esb.message.Message;

import javax.management.ObjectName;
import javax.management.MBeanServer;
import javax.management.MalformedObjectNameException;

import org.jboss.mx.util.MBeanProxyExt;
import org.jboss.mx.util.MBeanServerLocator;
import org.jboss.soa.esb.actions.AbstractActionPipelineProcessor;
import org.jboss.soa.esb.actions.ActionProcessingException;

import java.util.Vector;

public class MyJMSListenerAction extends AbstractActionLifecycle
{

protected ConfigTree _config;

public MyJMSListenerAction(ConfigTree config) { _config = config; }

public Message displayMessage(Message message) throws Exception{

MBeanServer server = org.jboss.mx.util.MBeanServerLocator.locateJBoss();
Vector theAlertsVector = (Vector)server.getAttribute(new ObjectName("jboss.esb:service=MessageAlerts"), "Alerts");

for (int i = 0; i < theAlertsVector.size(); i++ ) {
System.out.println("******Data returned from MessageAlert[" + i + "] = " + theAlertsVector.elementAt(i) + "\n" );
}

System.out.println("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");
System.out.println("Body: " + message.getBody().get()) ;
System.out.println("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");
return message;
}

}
  • Строка 27: находит MBeanServer — это легко, так как мы работаем в той же JVM, что и сервер
  • Строка 28: извлекает вектор MessageAlerts из службы MessageAlerts jboss.esb
  • Строки 30-33: и распечатывает их

Заключение Мысли Возможность создавать свои собственные сервисы и пользовательские действия с JBossESB является одной из характеристик его общей гибкости. С помощью MessageAlerts вы можете легче отслеживать эффективность этих служб и действий на детальном уровне. Функция оповещения о сообщениях делает это простым.

Благодарности

Спасибо Тому Каннингему за его вклад в этот пост и его терпеливые ответы на многие мои вопросы!