alvinalexander.com | career | drupal | java | mac | mysql | perl | scala | uml | unix  

Scala example source code file (RemoteRef.scala)

This example Scala source code file (RemoteRef.scala) is included in the DevDaily.com "Java Source Code Warehouse" project. The intent of this project is to help you "Learn Java by Example" TM.

Java - Scala tags/keywords

exception, exception, exportexception, interruptedexception, malformedurlexception, net, network, notboundexception, quitexception, quitexception, remote, remotegc, remoteref, remoteref, rmi, string, string

The Scala RemoteRef.scala source code

/*                     __                                               *\
**     ________ ___   / /  ___     Scala API                            **
**    / __/ __// _ | / /  / _ |    (c) 2002-2011, LAMP/EPFL             **
**  __\ \/ /__/ __ |/ /__/ __ |    http://scala-lang.org/               **
** /____/\___/_/ |_/____/_/ | |                                         **
**                          |/                                          **
\*                                                                      */

// $Id: RemoteRef.scala 18365 2009-07-21 11:00:42Z michelou $

package scala.runtime

import java.net.{InetAddress, MalformedURLException}
import java.rmi.{NoSuchObjectException, NotBoundException, Remote}
import java.rmi.registry.{LocateRegistry, Registry}
import java.rmi.server.{ExportException, RemoteObject, UnicastRemoteObject}

import scala.runtime.remoting.{Debug, RemoteGC}

/**
 *
 *  @author Stephane Micheloud
 *  @version 1.0
 */
object RemoteRef { /*extends Thread {
  start()

  private class QuitException extends Exception
  private var isTerminated = false

  // keeps track of live remote objects
  val remoteGC = new RemoteGC

  override def run() {
    info("started thread")
    try {
      while (!isTerminated) {
        this.synchronized {
          try {
            wait(200)
          } catch {
            case _: InterruptedException =>
              if (isTerminated) throw new QuitException
          }
          remoteGC.gc()
          if (remoteGC.allClosed) 
            throw new QuitException
        } // synchronized

      }
    } catch {
      case _: QuitException =>
        // allow thread to exit
    }
  }
*/
  try {
    val prop = System.getProperty("sun.rmi.dgc.server.gcInterval")
    if (prop eq null)
      System.setProperty("sun.rmi.dgc.server.gcInterval", "10000")
  }
  catch {
    case e =>
      error(e.getMessage)
  }

  private val host =
    try {
      val prop = System.getProperty("java.rmi.server.hostname")
      if (prop ne null) prop else InetAddress.getLocalHost.getHostAddress
    }
    catch {
      case e =>
        warning(e.getMessage)
        InetAddress.getLocalHost.getHostAddress
    }

  private val port =
    try {
      val prop = System.getProperty("scala.remoting.port")
      if (prop ne null) prop.toInt else Registry.REGISTRY_PORT
    }
    catch {
      case e =>
        warning(e.getMessage)
        Registry.REGISTRY_PORT // default port
    }

  private val registry =
    try {
      LocateRegistry.createRegistry(port)
    }
    catch {
      case e =>
        warning(e.getMessage)
        LocateRegistry.getRegistry(host, port)
    }

  private val prefix = "//"+host+":"+port+"/"
  printDebugInfos

  // Variant 1: rebind/unbind
  def bind(name: String, x: Remote): Remote =
    try {
      registry.rebind(prefix+name, x)
      info("\""+prefix+name+"\" bound")
      val stub = RemoteObject.toStub(x)
      //remoteGC.newRef(stub)
      stub
    } catch {
      case e: MalformedURLException =>
        error(e.getMessage); null
      case e: ExportException =>
        info(""+e); null
      case e: Exception => // AlreadyBoundException, etc..
        throw e
    }

  def unbind(name: String) =
    try {
      registry.unbind(prefix+name)
      info("\""+name+"\" unbound")
    } catch {
      case e: java.io.EOFException =>
        warning(e.getMessage)
      case e: NotBoundException =>
        warning(e.getMessage+" already unbound")
      case e: MalformedURLException =>
        error(e.getMessage)
      case e: Exception =>
        throw e
    }
/*
  // Variant 2: un-/exportObject
  def bind(name: String, x: Remote): Remote =
    try {
      val ex = UnicastRemoteObject.exportObject(x)
      registry.rebind(prefix+name, ex)
      info("\""+prefix+name+"\" bound")
      //val stub = RemoteObject.toStub(ex)
      //remoteGC.newRef(ex)
      ex //stub
    } catch {
      case e: MalformedURLException =>
        error(e.getMessage); null
      case e: ExportException =>
        info(""+e); null
      case e: Exception => // AlreadyBoundException, etc..
        throw e
    }

  def unbind(x: Remote) {
    try {
      UnicastRemoteObject.unexportObject(x, false)
      info("\""+x+"\" unbound")
    } catch {
      case e: java.io.EOFException =>
        warning(e.getMessage)
      case e: NotBoundException =>
        warning(e.getMessage+" already unbound")
      case e: MalformedURLException =>
        error(e.getMessage)
      case e: Exception =>
        throw e
    }
  }
*/
  private def info(msg: String) { Debug.info("[RemoteRef] "+msg) }
  private def warning(msg: String) { Debug.warning("[RemoteRef] "+msg) }
  private def error(msg: String) { Debug.error("[RemoteRef] "+msg) }

  private def printDebugInfos() {
    def property(name: String): String =
      name+"="+(
      try { System.getProperty(name, "") }
      catch { case e => warning(e.getMessage); "?" })
    info(property("java.rmi.server.hostname"))
    info(property("sun.rmi.dgc.server.gcInterval"))
    info("registry="+registry)
    info("prefix="+prefix)
  }
}

Other Scala examples (source code examples)

Here is a short list of links related to this Scala RemoteRef.scala source code file:

... this post is sponsored by my books ...

#1 New Release!

FP Best Seller

 

new blog posts

 

Copyright 1998-2021 Alvin Alexander, alvinalexander.com
All Rights Reserved.

A percentage of advertising revenue from
pages under the /java/jwarehouse URI on this website is
paid back to open source projects.