Использование JMX / JMS для передачи сообщения всем сеансам веб-приложения? - PullRequest
2 голосов
/ 17 февраля 2012

На моем сервере запущено веб-приложение Spring MVC. Недавно я хотел добавить функциональность, чтобы уведомить всех вошедших в систему пользователей, что их роль изменилась, чтобы они могли выйти и войти снова.

Я думал об использовании JMX, поэтому провел небольшой тест, и он работал нормально, за исключением того, что сообщение не транслировалось. Так, например, если у меня есть 2 человека, вошедших в систему, только 1 получает сообщение.

Итак, мой вопрос: возможно ли передать сообщение с JMX всем экземплярам веб-приложения (активные сеансы)?

Редактировать - используя JMS

Так что я сейчас пытаюсь с JMS, вот мой файл конфигурации:

<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">

<bean id="connectionFactory"
      class="org.apache.activemq.ActiveMQConnectionFactory">
    <property name="brokerURL" value="tcp://localhost:61616"/>
</bean>
<bean id="msgDestination"
      class="org.apache.activemq.command.ActiveMQTopic">
    <constructor-arg value="userToLogout.topic"/>
</bean>
<bean id="jmsTemplate"
      class="org.springframework.jms.core.JmsTemplate">
    <property name="connectionFactory" ref="connectionFactory"/>
    <property name="pubSubDomain" value="true"/>
    <property name="receiveTimeout" value="10000"/>
</bean>
<bean id="userNotifier"
      class="com.cap.messaging.UserNotifier">
    <property name="destination" ref="msgDestination"/>
    <property name="jmsTemplate" ref="jmsTemplate"/>
</bean>
<bean id="userNotificationListener"
      class="com.cap.messaging.UserNotificationListener">
</bean>
<bean
    class="org.springframework.jms.listener.DefaultMessageListenerContainer">
    <property name="connectionFactory" ref="connectionFactory" />
    <property name="destinationName" value="userToLogout.topic" />
    <property name="messageListener" ref="userNotificationListener" />
</bean>

Сейчас это не работает. Однако это работает, если я изменяю ActiveMQTopic на ActiveMQQueue. что мне здесь не хватает, и будет ли это работать?

1 Ответ

1 голос
/ 17 февраля 2012

Я думаю, что короткий ответ - нет. JMX - это API-интерфейс с одним соединением, который использует RMI через сокеты TCP / IP.Лучшее, что вы можете сделать, - это поочередно одноадресно передавать всем своим экземплярам или использовать потоки и отправлять их во все сеансы веб-приложений параллельно через несколько клиентских соединений JMX.

...