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 вы можете легче отслеживать эффективность этих служб и действий на детальном уровне. Функция оповещения о сообщениях делает это простым.
Благодарности
Спасибо Тому Каннингему за его вклад в этот пост и его терпеливые ответы на многие мои вопросы!