2014-03-06 64 views
1

我正在编写Java类以浏览Tibco EMS JMS服务器并显示所有队列。我能够连接没有问题,并浏览特定的队列,但我正在寻找一种方式来返回所有队列(如果可能的话,队列深度)。我不是因为使用了特定的EMS API,所以我使用标准的JMS。列出Tibco 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。有没有另外一种方法来完成这个?

回答

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"); 
    } 
} 
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()); 
} 
+0

这是一个好主意,我也使用listBindings(),但不幸的是它也给出了同样的问题“javax.naming.OperationNotSupportedException:Not supported”。 – Matt

+0

好的......不使用Tibco的另一个原因是什么?该方法未标记为可选。 –

-1

不知道为什么你需要列出所有EMS队列,但是你可以用GEMS工具实现这一点(和许多其他的东西)。

tibcommunity(您将需要一个帐户)上进行搜索,或者您可以直接从here下载最新版本。

+0

是的,你可以使用GEMS。用户希望能够从Java内部访问队列列表。 GEMS提供了一个DOS风格的应用程序,允许用户查看有关不同Tibco结构的信息。据我所知,GEMS没有任何功能可以在屏幕上列出字符串的情况下进行剪切和粘贴。这对编写Java程序没有帮助。 –