Напишите сервлет, который обращается к JMS (ActiveMQ), и OnMessage обновляет сайт - PullRequest
2 голосов
/ 15 сентября 2008

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

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

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

Ответы [ 4 ]

2 голосов
/ 02 марта 2010

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

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

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

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

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

2 голосов
/ 15 сентября 2008

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

1 голос
/ 16 сентября 2008

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

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

0 голосов
/ 15 сентября 2008

Возможно, вам необходимо получить 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);
...