`
ldd600
  • 浏览: 102155 次
  • 性别: Icon_minigender_1
  • 来自: 上海
博客专栏
47bb354f-8b5f-3ea6-a206-c7ead38c741c
Hyperic插件开发不完...
浏览量:11109
社区版块
存档分类
最新评论

让已有的系统开放RMI服务(2)

 
阅读更多

MessageReceiverFactory: 生产MessageReceiver的简单工厂:

public class MessageReceiverFactory {

      private static MessageReceiver messageReceiver;

      private static RemotableMessageReceiver remotableMessageReceiver;

 

      private static void init() throws ServerReceiverException {

            SystemInfo sysInfo = ContextFactory.getSystemConfigContext()

                        .getSystemInfo();

            if (sysInfo.isServer()) {

                  MessageReceiver mifMessageReceiver = new ServerMessageReceiver();

                  if (sysInfo.isRemoteable()) {

                        try {

                              remotableMessageReceiver = new RMIMessageReceiver(mifMessageReceiver);

                        } catch (RemoteException e) {

                              throw new ServerReceiverException(

                                          "bind Message Receiver to port: "

                                                      + sysInfo.getRmiport()

                                                      + " with service name: "

                                                      + sysInfo.getReceiverRmiBindName(), e);

                        }

                  }

                 

                  messageReceiver = new StdMessageReceiver(mifMessageReceiver);

 

            } else {

                  String rmiHost = sysInfo.getRmiHost();

                  int rmiPort = sysInfo.getRmiport();

                  String serviceName = sysInfo.getReceiverRmiBindName();

                  messageReceiver = createRemoteMesageReceiver(rmiHost, rmiPort,

                              serviceName);

            }

      }

 

      public static MessageReceiver createRemoteMesageReceiver(String rmiHost,

                  int rmiPort, String serviceName) throws ServerReceiverException {

            return new RemoteMessageReceiver(rmiHost, rmiPort, serviceName);

      }

 

      public synchronized static MessageReceiver getMessageReceiver() throws ServerReceiverException {

            if(messageReceiver == null) {

                  init();

            }

            return messageReceiver;

      }

     

      public static RemotableMessageReceiver getRemoteableMesageReceiver(){

            return remotableMessageReceiver;

      }

     

      public synchronized static void initMessageReceiver() throws ServerReceiverException {

            init();

      }

}

  

StartUpServlet:

publicclass StartupServlet extends HttpServlet {

      publicvoid init(ServletConfig config) throws ServletException {

            try {

                  //parse configuration

                 

                  //init rmi service

                  MessageReceiverFactory.initMessageReceiver();

     

            } catch (Exception ex) {

                  ex.printStackTrace();

                  thrownew ServletException(ex.getMessage(), ex);

            }

      }

      publicvoid destroy() {

            try {

                 

                  RemotableMessageReceiver remotableMessageReceiver = MessageReceiverFactory

                              .getRemoteableMesageReceiver();

                  if (remotableMessageReceiver != null) {

                        SystemInfo sysInfo = ContextFactory.getSystemConfigContext()

                                    .getSystemInfo();

                        RMIUtils.unBind(sysInfo.getRmiport(), sysInfo

                                    .getReceiverRmiBindName(),

                                    remotableMessageReceiver);

                  }

            } catch (Exception e) {

                  e.printStackTrace();

            }

      }

}

 

RMIUtils: 工具类提供rmi注册和撤销服务的功能:

public class RMIUtils {

      public static void  bind(int rmiPort, String serviceName, Remote remoteObject)

                  throws RemoteException {

            SystemInfo sysInfo = ContextFactory.getSystemConfigContext()

                        .getSystemInfo();

            Remote exportable = (Remote) UnicastRemoteObject

                        .exportObject(remoteObject);

 

            Registry registry = null;

 

            try {

                  registry = LocateRegistry.getRegistry(sysInfo.getRmiport());

                  registry.list();

            } catch (Exception e) {

                  registry = LocateRegistry.createRegistry(sysInfo.getRmiport());

            }

            registry.list();

            System.out.println("bind the service: " + serviceName);

            String bindName = serviceName;

 

            registry.rebind(bindName, exportable);

 

      }

 

     

      public static void unBind(int rmiPort, String serviceName, Remote remoteObject) throws RemoteException {         

            SystemInfo sysInfo = ContextFactory.getSystemConfigContext()

            .getSystemInfo();

 

            Registry registry = LocateRegistry.getRegistry(sysInfo.getRmiport());

 

            String bindName = serviceName;

 

            try {

                  registry.unbind(bindName);

                  UnicastRemoteObject.unexportObject(remoteObject, true);

            } catch (java.rmi.NotBoundException nbe) {

            }

      }

}

分享到:
评论

相关推荐

    JAVA_API1.6文档(中文)

    javax.xml.bind.attachment 此包由基于 MIME 的包处理器实现,该处理器能够解释并创建基于 MIME 的包格式的已优化的二进制数据。 javax.xml.bind.helpers 仅由 JAXB 提供者用于: 提供某些 javax.xml.bind 接口的...

    JDK_1_6 API

    javax.swing 提供一组“轻量级”(全部是 Java 语言)组件,尽量让这些组件在所有平台上的工作方式都相同。 javax.swing.border 提供围绕 Swing 组件绘制特殊边框的类和接口。 javax.swing.colorchooser 包含供 ...

    JavaAPI中文chm文档 part2

    javax.xml.bind.attachment 此包由基于 MIME 的包处理器实现,该处理器能够解释并创建基于 MIME 的包格式的已优化的二进制数据。 javax.xml.bind.helpers 仅由 JAXB 提供者用于: 提供某些 javax.xml.bind 接口的...

    java api最新7.0

    javax.swing 提供一组“轻量级”(全部是 Java 语言)组件,尽量让这些组件在所有平台上的工作方式都相同。 javax.swing.border 提供围绕 Swing 组件绘制特殊边框的类和接口。 javax.swing.colorchooser 包含供 ...

    JavaAPI1.6中文chm文档 part1

    javax.xml.bind.attachment 此包由基于 MIME 的包处理器实现,该处理器能够解释并创建基于 MIME 的包格式的已优化的二进制数据。 javax.xml.bind.helpers 仅由 JAXB 提供者用于: 提供某些 javax.xml.bind 接口的...

    [Java参考文档]

    javax.xml.bind.attachment 此包由基于 MIME 的包处理器实现,该处理器能够解释并创建基于 MIME 的包格式的已优化的二进制数据。 javax.xml.bind.helpers 仅由 JAXB 提供者用于: 提供某些 javax.xml.bind 接口的...

    [Java参考文档].JDK_API 1.6

    javax.swing 提供一组“轻量级”(全部是 Java 语言)组件,尽量让这些组件在所有平台上的工作方式都相同。 javax.swing.border 提供围绕 Swing 组件绘制特殊边框的类和接口。 javax.swing.colorchooser 包含供 ...

    Java 1.6 API 中文 New

    javax.swing 提供一组“轻量级”(全部是 Java 语言)组件,尽量让这些组件在所有平台上的工作方式都相同。 javax.swing.border 提供围绕 Swing 组件绘制特殊边框的类和接口。 javax.swing.colorchooser 包含供 ...

    超级有影响力霸气的Java面试题大全文档

    与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。...

    java 面试题 总结

    与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。...

Global site tag (gtag.js) - Google Analytics