Как удалить сообщения из темы JBoss JMS? - PullRequest
0 голосов
/ 26 мая 2009

Я сконфигурировал свою тему в jbossmq-Destination-Service.xml следующим образом:

<mbean code="org.jboss.mq.server.jmx.Topic"
    name="jboss.mq.destination:service=Topic,name=myTopicName">
  <depends optional-attribute-name="DestinationManager">
           jboss.mq:service=DestinationManager</depends>
  <depends optional-attribute-name="SecurityManager">
           jboss.mq:service=SecurityManager</depends>
  <attribute name="SecurityConf">
    <security>
      <role name="guest" read="true" write="true" create="true"/>
      <role name="publisher" read="true" write="true" create="false"/>
      <role name="durpublisher" read="true" write="true" create="true"/>
    </security>
  </attribute>
</mbean>

Я могу легко подключиться к теме, чтобы публиковать сообщения, выполнив JNDI-поиск по названию темы, и все работает нормально.

Однако я хочу иметь возможность очищать сообщения через определенные промежутки времени, поскольку они могут устареть в зависимости от некоторых других функций системы, но я не могу найти никаких примеров или объяснений того, как это сделать.

Проблема в том, что когда я выполняю JNDI-поиск по теме, он возвращает org.jboss.mq.SpyTopic, который не имеет никакой функциональности для удаления сообщений или даже для определения количества сообщений в теме. Все примеры показывают, что org.jboss.mq.server.JMSTopic обладает всеми функциями, но я не могу понять, как преобразовать SpyTopic в JMSTopic или как настроить тему, чтобы поиск JNDI возвращал JMSTopic.

Может кто-нибудь помочь?
Спасибо.

1 Ответ

0 голосов
/ 27 мая 2009

Наконец, после долгих поисков, я нашел этот метод.

public static void removeAllMessagesFromTopic(String topicName)
{
    try
    {
        //==============================================================
        // Set up the name of the topic object.
        // Alternative way:
        // objName = new ObjectName(
        //     "jboss.mq.destination:service=Topic,name=" + topicName);
        //==============================================================
        String domain = "jboss.mq.destination";
        Hashtable<String, String> keys = new Hashtable<String, String>();
        keys.put("service", "Topic");
        keys.put("name", topicName);
        ObjectName objName = new ObjectName(domain, keys);

        //==============================================================
        // Get the MBean server
        //==============================================================
        MBeanServer server = (MBeanServer)MBeanServerFactory
                .findMBeanServer(null).iterator().next();

        //==============================================================
        // Invoke the MBean
        //==============================================================
        Integer msgCount = (Integer)server.getAttribute(objName, "AllMessageCount");

        log.debug("Invoking removeAllMessages. (" + msgCount + "messages)");

        server.invoke(objName, "removeAllMessages",
                new Object[] {},  // No paramaters needed for removeAllMessages
                new String[] {});

        log.debug("Messages removed.");
    }
    catch (Exception ex)
    {
        log.error("Failed to remove messages from topic. Exception: " + ex);
        ex.printStackTrace();
    }

}
...