我正在编写一个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。还有另一种方法可以实现这个目标吗?
答案 0 :(得分: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");
}
}
答案 1 :(得分: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());
}
答案 2 :(得分:-1)
不知道为什么需要列出所有EMS队列,但您可以使用GEMS工具实现这一目标(以及许多其他事项)。
在tibcommunity搜索(您需要一个帐户),或者直接从here下载最新版本。