Corba COS 命名服务列出所有节点

Posted

技术标签:

【中文标题】Corba COS 命名服务列出所有节点【英文标题】:Corba COS Naming service list all nodes 【发布时间】:2013-02-14 15:21:44 【问题描述】:

我有一个由 4 个上下文组成的名单。上下文 1,2 和 3 绑定到根节点,上下文 4 绑定到上下文 2。我可以列出上下文 1-3 的名称,但我无法获取上下文 4。

它只列出第一级的节点。我认为如果我检查每个节点,检查它是否有子节点,然后列出可以工作的子节点,但我不知道该怎么做。这是我的代码。我有两种方法来列出上下文

import java.io.*;
import org.omg.CORBA.*;
import HelloNaming.*;
import org.omg.CosNaming.* ;
import org.omg.CosNaming.NamingContextPackage.*;

public class HelloNamingClient
     

public static void main(String args[])

try
    NameComponent nc[]= new NameComponent[2];


    ORB orb = ORB.init(args, null);


    org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService");
    NamingContext rootCtx = NamingContextHelper.narrow(objRef);



    final int batchSize = 7;
            BindingIterator b ;
            BindingListHolder bList = new BindingListHolder() ;
            BindingIteratorHolder bIterator = new BindingIteratorHolder();

            rootCtx.list(batchSize, bList, bIterator) ;
            for (int i=0; i<bList.value.length; i++) 
                 System.out.println(bList.value[i].binding_name[0].id) ;
    


NamingContextExt ncc =
          NamingContextExtHelper.narrow(orb.resolve_initial_references(
        "NameService"));



    BindingListHolder bl = new BindingListHolder();
            BindingIteratorHolder blIt= new BindingIteratorHolder();
    ncc.list(1000, bl, blIt);

    Binding bindings[] = bl.value;

       for (int i=0; i < bindings.length; i++) 

                int lastIx = bindings[i].binding_name.length-1;


                if (bindings[i].binding_type == BindingType.ncontext) 
                  System.out.println( "Context: " +
                    bindings[i].binding_name[lastIx].id);
                 else 
                    System.out.println("Object: " +
                      bindings[i].binding_name[lastIx].id);
                
    



     catch (Exception e) 
        System.out.println("ERROR : " + e) ;
        e.printStackTrace(System.out);
        




【问题讨论】:

请发布您的输出 - 我认为您忘记递归处理 for 循环中的上下文。 【参考方案1】:

每个上下文都是一个单独的 CORBA 对象,需要单独查询,就像根命名上下文一样。以下修改递归地执行此操作并打印出 '[contextN...].objectN':

import org.omg.CORBA.*;
import org.omg.CosNaming.* ;

public class HelloNamingClient
     
  public static void printContext( NamingContext nc, String parent )
   
    try 
      final int batchSize = 1000;
      BindingListHolder bList = new BindingListHolder( );
      BindingIteratorHolder bIterator = new BindingIteratorHolder( );

      nc.list( batchSize, bList, bIterator );

      for ( int i=0; i < bList.value.length; i++ ) 
        NameComponent[] name =  bList.value[i].binding_name[0] ;
        if (bList.value[i].binding_type == BindingType.ncontext) 
            NamingContext context = NamingContextHelper.narrow( 
                nc.resolve( name ) );
            printContext( context, parent + name[0].id + "." );
         else 
            System.out.println( parent + name[0].id );
        
      

     catch (Exception e) 
        System.out.println("ERROR : " + e) ;
    
  

  public static void main(String args[])
  
    try
      ORB orb = ORB.init(args, null);

      org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService");
      NamingContext rootCtx = NamingContextHelper.narrow(objRef);

      printContext( rootCtx, "" );

     catch (Exception e) 
      System.out.println("ERROR : " + e) ;
      e.printStackTrace(System.out);
    
  

【讨论】:

以上是关于Corba COS 命名服务列出所有节点的主要内容,如果未能解决你的问题,请参考以下文章

Corba 命名服务

遍历通用节点类,列出所有节点导致无限循环

在 Java 中运行嵌入式 CORBA 命名服务

CORBA 应用程序必须以与 ORB 相同的语言实现吗?

Drupal:如何在视图中列出与配置文件节点相关的所有节点? (不是核心配置文件)。

列出按节点分组的所有 Jenkins 构建