اكتب Servlet الذي يتحدث إلى JMS (ActiveMQ) وقم بتحديث الموقع بواسطة OnMessage

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

سؤال

أقوم بإنشاء موقع يستخدم AJAX Servlet بسيطًا للتحدث مع JMS (ActiveMQ) وعندما تصل رسالة من الموضوع لتحديث الموقع.

لدي Javascript يقوم بإنشاء XMLHttpRequest للبيانات.يعالج Servlet طلب الحصول ويرسل JSON مرة أخرى.ومع ذلك، ليس لدي أي فكرة عن كيفية توصيل Servlet الخاص بي بـ ActiveMQ message Broker الخاص بي.إنه يرسل فقط بيانات وهمية في الوقت الحالي.

أعتقد أن سيرفيلت يجب أن ينفذ مستمع الرسائل.ثم يقوم onMessage بإرسال البيانات إلى صفحة JavaScript.لكنني لست متأكدا من كيفية القيام بذلك.

هل كانت مفيدة؟

المحلول

المشكلة في وجود تطبيق servlet لتطبيق messageListener هو أن servlet متزامنة وMessageListeners غير متزامنة.بدلاً من ذلك، يجب عليك إنشاء كائن آخر ليكون بمثابة messageListener وتحديث بعض الحالات في مكان ما (ربما قاعدة بيانات أو JMX MBean أو Stateful Session EJB) عندما تصل الرسائل.بعد ذلك، يمكن لـ servlet الاستعلام عن تلك الحالة لمعرفة ما إذا كانت هناك بيانات لإبلاغ العميل بها، ويمكن لصفحة الويب الخاصة بك اختبار اتصال servlet بشكل دوري لطلب بيانات جديدة.

نصائح أخرى

كما يقول جيمس ستراشان - http://activemq.apache.org/ajax.html هو الحل المثالي الجاهز لمشكلتك.

إذا كنت لا تزال ترغب في إنشاء مثل هذا الحل يدويًا، فيمكنك فقط إنشاء اتصال JMS في Ajax servlet (اتصال لكل طلب).فكر في استخدام قالب Spring JMS لهذا السبب ( http://static.springsource.org/spring/docs/2.5.x/reference/jms.html ).ثم فقط استلم الرسالة بطريقة Servlet 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 servlet الخاص بك، لذلك في طريقة doGet/doPost يمكنك سؤاله عن آخر 10 رسائل تم إرسالها إلى الموضوع.

هل حاولت قراءة الإجابات ل هذا السؤال الذي يرتبط ب دعم ActiveMQ اياكس.يحتوي 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