Java 列出Tibco EMS中的所有JMS队列

Java 列出Tibco EMS中的所有JMS队列,java,jms,tibco,ems,Java,Jms,Tibco,Ems,我正在编写一个Java类来浏览Tibco EMS JMS服务器并显示所有队列。我可以毫无问题地连接并浏览特定的队列,但我正在寻找一种方法来返回所有队列的列表(如果可能,请提供队列深度)。我不知道是否有特定的emsapi可供使用,所以我使用的是标准JMS 我尝试了以下代码来执行反向JNDI查找,但失败了 NamingEnumeration<?> queues = context.list(""); List<String> availableQueuesNames = ne

我正在编写一个Java类来浏览Tibco EMS JMS服务器并显示所有队列。我可以毫无问题地连接并浏览特定的队列,但我正在寻找一种方法来返回所有队列的列表(如果可能,请提供队列深度)。我不知道是否有特定的emsapi可供使用,所以我使用的是标准JMS

我尝试了以下代码来执行反向JNDI查找,但失败了

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

我做了一些挖掘,似乎Tibco EMS不支持像这样查看JNDI。是否有其他方法可以实现这一点?

我不确定Tibco的详细信息,但它可能会与
列表绑定
一起工作,而不是
列表

我用一般的方式做了同样的事情,比如:

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());
}
List out=new ArrayList();
扫描队列(out,“”);
...
私有void scandiForQueues(列表输出,字符串路径)引发NamingException{
InitialContext=新的InitialContext();
对象资源=context.lookup(路径);
if(isSubContext(资源)){
NamingEnumeration list=context.listBindings(路径);
while(list.hasMoreElements()){
Binding Binding=list.nextElement();
scanJndiForQueues(out,path+“/”+binding.getName());
}
}else if(队列的资源实例){
out.add((队列)资源);
}//否则忽略主题
}
私有布尔IsubContext(对象){
返回javax.naming.Context.class.isAssignableFrom(object.getClass());
}

使用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");
    }
}
Map Map=newhashmap();
addAdmin(txtServer.getText(),txtser.getText(),txtPassword.getText(),map);
_admin=new-TibjmsAdmin[map.size()];
map.values().toArray(_admin);
QueueInfo[]info=\u admin[0]。getQueues(null);
对于(int i=0;i”){
添加(queueName+“,0”);
}
}

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


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

这是个好主意,我也使用了listBindings(),但不幸的是,它也会出现同样的问题“javax.naming.OperationNotSupportedException:不受支持”。好的。。。不使用Tibco的另一个原因?该方法未标记为可选。是的,您可以使用GEMS。用户希望能够从Java内部访问队列列表。GEMS提供了DOS风格的应用程序,允许用户查看有关不同Tibco结构的信息。据我所知,GEMS没有任何能力,甚至可以剪切和粘贴屏幕上列出的字符串。这对编写Java程序没有帮助。
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");
    }
}