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.