Jboss Messaging JMS - PullRequest
       29

Jboss Messaging JMS

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

Мне удалось отправить сообщение в имя очереди ReceiverQueue на моем локальном сервере Jboss, как я могу получить сообщение, которое я ему отправил, или как проверить, есть ли какие-либо сообщения в очереди, если они были получены. или я могу получить какое-то объяснение, как лучше всего это сделать. Спасибо

Будет также принят рабочий учебник отправки / получения. Все, что заставит меня просто отправить в очередь и получить сообщение из этой очереди, получит принятый ответ.

Я использую Spring.

Я хочу решение, которое делает это, используя контекст приложения с внедрением бина ..

Ответы [ 4 ]

5 голосов
/ 19 марта 2010

Стандартные шаги API JMS:
1. Создайте javax.naming.Context с деталями доступа к серверу

context = new InitialContext(environment)

2. Посмотрите javax.jms.QueueConnectionFactory в контексте. Название фабрики относится к JMS-серверу

factory = (QueueConnectionFactory)context.lookup(factoryName)

3. Создайте javax.jms.QueueConnection

connection = factory.createQueueConnection(...)

4. Создайте javax.jms.QueueSession

session = connection.createQueueSession(...)

5. Найдите свой javax.jms.Queue в контексте

queue = (Queue) context.lookup(qJndiName)

До сих пор это то же самое, что отправка ....
6. Создайте javax.jms.QueueReceiver с сеансом

receiver = session.createReceiver(queue)

7. JMS API предоставляет 2 способа получения сообщения:
7.a Ждать сообщения одним из методов receiver.receive()
7.b Реализуйте javax.jms.MessageListener в своем классе и зарегистрируйте его в качестве слушателя

receiver.setMessageListener(this)

JMS API будет вызывать ваш метод onMessage() всякий раз, когда приходит новое сообщение
8. Не забудьте запустить слушатель:

connection.start()

9. Закройте контекст (очень важно при доступе к нескольким JMS-серверам из одной и той же программы):

context.close()

Выше приведено типичное решение из автономного приложения. В среде EJB вы должны использовать бины, управляемые сообщениями. Вы можете найти ino на них на http://java.sun.com/javaee/6/docs/tutorial/doc/gipko.html и учебник на http://schuchert.wikispaces.com/EJB3+Tutorial+5+-+Message+Driven+Beans

Вот рабочий пример, который вы просили:

import java.util.Hashtable;
import javax.naming.*;
import javax.jms.*;

public class JMSJNDISample implements MessageListener {

    public static final String JNDI_URL = "jnp://localhost:1099";
    public static final String JNDI_CONTEXT_FACTORY = "org.jnp.interfaces.NamingContextFactory";
    public static final String JMS_USER = null;
    public static final String JMS_PASSWORD = null;
    public static final String JMS_CONNECTION_FACTORY = "MyConnectionFactory";
    public static final String QUEUE_JNDI_NAME = "ReceiverQueue";

    QueueConnection qConn = null;
    QueueSession qSession = null;
    QueueSender qSender = null;
    QueueReceiver qReceiver = null;

    public JMSJNDISample () {
    }


    public void init() throws JMSException, NamingException {
        // Set up JNDI Context
        Hashtable env = new Hashtable();
        env.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_CONTEXT_FACTORY);
        env.put(Context.PROVIDER_URL, JNDI_URL);
        if (JMS_USER != null)
            env.put(Context.SECURITY_PRINCIPAL, JMS_USER);
        if (JMS_PASSWORD != null)
            env.put(Context.SECURITY_CREDENTIALS, JMS_PASSWORD);
        Context jndiContext = new InitialContext(env);

        // Lookup queue connection factory
        QueueConnectionFactory cFactory = (QueueConnectionFactory)jndiContext.lookup(JMS_CONNECTION_FACTORY);

        // Create Connection
        if (JMS_USER == null || JMS_PASSWORD == null)
            qConn = cFactory.createQueueConnection();
        else {
            qConn = cFactory.createQueueConnection(JMS_USER, JMS_PASSWORD);
        }

