Где или когда это подходящее время для вызова метода setMessageListener для TopicSubscriber? - PullRequest
3 голосов
/ 23 марта 2012

Я пытаюсь подписаться на Topic, используя TopicSubscriber. На это TopicSubscriber я пытаюсь присвоить MessageListener. Я добавил код ниже в метод init() сервлета, который загружается при запуске сервера:

String destName = "topic/userManagementTopic";
TopicConnectionFactory connectionFactory = null;
TopicConnection connection = null;
TopicSession session = null;
Topic topic = null;
InitialContext jndiContext = BlaBla.magicallyBuildTheCorrectInitialContext("userManagementTopic");
connectionFactory = (TopicConnectionFactory)jndiContext.lookup("java:/JmsXA");

topic = (javax.jms.Topic)jndiContext.lookup(destName);

connection = (TopicConnection)connectionFactory.createConnection("topicUser", "topicPwd");
session = (TopicSession)connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
connection.start();
TopicSubscriber recv = session.createSubscriber(topic);
recv.setMessageListener(new UserManagementTopicListener());

Проблема в том, что я никогда не прошёл последнюю строчку, потому что получил

javax.jms.IllegalStateException: This method is not applicable inside the application server. See the J2EE spec

Я пытался применить рекомендованное мной исправление, найденное в Интернете, добавив <config-property name="Strict" type="java.lang.Boolean">false</config-property> к моему jms-ds.xml, но это не исправит.

Итак, как еще можно подписаться на тему и указать желаемое MessageListener?

Я использую jboss-5.1.0.GA, и мое приложение основано на Struts.

Спасибо, что прочитали это.

Позднее редактирование: я преодолел исключение, используя "java:/ConnectionFactory" для соединения. Теперь это еще лучше, у меня нет ошибок, и слушатель не будет обрабатывать сообщения. Я получаю сообщения только тогда, когда добавляю к ним MDB-аннотации, но я не хочу использовать MDB. И что теперь?

Позже отредактируйте 2: Я сделал это, привязав слушателя следующим образом:

String destName = "managementTopic";
Context jndiContext = null;
ConnectionFactory connectionFactory = null;
Connection connection = null;
Session session = null;
Destination dest = null;
MessageConsumer consumer = null;
ManagementTopicListener listener = null;
try {
    ref = BlaBla.magicallyBuildTheCorrectInitialContext(destName);

    jndiContext = ref.ctx;

    connectionFactory = connectionFactory = (ConnectionFactory)jndiContext.lookup("XAConnectionFactory");

    dest = (Topic)jndiContext.lookup("topic/" + destName);

    connection = connectionFactory.createConnection(ref.getPrinciple(), ref.getCredentials());
    session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
    consumer = session.createConsumer(dest);

    listener = new ManagementTopicListener();
    consumer.setMessageListener(listener);

    connection.start();
    //very important to never close this connection for as long as you want to receive messages
} catch (Exception e) {
    System.out.println("kaboom " + e.getStackTrace());
    if (connection != null) {
        try {
            connection.close();
        } catch (JMSException ex) {
            System.out.println("exc " + ex.getLinkedException());
        }
    }
}
...