1

我正在编写一个 Java 类来浏览 Tibco EMS JMS 服务器并显示所有队列。我能够毫无问题地连接并浏览特定队列,但我正在寻找一种方法来返回所有队列的列表(如果可能,使用队列深度)。如果要使用特定的 EMS API,我不会,所以我使用的是标准 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。还有另一种方法可以做到这一点吗?

4

3 回答 3

2

使用 Tibco 提供的同一个类 tibjmsServerAdministrator.java 作为指南(以及 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");
    }
}
于 2014-03-10T12:55:52.477 回答
0

我不确定 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());
}
于 2014-03-07T07:09:57.987 回答
-1

不知道为什么需要列出所有 EMS 队列,但您可以使用 GEMS 工具实现这一点(以及许多其他事情)。

在tibcommunity搜索它(您将需要一个帐户),或者您可以直接从这里下载最新版本。

于 2014-03-12T04:43:47.477 回答