tnameserv(1) Java IDL and RMI-IIOP Tools tnameserv(1)

tnameserv-openjdk8 - سرویس نام‌گذاری موقت جاوا CORBA

tnameserv -ORBInitialPort [ nameserverport ]

درگاه اولیه‌ای که سرویس نام‌گذاری روی آن به پروتکل راه‌اندازی اولیه (bootstrap) گوش می‌دهد؛ این پروتکل برای پیاده‌سازی متدهای resolve_initial_references و list_initial_references در ORB استفاده می‌شود.

بخش Java IDL شامل دیمن واسط درخواست شیء (ORBD) است. دیمن ORBD یک پردازه پس‌زمینه است که شامل سرویس راه‌اندازی اولیه (Bootstrap Service)، سرویس نام‌گذاری موقت (Transient Naming Service)، سرویس نام‌گذاری ماندگار (Persistent Naming Service) و مدیر کارساز (Server Manager) می‌باشد. تمام آموزش‌های Java IDL از ORBD استفاده می‌کنند، اما می‌توانید در هر یک از مثال‌هایی که از سرویس نام‌گذاری موقت بهره می‌برند، دستور tnameserv را جایگزین دستور orbd نمایید.

به orbd(1) یا بخش Naming Service در نشانی http://docs.oracle.com/javase/8/docs/technotes/guides/idl/jidlNaming.html مراجعه کنید.

سرویس نام‌گذاری Common Object Services (COS) در CORBA یک ساختار درختی از ارجاعات شیء مشابه ساختار شاخه‌ای فایل‌ها در سیستم‌فایل ارائه می‌دهد. سرویس نام‌گذاری موقت ارائه‌شده در Java IDL یعنی tnameserv، یک پیاده‌سازی ساده از مشخصات COS Naming Service است.

ارجاعات اشیاء با نام در فضای نام ذخیره می‌شوند و به هر جفت «ارجاع شیء - نام»، یک نگاشت نام (name binding) گفته می‌شود. نگاشت‌های نام را می‌توان ذیل بافت‌های نام‌گذاری (naming contexts) سازمان‌دهی کرد. بافت‌های نام‌گذاری خود نوعی نگاشت نام هستند و همان نقش سازمان‌دهی زیرشاخه‌ها در سیستم‌فایل را ایفا می‌کنند. تمامی نگاشت‌ها ذیل بافت نام‌گذاری اولیه ذخیره می‌شوند. بافت نام‌گذاری اولیه تنها نگاشت ماندگار در فضای نام است. با توقف و راه‌اندازی مجدد پردازه سرویس نام‌گذاری Java IDL، باقی فضای نام از دست می‌رود.

برای اینکه یک اپلت یا برنامه کاربردی بتواند از نام‌گذاری COS استفاده کند، ORB آن باید درگاه میزبانی که سرویس نام‌گذاری روی آن در حال اجراست را بداند یا به رشته بافت نام‌گذاری اولیه برای آن سرویس دسترسی داشته باشد. سرویس نام‌گذاری می‌تواند سرویس نام‌گذاری Java IDL یا هر سرویس نام‌گذاری منطبق بر استاندارد COS دیگر باشد.

باید سرویس نام‌گذاری Java IDL را پیش از اجرای برنامه‌ها یا اپلت‌هایی که از آن استفاده می‌کنند، راه‌اندازی کنید. نصب بسته Java IDL اسکریپتی (در Oracle Solaris: tnameserv) یا فایلی اجرایی (در Windows: tnameserv.exe) ایجاد می‌کند که سرویس نام‌گذاری Java IDL را آغاز می‌نماید. سرویس نام‌گذاری را طوری اجرا کنید که در پس‌زمینه اجرا شود.

چنانچه درگاه دیگری مشخص نکنید، سرویس نام‌گذاری Java IDL روی درگاه ۹۰۰ به پروتکل راه‌اندازی اولیه مورد استفاده برای پیاده‌سازی متدهای resolve_initial_references و list_initial_references در ORB گوش می‌دهد، به صورت زیر:

tnameserv -ORBInitialPort nameserverport&

اگر درگاه کارساز نام را مشخص نکنید، درگاه ۹۰۰ به صورت پیش‌فرض استفاده می‌شود. هنگام اجرا در Oracle Solaris، برای اجرای پردازه روی درگاه‌های زیر ۱۰۲۴ باید دسترسی کاربر ریشه (root) داشته باشید. به همین دلیل توصیه می‌شود از شماره درگاه بزرگتر یا مساوی ۱۰۲۴ استفاده کنید. برای مشخص کردن درگاهی متفاوت، مثلاً ۱۰۵۰، و اجرای سرویس نام‌گذاری در پس‌زمینه، در پوسته خط فرمان یونیکس وارد کنید:

