簡體   English   中英

列出Tibco EMS中的所有JMS隊列

[英]Listing all JMS queues in Tibco EMS

我正在編寫一個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。 還有另一種方法可以做到這一點嗎?

使用與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");
    }
}

我不確定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());
}

不知道為什么需要列出所有EMS隊列,但是您可以使用GEMS工具來實現此目的(以及許多其他功能)。

tibcommunity搜索它(您需要一個帳戶),或者您可以從此處直接下載最新版本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM