Список всех очередей JMS в Tibco EMS

Я пишу класс Java для просмотра JMS-сервера Tibco EMS и отображения всех очередей. Я могу без проблем подключаться и просматривать определенные очереди, но я ищу способ вернуть список всех очередей (если возможно, с глубиной очереди). Я не согласен, если есть специальный API EMS, поэтому я использую стандартную JMS.

Я пробовал следующий код для обратного поиска JNDI, но он не работает.

NamingEnumeration<?> queues = context.list("");
List<String> availableQueuesNames = new ArrayList<String>();
while (queues.hasMoreElements()) {
    NameClassPair element = (NameClassPair) queues.nextElement();
    availableQueuesNames.add(element.getName());
}

Что выдает эту ошибку:

javax.naming.OperationNotSupportedException: Not supported
    at com.tibco.tibjms.naming.TibjmsContext.list(TibjmsContext.java:1018)
    at com.tibco.tibjms.naming.TibjmsContext.list(TibjmsContext.java:484)
    at javax.naming.InitialContext.list(Unknown Source)

Я немного покопался, и оказалось, что Tibco EMS не поддерживает такой просмотр JNDI. Есть ли другой способ сделать это?


person Matt    schedule 06.03.2014    source источник


Ответы (3)


Используя в качестве руководства тот же класс tibjmsServerAdministrator.java, поставляемый с Tibco (и метод addAdmin()), я смог написать код для вывода списка всех очередей:

Map<String, TibjmsAdmin> map = new HashMap<String, TibjmsAdmin>();
addAdmin(txtServer.getText(), txtUser.getText(), txtPassword.getText(), map);
_admin = new TibjmsAdmin[map.size()];
map.values().toArray(_admin);

QueueInfo[] info = _admin[0].getQueues(null);
for (int i = 0; i < info.length; i++) {
    String queueName = info[i].getName();
    if (!queueName.startsWith("$") && !queueName.startsWith(">")) {
        queues.add(queueName + ", 0");
    }
}
person Matt    schedule 10.03.2014

Я не уверен в деталях Tibco, но, может быть, он будет работать с listBindings вместо list?

Я сделал то же самое в общем виде:

List<Queue> out = new ArrayList<>();
scanJndiForQueues(out, "");

...

private void scanJndiForQueues(List<Queue> out, String path) throws NamingException {
    InitialContext context = new InitialContext();
    Object resource = context.lookup(path);
    if (isSubContext(resource)) {
        NamingEnumeration<Binding> list = context.listBindings(path);
        while (list.hasMoreElements()) {
            Binding binding = list.nextElement();
            scanJndiForQueues(out, path + "/" + binding.getName());
        }
    } else if (resource instanceof Queue) {
        out.add((Queue) resource);
    } // else ignore Topics
}

private boolean isSubContext(Object object) {
    return javax.naming.Context.class.isAssignableFrom(object.getClass());
}
person rü-    schedule 07.03.2014
comment
Это хорошая идея, и я тоже играл с listBindings(), но, к сожалению, это также дает ту же проблему javax.naming.OperationNotSupportedException: не поддерживается. - person Matt; 08.03.2014
comment
Хорошо... еще одна причина не использовать Tibco? Этот метод не помечен как необязательный. - person rü-; 11.03.2014