【问题标题】:Listing all JMS queues in Tibco EMS列出 Tibco EMS 中的所有 JMS 队列
【发布时间】:2014-04-09 10:33:36
【问题描述】:

我正在编写一个 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。有没有其他方法可以做到这一点?

【问题讨论】:

    标签: java jms tibco ems


    【解决方案1】:

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

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

    【讨论】:

    • 是的,您可以使用 GEMS。用户希望能够从 Java 内部访问队列列表。 GEMS 提供了一个 DOS 风格的应用程序,允许用户查看有关不同 Tibco 结构的信息。据我所知,GEMS 不具备任何剪切和粘贴屏幕上列出的字符串的能力。它对编写 Java 程序没有帮助。
    【解决方案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");
        }
    }
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 这是个好主意,我也使用了 listBindings(),但不幸的是它也给出了同样的问题“javax.naming.OperationNotSupportedException:不支持”。
      • 好吧...不使用 Tibco 的另一个原因?该方法未标记为可选。
      猜你喜欢
      • 2015-04-26
      • 2013-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-11
      • 1970-01-01
      • 2017-02-05
      • 1970-01-01
      相关资源
      最近更新 更多