@MessageDriven не работает в JBoss AS 5 - PullRequest
0 голосов
/ 27 июля 2011

Код, указанный ниже, выдает javax.naming.NameNotFoundException.Я думаю, что это может быть какая-то проблема с JBoss AS 5.

package web;
import java.util.Properties;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.jms.TextMessage;
import javax.naming.InitialContext;

import org.jboss.jms.server.connectionfactory.ConnectionFactory;

public class MyMDBClient {

    public static void main(String[] args) {
        QueueConnection cnn = null;
        QueueSender sender = null;
        QueueSession session = null;
        InitialContext ctx;
        try {
            Properties props = new Properties();
            props.setProperty("java.naming.factory.initial",
                    "org.jnp.interfaces.NamingContextFactory");
            props.setProperty("java.naming.factory.url.pkgs",
                    "org.jboss.naming");
            props.setProperty("java.naming.provider.url", "127.0.0.1:1099");

            ctx = new InitialContext(props);
            Queue queue = (Queue) ctx.lookup("jms/txt");
            QueueConnectionFactory factory = (QueueConnectionFactory)new ConnectionFactory();
            cnn = factory.createQueueConnection();
            session = cnn.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);
            TextMessage msg = session.createTextMessage("Hello World");
            sender = session.createSender(queue);
            sender.send(msg);
            System.out.println("Message sent successfully to remote queue.");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

и mdb:

package web;

import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.jms.Message;
import javax.jms.MessageListener;

@MessageDriven(mappedName="jms/txt",
        activationConfig = { @ActivationConfigProperty(
                propertyName = "destinationType", propertyValue = "javax.jms.Queue"
        ) })
public class FirstMDB implements MessageListener {

    public void onMessage(Message message) {


    }

}

, если я создам это на сервере лично?автоматически созданный с помощью этого обозначения ?? не верно?

Ответы [ 2 ]

0 голосов
/ 28 июля 2011

nameNotFoundException указывает, что имя, которое вы пытаетесь найти в JNDI, не существует. Таким образом, либо у вас вообще нет определенной очереди, либо вы используете неправильное имя.

Можете ли вы показать XML-файл, в котором вы определяете очередь?

Кроме того, как указывает Наян, свойство destination отсутствует. Это обязательно. Кроме того, использование вами атрибута аннотации mappedName здесь совершенно неверно и должно быть опущено. Кроме того, поскольку MDB использует управляемые контейнером транзакции по умолчанию, acknowledgeMode игнорируется и, следовательно, указывать не нужно.

Код должен выглядеть так:

@MessageDriven( 
    activationConfig = {        
        @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"), 
        @ActivationConfigProperty(propertyName = "destination", propertyValue = "/queue/yourQueue") 
    }
)
public class FirstMDB implements MessageListener {

    public void onMessage(Message message) {    

    }    
}

Что касается вашего клиента, обычно вам также нужно найти ConnectionFactory из удаленного JNDI и не забыть закрыть полученное от него соединение. Для JBoss AS 5.x и 6.x имя этой фабрики JNDI просто /ConnectionFactory.

В качестве идиоматического примера отправки сообщения JMS:

ConnectionFactory factory = getFactoryFromJNDI();
Connection connection = null;
try {
    try {
        connection = factory.createConnection();

        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);            
        Destination destination = getDestinationFromJNDI();

        MessageProducer sender = session.createProducer(destination);    
        Message message = session.createTextMessage("Hello World");

        sender.send(message);        
    }
    finally {
        if (connection != null) {
            connection.close();
        }
    }
}
catch (JMSException e) {
    // ...
}

Где getFactoryFromJNDI() и getDestinationFromJNDI() просто переносят код поиска JNDI.

0 голосов
/ 27 июля 2011

Отсутствует destinationName, который указывает, для какой темы / очереди MDB будет прослушивать сообщения.

@MessageDriven(mappedName = "jms/txt", activationConfig =  {
        @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
        @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
        @ActivationConfigProperty(propertyName = "destinationName", propertyValue = "jms/txt")
    }   
)

Также проверьте , создана ли конкретная очередь на сервере в консоли администратора, поиск не выполняется.

...