Напишите сервлет, который взаимодействует с JMS (ActiveMQ) и OnMessage. Обновите сайт.

StackOverflow https://stackoverflow.com/questions/64843

Вопрос

Я создаю сайт, который использует простой сервлет AJAX для общения с JMS (ActiveMQ) и при поступлении сообщения из темы для обновления сайта.

У меня есть Javascript, который создает XMLHttpRequest для данных.Сервлет обрабатывает запрос на получение и отправляет обратно JSON.Однако я понятия не имею, как подключить мой сервлет к моему брокеру сообщений ActiveMQ.Прямо сейчас он просто отправляет обратно фиктивные данные.

Я думаю, что Сервельт должен реализовать прослушиватель сообщений.Затем onMessage отправляет данные на страницу JavaScript.Но я не уверен, как это сделать.

Это было полезно?

Решение

Проблема с сервлетом, реализующим MessageListener, заключается в том, что сервлеты синхронны, а MessageListeners асинхронны.Вместо этого вам следует создать какой-то другой объект, который будет действовать как прослушиватель сообщений и где-то обновлять какое-то состояние (возможно, базу данных, JMX MBean или EJB сеанса с отслеживанием состояния) при поступлении сообщений.Затем сервлет может запросить это состояние, чтобы узнать, есть ли данные для возврата клиенту, и ваша веб-страница может периодически проверять связь с сервлетом, чтобы запросить свежие данные.

Другие советы

Как говорит Джеймс Страчан: http://activemq.apache.org/ajax.html — идеальное готовое решение вашей проблемы.

Если вы все еще хотите создать такое решение вручную, вы можете просто создать соединение JMS в своем сервлете Ajax (соединение по запросу).По этой причине рассмотрите возможность использования шаблона Spring JMS ( http://static.springsource.org/spring/docs/2.5.x/reference/jms.html ).Затем просто получите сообщение в методе doGet/doPost сервлета.В этом случае рассмотрите низкое значение тайм-аута для получения.Такое решение будет работать для очередей и длительных тем.

Для непродолжительных тем рассмотрите внешний прослушиватель сообщений.Весна MessageListenerContainer является отличным инструментом для этой цели:

<bean class="org.springframework.jms.listener.DefaultMessageListenerContainer
   <property name="connectionFactory" ref="jmsFactory"/>
   <property name="destination" ref="myTopic" />
   <property name="messageListener" ref="lastTenUpdatesCache" />
</bean>

Фасоль lastTenUpdatesCache будет реализация синглтонного компонента MesssageListener.Этот компонент будет отвечать за кэширование последних десяти сообщений (просто помещая их в список java.util).Он будет внедрен в ваш сервлет Ajax, поэтому в методе doGet/doPost вы сможете запросить его о последних 10 сообщениях, отправленных в тему.

Вы пробовали читать ответы на этот вопрос который ссылается на Поддержка ActiveMQ Ajax.По сути, ActiveMQ имеет встроенную поддержку Ajax, поэтому вы можете использовать его библиотеку JavaScript для прямой подписки на тему ActiveMQ.

Также см. Веб-примеры ActiveMQ которые показывают, как делать такие вещи, как чат в реальном времени или экраны портфеля акций в реальном времени, используя Ajax с ActiveMQ.

Вероятно, вам потребуется получить JMS-соединение от JNDI, например:

Properties props = new Properties();
props.setProperty(Context.INITIAL_CONTEXT_FACTORY,
    "org.apache.activemq.jndi.ActiveMQInitialContextFactory");
props.setProperty(Context.PROVIDER_URL,
    "tcp://hostname:61616");
javax.naming.Context ctx = new InitialContext(props);
// lookup the connection factory
javax.jms.TopicConnectionFactory factory = 
    (javax.jms.TopicConnectionFactory)ctx.lookup("ConnectionFactory");
// create a new TopicConnection for pub/sub messaging
javax.jms.TopicConnection conn = factory.getTopicConnection();
// lookup an existing topic
javax.jms.Topic mytopic = (javax.jms.Topic)ctx.lookup("MyTopic");
// create a new TopicSession for the client
javax.jms.TopicSession session = 
    conn.createTopicSession(false,TopicSession.AUTO_ACKNOWLEDGE);
// create a new subscriber to receive messages
javax.jms.TopicSubscriber subscriber = session.createSubscriber(mytopic);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top