tnameserv -ORBInitialPort 1050&

در اعلان خط فرمان ویندوز (MS-DOS) وارد کنید:

start tnameserv -ORBInitialPort 1050

کارخواه‌های کارساز نام باید از شماره درگاه جدید مطلع شوند. این کار با تنظیم ویژگی org.omg.CORBA.ORBInitialPort روی شماره درگاه جدید هنگام ایجاد شیء ORB انجام می‌پذیرد.

در بیشتر آموزش‌های Java IDL و RMI-IIOP، سرویس نام‌گذاری، کارساز و کارخواه همگی روی ماشین توسعه اجرا می‌شوند. در استقرار دنیای واقعی، کارخواه و کارساز معمولاً روی ماشین‌های میزبانی متفاوت از ماشین سرویس نام‌گذاری اجرا می‌شوند.

برای اینکه کارخواه و کارساز بتوانند سرویس نام‌گذاری را بیابند، باید از شماره درگاه و میزبانی که سرویس نام‌گذاری روی آن در حال اجراست مطلع شوند. این کار با تنظیم ویژگی‌های org.omg.CORBA.ORBInitialPort و org.omg.CORBA.ORBInitialHost در فایل‌های کارخواه و کارساز به نام ماشین و شماره درگاه محل اجرای سرویس نام‌گذاری انجام می‌شود. نمونه‌ای از این موضوع در راهنمای Getting Started Using RMI-IIOP در نشانی http://docs.oracle.com/javase/8/docs/technotes/guides/rmi-iiop/rmiiiopexample.html نشان داده شده است.

همچنین می‌توانید از گزینه‌های خط فرمان -ORBInitialPort nameserverport# و -ORBInitialHost nameserverhostname استفاده کنید تا به کارخواه و کارساز بگویید سرویس نام‌گذاری را کجا پیدا کنند. برای مشاهده یک مثال از انجام این کار با گزینه‌های خط فرمان، به راهنمای Java IDL: The Hello World Example on Two Machines در نشانی http://docs.oracle.com/javase/8/docs/technotes/guides/idl/tutorial/jidl2machines.html مراجعه کنید.

برای نمونه، فرض کنید سرویس نام‌گذاری موقت tnameserv روی درگاه ۱۰۵۰ در میزبان nameserverhost در حال اجراست. کارخواه روی میزبان clienthost و کارساز روی میزبان serverhost اجرا می‌شوند.

اجرای tnameserv روی میزبان nameserverhost:

tnameserv -ORBInitialPort 1050

اجرای کارساز روی serverhost:

java Server -ORBInitialPort 1050 -ORBInitialHost nameserverhost

اجرای کارخواه روی clienthost:

java Client -ORBInitialPort 1050 -ORBInitialHost nameserverhost

برای متوقف کردن سرویس نام‌گذاری Java IDL، از دستور مناسب سیستم‌عامل استفاده کنید؛ مانند kill برای پردازه در یونیکس یا Ctrl+C برای پردازه در ویندوز. سرویس نام‌گذاری تا زمانی که صریحاً خاموش نشود به انتظار برای فراخوانی‌ها ادامه می‌دهد. توجه داشته باشید که نام‌های ثبت‌شده در سرویس نام‌گذاری Java IDL با پایان یافتن سرویس از بین می‌روند.


گزینه option را به ماشین مجازی جاوا (JVM) ارسال می‌کند، که در آن option یکی از گزینه‌های شرح داده شده در صفحه مرجع اجراکننده برنامه‌های جاوا است. برای نمونه، -J-Xms48m حافظه راه‌اندازی را روی ۴۸ مگابایت تنظیم می‌کند. به java(1) مراجعه کنید.

مثال زیر نحوه افزودن نام‌ها به فضای نام را نشان می‌دهد. این برنامه یک کارخواه مستقل از سرویس نام‌گذاری موقت است که درخت ساده زیر را ایجاد می‌کند:

Initial Naming Context
     plans
     Personal
          calendar
          schedule

در این مثال، plans یک ارجاع شیء است و Personal یک بافت نام‌گذاری است که شامل دو ارجاع شیء می‌باشد: calendar و schedule.