        // Create Session
        qSession = qConn.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);

        // Lookup Queue
        Queue queue = (Queue) jndiContext.lookup(QUEUE_JNDI_NAME);

        // Create Queue Sender
        qSender = qSession.createSender(queue);

        // Create Queue Receiver
        qReceiver = qSession.createReceiver(queue);
        qReceiver.setMessageListener(this);

        // Start receiving messages
        qConn.start();

        // Close JNDI context
        jndiContext.close();
    }


    public void sendMessage (String str) throws JMSException {
        TextMessage msg = qSession.createTextMessage(str);
        qSender.send(msg);
    }


    public void onMessage (Message message) {
        try {
            if (message instanceof TextMessage) {
                TextMessage textMessage = (TextMessage)message;
                System.out.println("Text Message Received: "+textMessage.getText());
            } else {
                System.out.println(message.getJMSType()+" Message Received");
            }
        } catch (JMSException je) {
            je.printStackTrace();
        }
    }


    public void destroy() throws JMSException {
        if (qSender != null) qSender.close();
        if (qReceiver != null) qReceiver.close();
        if (qSession != null) qSession.close();
        if (qConn != null) qConn.close();
    }


    public static void main(String args[]) {
        try {
            JMSJNDISample sample = new JMSJNDISample();
            // Initialize connetion
            sample.init();
            // Send Message
            sample.sendMessage("Hello World");
            // Wait 2 sec for answer
            Thread.sleep(2000);
            // Disconnect
            sample.destroy();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
2 голосов
/ 19 марта 2010

Кроме прослушивания этой очереди MessageDrivenBean?

EDIT: Вы используете пружину только для создания полезной нагрузки, верно? JMS - это спецификация JavaEE. Вам не нужно использовать Spring для фактической отправки / получения сообщений. Вам не нужно вручную проверять наличие сообщений в очереди и т. Д. Все, что вам нужно сделать, это настроить MDB (MessageDrivenBean) следующим образом:

@MessageDriven(activationConfig = {
      @ActivationConfigProperty(
          propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
      @ActivationConfigProperty(
          propertyName = "destination", propertyValue = "queue/myqueue")
     })
public class MyMessageDrivenBean implements MessageListener {
     public void onMessage(Message message) {
         ObjectMessage objMsg = (ObjectMessage) message;
         Payload payload = (Payload)objMsg.getObject();
         //do stuff
}

}

А затем отправьте несколько сообщений JMS.

@Stateless
public class QueuerBean implements QueuerLocal {

    @Resource(mappedName = "java:/JmsXA")
    private ConnectionFactory jmsConnectionFactory;
    @Resource(mappedName = "queue/myqueue")
    private Queue queue;

    private void queue(MyPayload payload) {
        try {
            Connection connect = jmsConnectionFactory.createConnection();
            Session session = connect.createSession(false,
                Session.DUPS_OK_ACKNOWLEDGE);
            MessageProducer producer = session.createProducer(queue);
            // create a JMS message and send it
            ObjectMessage objMsg = session.createObjectMessage(payload);
            producer.send(objMsg);
            producer.close();
            session.close();
            connect.close();
        } catch (JMSException e) {
            log.error("Bad thing happened", e);
        }
    }
}

Очередь настроена аннотацией. Когда сообщение отправлено, JBoss автоматически активирует MDB.

1 голос
/ 23 марта 2010

Вот пример , показывающий, как настроить управляемый сообщениями POJO в Spring. Я бы порекомендовал следовать этой идиоме, если вы уже используете Spring.

Что касается части о том, сколько сообщений находится в очереди, я бы сказал, что вы должны использовать консоль администратора для JBOSS, а не свой код.

0 голосов
/ 27 марта 2010

Я бы порекомендовал также использовать такой инструмент, как HermesJMS (http://www.hermesjms.com/confluence/display/HJMS/Home), для проверки диспетчера очереди и очередей. Это отличный инструмент для отладки.

...