2008-09-15 7 views
2

간단한 AJAX 서블릿을 사용하여 JMS (ActiveMQ)를 말하고 사이트를 업데이트하는 주제에서 메시지가 도착할 때 사이트를 구축합니다.JMS (ActiveMQ) 및 OnMessage와 통신하는 서블릿 작성

데이터 용 XMLHttpRequest를 만드는 Javascript가 있습니다. Servlet은 Get Request를 처리하고 JSON을 다시 보냅니다. 그러나 내 서블릿을 ActiveMQ Message Broker에 연결하는 방법을 모른다. 지금 바로 더미 데이터를 보냅니다.

나는 Servelt가 messagelistener를 구현해야한다고 생각하고 있습니다. 그런 다음 onMessage는 데이터를 JavaScript 페이지로 보냅니다. 하지만 어떻게해야할지 모르겠습니다.

답변

2

서블릿이 MessageListener를 서블릿 동기이며, MessageListeners 비동기 있다는 것입니다 구현하는 데에 대한 문제. 그 대신 메시지가 들어올 때 MessageListener로 작동하고 어딘가에 어떤 상태 (데이터베이스 또는 JMX MBean 또는 Stateful Session EJB)를 업데이트 할 다른 객체를 만들어야합니다. 그런 다음 서블릿은 상태를 쿼리하여보고 할 데이터가 있는지 확인합니다 다시 클라이언트로 돌아가고 웹 페이지는 정기적으로 서블릿에 ping을 실행하여 새로운 데이터를 요청할 수 있습니다.

+0

고맙습니다 jodonnell .. JMX MBean이나 Stateful Session EJB를 작성한 적이 없지만 빠른 google 검색 후에는 이것이 올바른 경로라고 생각합니다. 도와 주셔서 감사합니다. –

0

당신은 아마 다음과 같이 JNDI에서 JMS 연결을 얻을 필요가 :

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); 
+0

좋아요 ... 이것은 내 주제에 연결하는 좋은 방법입니다. 감사합니다. 나는 이미 다른 Java 클라이언트와 같은 코드를 가지고있다. 그러나 Servelt가 messagelistener를 구현하기를 바랍니다. 그런 다음 onMessage는 데이터를 Javascript 페이지로 보냅니다. –

1

ActiveMQ Ajax support에 링크 된 this question에 대한 답변을 읽으려고 했습니까? 기본적으로 ActiveMQ는 Ajax를 기본적으로 지원하므로 JavaScript 라이브러리를 사용하여 ActiveMQ 주제에서 직접 가입 할 수 있습니다.

또한 제임스 스트라 칸이 말한대로 ActiveMQ를

2

와 Ajax를 사용하여 실시간 채팅 또는 실시간 주식 포트폴리오 스크린 등의 작업을 수행하는 방법을 보여 ActiveMQ web samples 참조 - http://activemq.apache.org/ajax.html가 이상적입니다 아웃 - 오브 - 박스 솔루션 너의 문제.

이러한 솔루션을 수동으로 생성하려면 Ajax 서블릿에서 JMS 연결 (요청 당 연결)을 만들면됩니다. 이런 이유로 Spring JMS 템플릿을 사용해보십시오 (http://static.springsource.org/spring/docs/2.5.x/reference/jms.html). 그런 다음 Servlet doGet/doPost 메소드에서 메시지를 수신하십시오. 이 경우 수신에 대한 낮은 시간 초과 값을 고려하십시오. 이러한 솔루션은 대기열 및 내구성 주제에 대해 작동합니다.

내구성이없는 항목에 대해서는 외부 메시지 수신기를 고려하십시오.

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

lastTenUpdatesCacheMesssageListener을 구현하는 싱글 톤 빈 될 것입니다 : 봄 MessageListenerContainer은 그 목적을위한 훌륭한 도구입니다. 이 빈은 최근 10 개의 메시지를 캐싱 (java.util 목록에 넣기) 할 책임이있다. 그것은 Ajax 서블릿에 삽입 될 것이므로 doGet/doPost 메소드에서 주제로 보낸 마지막 10 개의 메시지를 요청할 수 있습니다.