2014-03-06 30 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程序沒有幫助。 –