⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 callbackrmidriver.java

📁 java开源的企业总线.xmlBlaster
💻 JAVA
字号:
/*------------------------------------------------------------------------------Name:      CallbackRmiDriver.javaProject:   xmlBlaster.orgCopyright: xmlBlaster.org, see xmlBlaster-LICENSE file------------------------------------------------------------------------------*/package org.xmlBlaster.protocol.rmi;import java.util.logging.Logger;import java.util.logging.Level;import org.xmlBlaster.util.Global;import org.xmlBlaster.util.XmlBlasterException;import org.xmlBlaster.util.def.ErrorCode;import org.xmlBlaster.protocol.I_CallbackDriver;import org.xmlBlaster.util.MsgUnitRaw;import org.xmlBlaster.util.qos.address.CallbackAddress;import org.xmlBlaster.util.xbformat.I_ProgressListener;import java.rmi.Naming;import java.rmi.RemoteException;import java.rmi.RMISecurityManager;import java.rmi.NotBoundException;import java.rmi.Remote;import java.net.MalformedURLException;/** * This object sends a MsgUnitRaw back to a client using RMI. * <p /> * The BlasterCallback.update() method of the client will be invoked * <p /> * This callback rmi client can be used independent from the RmiDriver. * <p /> * Your client needs to have a callback server implementing interface * I_XmlBlasterCallback running and registered with rmi-registry. * * @author <a href="mailto:xmlBlaster@marcelruff.info">Marcel Ruff</a>. */public class CallbackRmiDriver implements I_CallbackDriver{   private String ME = "CallbackRmiDriver";   private I_XmlBlasterCallback cb = null;   private CallbackAddress callbackAddress = null;   private Global glob = null;   private static Logger log = Logger.getLogger(CallbackRmiDriver.class.getName());   /** Get a human readable name of this driver */   public String getName() {      return ME;   }   /**    * Access the xmlBlaster internal name of the protocol driver.     * @return "RMI"    */   public String getProtocolId() {      return "RMI";   }   /** Enforced by I_Plugin */   public String getType() {      return getProtocolId();   }   /** Enforced by I_Plugin */   public String getVersion() {      return "1.0";   }   /**    * This method is called by the PluginManager (enforced by I_Plugin).     * @see org.xmlBlaster.util.plugin.I_Plugin#init(org.xmlBlaster.util.Global,org.xmlBlaster.util.plugin.PluginInfo)    */   public void init(org.xmlBlaster.util.Global glob, org.xmlBlaster.util.plugin.PluginInfo pluginInfo) {   }   /**    * Get the address how to access this driver.     * @return "rmi://www.mars.universe:1099/I_AuthServer"    */   public String getRawAddress() {      return callbackAddress.getRawAddress();   }   /**    * Get callback reference here.    * @param  callbackAddress Contains the rmi registry name of the client callback server    */   public void init(Global glob, CallbackAddress callbackAddress) throws XmlBlasterException {      this.glob = glob;      // Create and install a security manager      if (System.getSecurityManager() == null) {         System.setSecurityManager(new RMISecurityManager());         if (log.isLoggable(Level.FINE)) log.fine("Started RMISecurityManager");      }      this.callbackAddress = callbackAddress;      String addr = callbackAddress.getRawAddress(); // e.g. "rmi://localhost/xmlBlaster"      Remote rem = null;      try {         rem = Naming.lookup(addr);      }      catch (RemoteException e) {         log.severe("Can't access callback address ='" + addr + "', no client rmi registry running");         throw new XmlBlasterException(glob, ErrorCode.RESOURCE_CONFIGURATION_ADDRESS, ME, "Can't access callback address ='" + addr + "', no client rmi registry running", e);      }      catch (NotBoundException e) {         log.severe("The given callback address ='" + addr + "' is not bound to rmi registry: " + e.toString());         throw new XmlBlasterException(glob, ErrorCode.RESOURCE_CONFIGURATION_ADDRESS, ME, "The given callback address '" + addr + "' is not bound to rmi registry", e);      }      catch (MalformedURLException e) {         log.severe("The given callback address ='" + addr + "' is invalid: " + e.toString());         throw new XmlBlasterException(glob, ErrorCode.RESOURCE_CONFIGURATION_ADDRESS, ME, "The given callback address '" + addr + "' is invalid.", e);      }      catch (Throwable e) {         log.severe("The given callback address ='" + addr + "' is invalid : " + e.toString());         throw new XmlBlasterException(glob, ErrorCode.RESOURCE_CONFIGURATION_ADDRESS, ME, "The given callback address '" + addr + "' is invalid.", e);      }      if (rem instanceof org.xmlBlaster.protocol.rmi.I_XmlBlasterCallback) {         cb = (I_XmlBlasterCallback)rem;         log.info("Accessing client callback reference using given '" + addr + "' string");      }      else {         throw new XmlBlasterException(glob, ErrorCode.RESOURCE_CONFIGURATION_ADDRESS, ME, "No callback to '" + addr + "' possible, class needs to implement interface I_XmlBlasterCallback.");      }   }   private I_XmlBlasterCallback getCb() throws XmlBlasterException {      if (cb == null)         throw new XmlBlasterException(glob, ErrorCode.RESOURCE_CONFIGURATION_ADDRESS, ME, "No callback to '" + callbackAddress.getRawAddress() + "' possible, no connection.");      return cb;   }   /**    * This sends the update to the client.    * @exception Exceptions thrown from client are re thrown as ErrorCode.USER*    */   public final String[] sendUpdate(MsgUnitRaw[] msgArr) throws XmlBlasterException   {      if (msgArr == null || msgArr.length < 1)         throw new XmlBlasterException(glob, ErrorCode.INTERNAL_ILLEGALARGUMENT, ME, "Illegal sendUpdate() argument");      if (log.isLoggable(Level.FINE)) log.fine("xmlBlaster.update() to " + callbackAddress.getSecretSessionId());      try {         return getCb().update(callbackAddress.getSecretSessionId(), msgArr);      } catch (RemoteException remote) {         Throwable nested = remote.detail;         if (nested != null && nested instanceof XmlBlasterException) {            XmlBlasterException xmlBlasterException = (XmlBlasterException)nested;            throw XmlBlasterException.tranformCallbackException(xmlBlasterException);            /*            // WE ONLY ACCEPT ErrorCode.USER... FROM CLIENTS !            if (xmlBlasterException.isUser())               throw xmlBlasterException;            throw new XmlBlasterException(glob, ErrorCode.USER_UPDATE_ERROR, ME,                   "RMI Callback of " + msgArr.length +                   " messages to client [" + callbackAddress.getSecretSessionId() + "] failed.", xmlBlasterException);            */         }         throw new XmlBlasterException(glob, ErrorCode.COMMUNICATION_NOCONNECTION, ME,                     "RMI Callback of " + msgArr.length + " messages to client [" + callbackAddress.getSecretSessionId() + "] failed", remote);      }   }   /**    * The oneway variant, without return value.     * @exception XmlBlasterException Is never from the client (oneway).    */   public void sendUpdateOneway(MsgUnitRaw[] msgArr) throws XmlBlasterException   {      if (msgArr == null || msgArr.length < 1)         throw new XmlBlasterException(glob, ErrorCode.INTERNAL_ILLEGALARGUMENT, ME, "Illegal sendUpdateOneway() argument");      if (log.isLoggable(Level.FINE)) log.fine("xmlBlaster.updateOneway() to " + callbackAddress.getSecretSessionId());      try {         getCb().updateOneway(callbackAddress.getSecretSessionId(), msgArr);      } catch (Throwable e) {         throw new XmlBlasterException(glob, ErrorCode.COMMUNICATION_NOCONNECTION, ME,            "RMI oneway callback of message to client [" + callbackAddress.getSecretSessionId() + "] failed", e);      }   }   /**    * Ping to check if callback server is alive.     * This ping checks the availability on the application level.    * @param qos Currently an empty string ""    * @return    Currently an empty string ""    * @exception XmlBlasterException If client not reachable    */   public final String ping(String qos) throws XmlBlasterException   {      try {         return getCb().ping(qos);      } catch (Throwable e) {         throw new XmlBlasterException(glob, ErrorCode.COMMUNICATION_NOCONNECTION, ME,                     "RMI callback ping failed", e);      }   }   public I_ProgressListener registerProgressListener(I_ProgressListener listener) {      if (log.isLoggable(Level.FINE)) log.fine("Registering I_ProgressListener is not supported with this protocol plugin");      return null;   }   /**    * This method shuts down the driver.    * <p />    */   public void shutdown()   {      // How do we close the socket??      cb = null;      callbackAddress = null;      if (log.isLoggable(Level.FINE)) log.fine("Shutdown implementation is missing");   }   /**    * @return true if the plugin is still alive, false otherwise    */   public boolean isAlive() {      return true;   }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -