Статьи

Конфигурирование MDP и управление им с и без JMX

Этот совет демонстрирует, как создавать и развертывать MDP и как управлять им, используя как встроенные в Spring механизмы управления компонентами, так и JMX.

сценарий

У нас есть несколько слушателей JMS в нашем приложении. После того, как наше оборудование было перенесено в сетку виртуальных машин, мы хотим, чтобы эта функция включала и отключала прослушиватели на виртуальных машинах и перераспределяла прослушиватели на виртуальные машины через сетку по требованию, чтобы наилучшим образом использовать Ресурсы.

Сфера

Этот совет кратко описывает настройку MDP, а также его включение и выключение.

Концепции

— Что такое MDP?
MDP расшифровывается как Pojo, управляемое сообщениями

В мире EJB у нас есть MDB (Message Driven Beans). Это стандартные компоненты JEE, которые настроены на сервере и действуют как прослушиватель сообщений.

Spring предоставляет MDP в качестве ответа на MDB.

Некоторые полезные ссылки:

Создание простого компонента Spring MDP и управление им с помощью контейнера Spring обеспечивали методы «start» и «stop»

Конфигурация MDP Spring

Извлечь из XML-файла Spring Config spring_context_jms.xml

 

<!-- Destination configuration -->
<bean id="sample_queue"
class="org.apache.activemq.command.ActiveMQQueue"
autowire="constructor">
<constructor-arg>
<value>SAMPLE.QUEUE</value>
</constructor-arg>
</bean>

<!-- Message Listener Container configuration -->
<bean id="sample_jmsContainer"
class="org.springframework.jms.listener.DefaultMessageListenerContainer102">
<property name="connectionFactory"
ref="activeMqQueueConnectionFactory" />
<property name="destination" ref=" sample_queue" />
<property name="messageListener"
ref="sample_messageListener" />
</bean>

<!-- Message Driven POJO (MDP) configuration -->
<bean id="sample_messageListener"
class="jmsexample.ExampleListener">
<property name="listener" ref="sample_jmsContainer" />
</bean>

Образец создаваемого нами класса (sample_messageListener класса «jmsexample.ExampleListener») должен расширять javax.jms.MessageListener и реализовывать метод «onMessage».

Как видно из конфигурации Spring выше, мы предоставили это как ссылку на свойство «messageListener» в классе «DefaultMessageListenerContainer102».

Также, как показано выше, мы предоставили ссылку на «sample_jmsContainer» в компоненте «sample_messageListener». (Это сделано для того, чтобы мы могли представить его с помощью JMX — как будет обсуждаться далее).

Настройка компонентов Spring в веб-приложении в Tomcat

MDP развертываются в веб-приложении как JMSWebApplication.war.
Ниже приводится выдержка из web.xml

<display-name>JMSWebApplication</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
</welcome-file-list>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring_context.xml</param-value>
</context-param>
<listener>
<description>Context Loader Listener</description>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>

Получение дескриптора компонента «Listener Container» в Spring и вызов для него запуска и остановки (не-JMX)

Ниже приведена соответствующая выдержка из jsp клиента:

<%@page import="org.springframework.beans.factory.BeanFactory,org.springframework.context.ApplicationContext,org.springframework.context.support.ClassPathXmlApplicationContext,org.springframework.jms.listener.DefaultMessageListenerContainer102,org.springframework.web.context.WebApplicationContext,org.springframework.web.context.support.WebApplicationContextUtils"%>

ServletContext context = application
.getContext("/JMSWebApplication");
WebApplicationContext wac = WebApplicationContextUtils
.getRequiredWebApplicationContext(context);

DefaultMessageListenerContainer102 listener = (DefaultMessageListenerContainer102) wac
.getBean("sample_jmsContainer");

listener.stop();
//listener.start();
   

Предоставление и контроль компонента Listener с помощью Spring JMX

Это включает в себя настройку Spring JMX. Поскольку он развернут в Tomcat, мы включим JMX в Tomcat и подключимся к нему с помощью jconsole для управления этим компонентом.

Настройка Spring JMX (сервер / контейнер) и Предоставление компонента в JMX

<bean id="exporter"
class="org.springframework.jmx.export.MBeanExporter">
<property name="beans">
<map>
<entry key="bean:name=sample_listener_jmx"
value-ref=" sample_messageListener" />
</map>
</property>
</bean>

Аргументы Tomcat для включения JMX

Предоставьте эти (не требующие пояснений) аргументы JVM при запуске Tomcat

-Dcom.sun.management.jmxremote.port=10088 \
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.authenticate=false \

Кодовый скелет jmsexample. ExampleListener

(Обратите внимание на методы «startListener» и «stopListener» и использование класса «DefaultMessageListenerContainer102».)

package jmsexample;
< imports come here ... >

public class ExampleListener implements MessageListener {

private DefaultMessageListenerContainer102 listener;
< other variables here ... >

public void onMessage(Message message) {

< Business Logic here ... >

}

@ManagedAttribute(description = "Starts the Listener", currencyTimeLimit = 15)
public void startListener() {

System.out.println("Starting listener");
getListener().start();
System.out.println("listener started " + getListener().isRunning());
}

@ManagedAttribute(description = "Stops the Listener", currencyTimeLimit = 15)
public void stopListener() {

System.out.println("Stopping listener");
getListener().stop();
System.out.println("listener stopped " + getListener().isRunning());
}

public DefaultMessageListenerContainer102 getListener() {
return listener;
}

public void setListener(DefaultMessageListenerContainer102 listener) {
this.listener = listener;
}

< other methods here ...>
}

 

   

Просмотр в JConsole управления компонентом

(Обратите внимание на открытые методы «startListener» и «stopListener»)
Здесь, например, строка удаленного подключения: service: jmx: rmi: /// jndi / rmi: // localhost: 10088 / jmxrmi

Простой клиент на основе Java, использующий Tomcat JMX для управления компонентами

Фрагмент кода клиента и его конфигурация

String address =
"service:jmx:rmi:///jndi/rmi://localhost:10088/jmxrmi";
JMXServiceURL serviceURL = new JMXServiceURL(address);
Map<String, Object> environment = null;
JMXConnector connector = JMXConnectorFactory.connect(serviceURL,
environment);
MBeanServerConnection mBeanConnection = connector
.getMBeanServerConnection();

ObjectName exampleServiceName = ObjectName
.getInstance("bean:name=sample_listener_jmx");

mBeanConnection.invoke(exampleServiceName, "startListener", null, null);
//mBeanConnection.invoke(exampleServiceName, "stopListener", null, null);

С http://viralpatel.net/blogs