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

📄 isoserver.java

📁 POS is a Java&#174 platform-based, mission-critical, ISO-8583 based financial transaction library/fr
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
        ServerChannel  channel;        serverLoop : while  (!shutdown) {                try {                serverSocket = socketFactory != null ?                        socketFactory.createServerSocket(port) :                        (new ServerSocket (port, backlog, bindAddr));                                Logger.log (new LogEvent (this, "iso-server",                     "listening on " + (bindAddr != null ? bindAddr + ":" : "port ") + port                    + (backlog > 0 ? " backlog="+backlog : "")                ));                while (!shutdown) {                    try {                        if (pool.getAvailableCount() <= 0) {                            try {                                serverSocket.close();                            } catch (IOException e){                                Logger.log (new LogEvent (this, "iso-server", e));                                relax();                            }                                                        for (int i=0; pool.getAvailableCount() <= 0; i++) {                                ISOUtil.sleep (250);                                if (shutdown) break serverLoop;                                if (i % 240 == 0) {                                    LogEvent evt = new LogEvent (this, "warn");                                    evt.addMessage (                                        "pool exhausted " + serverSocket.toString()                                    );                                    evt.addMessage (pool);                                    Logger.log (evt);                                }                            }                                        serverSocket = socketFactory != null ?                                socketFactory.createServerSocket(port) :                                (new ServerSocket (port, backlog, bindAddr));                        }                        channel = (ServerChannel) clientSideChannel.clone();                        channel.accept (serverSocket);                        if ((cnt[CONNECT]++) % 100 == 0)                            purgeChannels ();                        WeakReference wr = new WeakReference (channel);                        channels.put (channel.getName(), wr);                        channels.put (LAST, wr);                        setChanged ();                        notifyObservers (channel);                        pool.execute (createSession(channel));                    } catch (SocketException e) {                        if (!shutdown)                            Logger.log (new LogEvent (this, "iso-server", e));                    } catch (IOException e) {                        Logger.log (new LogEvent (this, "iso-server", e));                        relax();                    }                }            } catch (Throwable e) {                Logger.log (new LogEvent (this, "iso-server", e));                relax();            }        }    }    private void relax() {        try {            Thread.sleep (5000);        } catch (InterruptedException e) { }    }    /**     * associates this ISOServer with a name using NameRegistrar     * @param name name to register     * @see NameRegistrar     */    public void setName (String name) {        this.name = name;        NameRegistrar.register ("server."+name, this);    }    /**     * @return ISOMUX instance with given name.     * @throws NameRegistrar.NotFoundException;     * @see NameRegistrar     */    public static ISOServer getServer (String name)        throws NameRegistrar.NotFoundException    {        return (ISOServer) NameRegistrar.get ("server."+name);    }    /**     * @return this ISOServer's name ("" if no name was set)     */    public String getName() {        return this.name;    }    public void setLogger (Logger logger, String realm) {        this.logger = logger;        this.realm  = realm;        this.realmChannel = realm + ".channel";    }    public String getRealm () {        return realm;    }    public Logger getLogger() {        return logger;    }    public void update(Observable o, Object arg) {        setChanged ();        notifyObservers (arg);    }   /**    * Gets the ISOClientSocketFactory (may be null)    * @see     ISOClientSocketFactory    * @since 1.3.3    */    public ISOServerSocketFactory getSocketFactory() {        return socketFactory;    }   /**    * Sets the specified Socket Factory to create sockets    * @param         socketFactory the ISOClientSocketFactory    * @see           ISOClientSocketFactory    * @since 1.3.3    */    public void setSocketFactory(ISOServerSocketFactory socketFactory) {        this.socketFactory = socketFactory;    }    public int getPort () {        return port;    }    public void resetCounters () {        cnt = new int[SIZEOF_CNT];    }    /**     * @return number of connections accepted by this server     */    public int getConnectionCount () {        return cnt[CONNECT];    }    // ThreadPoolMBean implementation (delegate calls to pool)    public int getJobCount () {        return pool.getJobCount();    }    public int getPoolSize () {        return pool.getPoolSize();    }    public int getMaxPoolSize () {        return pool.getMaxPoolSize();    }    public int getIdleCount() {        return pool.getIdleCount();    }    public int getPendingCount () {        return pool.getPendingCount();    }    /**     * @return most recently connected ISOChannel or null     */    public ISOChannel getLastConnectedISOChannel () {        return getISOChannel (LAST);    }    /**     * @return ISOChannel under the given name     */    public ISOChannel getISOChannel (String name) {        WeakReference ref = (WeakReference) channels.get (name);        if (ref != null)            return (ISOChannel) ref.get ();        return null;    }    public void setConfiguration (Configuration cfg) throws ConfigurationException {        this.cfg = cfg;        allow = cfg.getAll ("allow");        backlog = cfg.getInt ("backlog", 0);        ignoreISOExceptions = cfg.getBoolean("ignore-iso-exceptions");        String ip = cfg.get ("bind-address", null);        if (ip != null) {            try {                bindAddr = InetAddress.getByName (ip);            } catch (UnknownHostException e) {                throw new ConfigurationException ("Invalid bind-address " + ip, e);            }        }        if (socketFactory != this && socketFactory instanceof Configurable) {            ((Configurable)socketFactory).setConfiguration (cfg);        }    }    public String getISOChannelNames () {        StringBuffer sb = new StringBuffer ();        Iterator iter = channels.entrySet().iterator();        for (int i=0; iter.hasNext(); i++) {            Map.Entry entry = (Map.Entry) iter.next();            WeakReference ref = (WeakReference) entry.getValue();            ISOChannel c = (ISOChannel) ref.get ();            if (c != null && !LAST.equals (entry.getKey())) {                if (i > 0)                    sb.append (' ');                sb.append (entry.getKey());            }        }        return sb.toString();    }    public String getCountersAsString () {        StringBuffer sb = new StringBuffer ();        Iterator iter = channels.entrySet().iterator();        int[] cnt = new int[2];        int connectedChannels = 0;        for (int i=0; iter.hasNext(); i++) {            Map.Entry entry = (Map.Entry) iter.next();            WeakReference ref = (WeakReference) entry.getValue();            ISOChannel c = (ISOChannel) ref.get ();            if (c != null && !LAST.equals (entry.getKey()) && c.isConnected()) {                connectedChannels++;                if (c instanceof BaseChannel) {                    int[] cc = ((BaseChannel)c).getCounters();                    cnt[0] += cc[ISOChannel.RX];                    cnt[1] += cc[ISOChannel.TX];                }            }        }        sb.append ("connected="+connectedChannels);        sb.append (", rx=" + Integer.toString(cnt[0]));        sb.append (", tx=" + Integer.toString(cnt[1]));        return sb.toString();    }    public String getCountersAsString (String isoChannelName) {        ISOChannel channel = getISOChannel(isoChannelName);        StringBuffer sb = new StringBuffer();        if (channel instanceof BaseChannel) {            int[] counters = ((BaseChannel)channel).getCounters();            append (sb, "rx=", counters[ISOChannel.RX]);            append (sb, ", tx=", counters[ISOChannel.TX]);            append (sb, ", connects=", counters[ISOChannel.CONNECT]);        }        return sb.toString();    }    public void dump (PrintStream p, String indent) {        p.println (indent + getCountersAsString());        Iterator iter = channels.entrySet().iterator();        String inner = indent + "  ";        for (int i=0; iter.hasNext(); i++) {            Map.Entry entry = (Map.Entry) iter.next();            WeakReference ref = (WeakReference) entry.getValue();            ISOChannel c = (ISOChannel) ref.get ();            if (c != null && !LAST.equals (entry.getKey()) && c.isConnected()) {                if (c instanceof BaseChannel) {                    StringBuffer sb = new StringBuffer ();                    int[] cc = ((BaseChannel)c).getCounters();                    sb.append (inner);                    sb.append (entry.getKey());                    sb.append (": rx=");                    sb.append (Integer.toString (cc[ISOChannel.RX]));                    sb.append (", tx=");                    sb.append (Integer.toString (cc[ISOChannel.TX]));                    p.println (sb.toString());                }            }        }    }    private void append (StringBuffer sb, String name, int value) {        sb.append (name);        sb.append (value);    }}

⌨️ 快捷键说明

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