import java.util.Properties;
import org.omg.CORBA.*;
import org.omg.CosNaming.*;
public class NameClient {
    public static void main(String args[]) {
        try {

در بخش راه‌اندازی سرویس نام‌گذاری، nameserver روی درگاه ۱۰۵۰ راه‌اندازی شد. کد زیر تضمین می‌کند که برنامه کارخواه از این شماره درگاه مطلع است:

            Properties props = new Properties();
            props.put("org.omg.CORBA.ORBInitialPort", "1050");
            ORB orb = ORB.init(args, props);

این کد بافت نام‌گذاری اولیه را به دست آورده و آن را به ctx اختصاص می‌دهد. خط دوم ctx را درون یک ارجاع شیء ساختگی objref کپی می‌کند که به نام‌های مختلف متصل شده و به فضای نام اضافه می‌گردد.

            NamingContext ctx =
                NamingContextHelper.narrow(
                    orb.resolve_initial_references("NameService"));
             NamingContext objref = ctx;

این کد یک نام plans از نوع text ایجاد کرده و آن را به ارجاع شیء ساختگی متصل می‌سازد. سپس plans با استفاده از متد rebind ذیل بافت نام‌گذاری اولیه اضافه می‌شود. متد rebind به شما امکان می‌دهد این برنامه را بارها و بارها بدون مواجهه با استثناهای ناشی از متد bind اجرا کنید.

            NameComponent nc1 = new NameComponent("plans", "text");
            NameComponent[] name1 = {nc1};
            ctx.rebind(name1, objref);
            System.out.println("plans rebind successful!");

این کد یک بافت نام‌گذاری به نام Personal از نوع directory ایجاد می‌کند. ارجاع شیء حاصل، ctx2، به نام متصل شده و ذیل بافت نام‌گذاری اولیه اضافه می‌شود.

            NameComponent nc2 = new NameComponent("Personal", "directory");
            NameComponent[] name2 = {nc2};
            NamingContext ctx2 = ctx.bind_new_context(name2);
            System.out.println("new naming context added..");

باقی کد، ارجاع شیء ساختگی را با استفاده از نام‌های schedule و calendar ذیل بافت نام‌گذاری Personal (ctx2) نگاشت می‌کند.

            NameComponent nc3 = new NameComponent("schedule", "text");
            NameComponent[] name3 = {nc3};
            ctx2.rebind(name3, objref);
            System.out.println("schedule rebind successful!");
            NameComponent nc4 = new NameComponent("calender", "text");
            NameComponent[] name4 = {nc4};
            ctx2.rebind(name4, objref);
            System.out.println("calender rebind successful!");
        } catch (Exception e) {
            e.printStackTrace(System.err);
        }
    }
}

برنامه نمونه زیر نحوه مرور در فضای نام را نشان می‌دهد:

import java.util.Properties;
import org.omg.CORBA.*;
import org.omg.CosNaming.*;
public class NameClientList {
    public static void main(String args[]) {
        try {

در بخش راه‌اندازی سرویس نام‌گذاری، nameserver روی درگاه ۱۰۵۰ راه‌اندازی شد. کد زیر تضمین می‌کند که برنامه کارخواه از این شماره درگاه مطلع است:

            Properties props = new Properties();
            props.put("org.omg.CORBA.ORBInitialPort", "1050");
            ORB orb = ORB.init(args, props);

کد زیر بافت نام‌گذاری اولیه را به دست می‌آورد:

            NamingContext nc =
            NamingContextHelper.narrow(
                orb.resolve_initial_references("NameService"));

متد list نگاشت‌های موجود در بافت نام‌گذاری را فهرست می‌کند. در این حالت، حداکثر ۱۰۰۰ نگاشت از بافت نام‌گذاری اولیه در BindingListHolder برگردانده می‌شوند؛ هر نگاشت باقی‌مانده دیگری در BindingIteratorHolder بازگردانده خواهد شد.

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

این کد آرایه نگاشت‌ها را از BindingListHolder بازگردانده‌شده استخراج می‌کند. چنانچه هیچ نگاشتی وجود نداشته باشد، برنامه پایان می‌یابد.

            Binding bindings[] = bl.value;
            if (bindings.length == 0) return;

باقی کد روی نگاشت‌ها پیمایش کرده و نام‌ها را چاپ می‌کند:

            for (int i=0; i < bindings.length; i++) {
                // get the object reference for each binding
                org.omg.CORBA.Object obj = nc.resolve(bindings[i].binding_name);
                String objStr = orb.object_to_string(obj);
                int lastIx = bindings[i].binding_name.length-1;
                // check to see if this is a naming context
                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) {
            e.printStackTrace(System.err)
        }
    }
}

•
orbd(1)
21 November 2013 JDK 8