سؤال

بالنسبة RMI على جانب الملقم ، هل نحن بحاجة إلى البدء في rmiregistry أو برنامج أو مجرد دعوة LocateRegistry.createRegistry?إذا كان كلاهما ممكن, ما هي مزايا وعيوب ؟

هل كانت مفيدة؟

المحلول

هم نفس الشيء... rmiregistry هو برنامج منفصل التي يمكن تشغيلها من سطر الأوامر أو السيناريو ، في حين LocateRegistry.createRegistry يفعل الشيء نفسه برمجيا.

في تجربة "الحقيقي" ملقمات سوف تحتاج إلى استخدام rmiregistry حتى أن كنت أعلم أنه يعمل دائما بغض النظر عما إذا كان أو لم يكن العميل يتم تشغيل التطبيق. createRegistry مفيد جدا للاختبار ، كما يمكنك تشغيل وإيقاف التسجيل من الاختبار الخاصة بك عند الضرورة.

نصائح أخرى

إذا بدأنا rmiregistry أولا ، RmiServiceExporter أن تسجل نفسها إلى تشغيل rmiregistry.في هذه الحالة يجب أن يحدد نظام الملكية 'جافا.rmi.الملقم.برنامج' حيث 'org.springframework.الاتصال عن بعد.rmi.RmiInvocationWrapper_Stub' الفئة يمكن العثور عليها.وإلا RmiServiceExporter لن تكون بدأت و حصلت على استثناء" ClassNotFoundException فئة غير موجودة:org.springframework.الاتصال عن بعد.rmi.RmiInvocationWrapper_Stub;متداخلة استثناء هو:..."

إذا كان الخاص بك rmi الخادم, rmi العميل rmiregistry يمكن الوصول إلى نفس الملفات, قد ترغب في نظام الملكية إلى تكوين تلقائيا إلى حيث spring.jar ويمكن الاطلاع على الملفات المشتركة.الأداة التالية فصول الربيع التكوين تظهر كيف يمكن تحقيق ذلك.

abstract public class CodeBaseResolver { 
  static public String resolveCodeBaseForClass(Class<?> clazz) {
    Assert.notNull(clazz);
    final CodeSource codeSource = clazz.getProtectionDomain().getCodeSource();
    if (codeSource != null) {
      return codeSource.getLocation().toString();
    } else {
      return "";
    }
  }
}

public class SystemPropertyConfigurer {
  private Map<String, String> systemProperties;
  public void setSystemProperties(Map<String, String> systemProperties) {
    this.systemProperties = systemProperties;
  }

  @PostConstruct
  void init() throws BeansException {
    if (systemProperties == null || systemProperties.isEmpty()) {
      return;
    }
    for (Map.Entry<String, String> entry : systemProperties.entrySet()) {
      final String key = entry.getKey();
      final String value = SystemPropertyUtils.resolvePlaceholders(entry.getValue());
      System.setProperty(key, value);
    }
  }
}


<bean id="springCodeBase" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
  <property name="staticMethod" value="xx.CodeBaseResolver.resolveCodeBaseForClass" />
  <property name="arguments">
    <list>
      <value>org.springframework.remoting.rmi.RmiInvocationWrapper_Stub</value>
    </list>
  </property>
</bean>

<bean id="springCodeBaseConfigurer" class="xx.SystemPropertyConfigurer"
  depends-on="springCodeBase">
  <property name="systemProperties">
    <map>
      <entry key="java.rmi.server.codebase" value-ref="springCodeBase" />
    </map>
  </property>
</bean>

<bean id="rmiServiceExporter" class="org.springframework.remoting.rmi.RmiServiceExporter" depends-on="springCodeBaseConfigurer">
  <property name="serviceName" value="XXX" />
  <property name="service" ref="XXX" />
  <property name="serviceInterface" value="XXX" />
  <property name="registryPort" value="${remote.rmi.port}" />
</bean>

المثال أعلاه يظهر كيف نظام الملكية يتم تعيين تلقائيا فقط عندما rmi الخادم, rmi العميل و rmi التسجيل يمكن الوصول إلى نفس الملفات.إذا كان هذا ليس صحيحا أو الربيع تعليمات البرمجة الأساسية المشتركة عبر طريقة أخرى (مثلا ، HTTP), تستطيع تعديل CodeBaseResolver لتناسب حاجتك.

إذا كنت تكتب مستقل تطبيق جافا كنت تريد أن تبدأ بنفسك rmiregistry ولكن إذا كنت كتابة J2EE التطبيق الذي من الواضح أنه يعمل داخل J2EE الحاوية ثم تريد "LocateRegistry" كما أن هناك بالفعل قيد التشغيل على ملقم التطبيق!

إذا كنت تستخدم الربيع لتصدير RMI الخدمات تلقائيا يبدأ التسجيل إذا لم يكن قيد التشغيل بالفعل.انظر RmiServiceExporter

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top