<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    paulwong

    #

    CAMUNDA工作流引擎

    CAMUNDA工作流引擎是一套可以支持,自定義表單,提供WEB界面來跑流程,監(jiān)控流程有多少個實例的WEB應用工具。

    1. 定義流程和表單
      使用ECLIPSE的插件來定義流程,表單可以自己畫好HTML,再接入到節(jié)點中


    2. 部署流程
      生成WAR部署到TOMCAT服務器即可,如要再次對流程進行修改,再次生成WAR再次部署即可。


    3. 跑流程
      訪問http://localhost:9090/tasklist即可


    4. 監(jiān)控流程
      訪問http://localhost:9090/cockpit即可,實際只是可以查看有多少流程定義和多少個流程實例在跑


    安裝手冊:
    http://docs.camunda.org/guides/installation-guide/

    快速上手:
    http://www.camunda.org/get-started/developing-process-applications.html

    CAMUNDA+MULA
    https://app.camunda.com/confluence/display/foxUserGuide/Bank+Account+Opening

    posted @ 2013-06-03 16:47 paulwong 閱讀(2730) | 評論 (0)編輯 收藏

    GOOGLEREADER替代品

    https://www.inoreader.com

    posted @ 2013-06-02 20:33 paulwong 閱讀(231) | 評論 (0)編輯 收藏

    (轉(zhuǎn))個人總結(jié):京東技術(shù)體系員工級別劃分及薪資區(qū)間

    管理層級
    序列層級職銜對應T序薪資區(qū)間(技術(shù))
    M5CXO————
    M5VP————
    M4-3高級總監(jiān)————
    M4-2總監(jiān)T540-50k
    M4-1副總監(jiān)T535-45k
    M3高級經(jīng)理T4-230-40k
    M2-2經(jīng)理T4-125-35k
    M2-1副經(jīng)理T3-220-30k
    M1主管T3-115-25k

     

    技術(shù)層級
    序列層級職銜對應M序薪資區(qū)間(技術(shù))
    T5-3專家3總監(jiān)/副總監(jiān)35-50k
    T5-2專家2總監(jiān)/副總監(jiān)35-50k
    T5-1專家1總監(jiān)/副總監(jiān)35-50k
    T4-2資深2高級經(jīng)理30-40k
    T4-1資深1經(jīng)理25-35k
    T3-2高級2副經(jīng)理20-30k
    T3-1高級1主管15-25k
    T2-2中級2——10-20K
    T2-1中級1——5-15K
    T1-2初級2——5-10K
    T1-1初級1——0-8k

    posted @ 2013-05-26 14:41 paulwong 閱讀(52637) | 評論 (1)編輯 收藏

    IOS開發(fā)資源

    【原創(chuàng)】iOS開發(fā)入門教程
    http://my.oschina.net/mailzwj/blog/133273

    posted @ 2013-05-26 13:26 paulwong 閱讀(290) | 評論 (0)編輯 收藏

    ANDROID APP 與 WEB APP的比較

    ANDROID APP 與 WEB APP有相似之處,都是需要在容器內(nèi)運行,都可以對事件進行響應。

    WEB APP的核心組件是SERVLET,這是對游覽器事件進行響應的一個類,事件有GET/POST等事件,不同的URL對應不同的SERVLET。
    如果要輸出不同的內(nèi)容,則輸出不同的HTML即可。
    WEB APP的配置文件是WEB.XML,當容器啟動時,會從這讀取有多少個SERVLET。當瀏覽器發(fā)過來不同的URL請求時,會從中選擇相應的SERVLET執(zhí)行。

    ANDROID APP的核心組件是ACTIVITY,這是一個對系統(tǒng)事件進行響應的一個類,事件有啟動事件,菜單點擊事件等,點擊不同的地方對應不同的ACTIVITY。
    如果要輸出不同的內(nèi)容,則輸出不同的VIEW即可。
    ANDROID APP的配置文件是MAINFRE.XML,當應用被部署到系統(tǒng)時,系統(tǒng)會從這讀取有多少個ACTIVITY。當不同的事件發(fā)生時,系統(tǒng)會會從中選擇相應的ACTIVITY執(zhí)行。

    posted @ 2013-05-26 00:59 paulwong 閱讀(375) | 評論 (0)編輯 收藏

    Architecture Representation

    The architecture representation will basically adopt the 4 + 1 View Model as 
    recommended, to organize the architectural description from different perspectives, each 
    of which addresses a specific set of concerns: 
    • Requirement View – describes the software requirements, functional and 
    non-functional, illustrated by significant use cases and scenarios. 

    • Logical View – describes the object model of the design, the system 
    decomposition into layers and subsystems, and the dependencies between them. 

    • Process View – describes the concurrency and synchronization aspects of the 
    design. 

    • Implementation View – describes the software’s static organization in the 
    development environment. 

    • Deployment View – describes the mapping of the software onto hardware. 

    • Data View – describes the database design for the software. 

    It allows various stakeholders to find what they need in the software architecture. System 
    engineers can approach it from the logical view, process view and deployment view. DBA 
    can approach it from the data view. Project managers and software configuration 
    managers can approach it from the development view.


    Demo:
    • CUHK RFID - White Paper 

    • Middleware Quick Start Guide 

    • Tag Capturer Quick Start Guide 

    • Middleware System Design Document 

    • Tag Capturer System Design Document 

    • Middleware Test Cases 

    • Middleware Test Plan 

    • Middleware Source Code 

    posted @ 2013-05-21 11:02 paulwong 閱讀(214) | 評論 (0)編輯 收藏

    MINA資源

    socket 通信
    http://yaojialing.iteye.com/category/115609

    使用 Apache MINA 2 開發(fā)網(wǎng)絡應用
    http://www.ibm.com/developerworks/cn/java/j-lo-mina2/

    直接操作mina的IoBuffer流
    http://autumnice.blog.163.com/blog/static/555200201011493410310/

    pache mina 學習(十一)-----狀態(tài)機(stateMachine)
    http://cages.iteye.com/blog/1530849

    運用 Apache MINA 2 開發(fā)網(wǎng)絡運用 [多圖]
    http://www.lj8lj8.com/chengxukaifa/Java/338853_13.html


    posted @ 2013-05-14 17:41 paulwong 閱讀(318) | 評論 (0)編輯 收藏

    Oracle數(shù)據(jù)庫備份與還原命令[轉(zhuǎn)]

    數(shù)據(jù)導出:

    1 將數(shù)據(jù)庫TEST完全導出,用戶名system 密碼manager 導出到D:\daochu.dmp中

    exp system/manager@TEST file=d:\daochu.dmp full=y

    2 將數(shù)據(jù)庫中system用戶與sys用戶的表導出

    exp system/manager@TEST file=d:\daochu.dmp owner=(system,sys)

    3 將數(shù)據(jù)庫中的表table1 、table2導出

    exp system/manager@TEST file=d:\daochu.dmp tables=(table1,table2)

    4 將數(shù)據(jù)庫中的表table1中的字段filed1以"00"打頭的數(shù)據(jù)導出

    exp system/manager@TEST file=d:\daochu.dmp tables=(table1)query=\" where filed1 like '00%'\"

    上面是常用的導出,對于壓縮我不太在意,用winzip把dmp文件可以很好的壓縮。

    不過在上面命令后面 加上 compress=y 就可以了

    數(shù)據(jù)的導入

    1 將D:\daochu.dmp 中的數(shù)據(jù)導入 TEST數(shù)據(jù)庫中。

    imp system/manager@TEST file=d:\daochu.dmp

    上面可能有點問題,因為有的表已經(jīng)存在,然后它就報錯,對該表就不進行導入。

    在后面加上 ignore=y 就可以了。

    2 將d:\daochu.dmp中的表table1 導入

    imp system/manager@TEST file=d:\daochu.dmp tables=(table1)

    基本上上面的導入導出夠用了。不少情況我是將表徹底刪除,然后導入。

    注意:

    你要有足夠的權(quán)限,權(quán)限不夠它會提示你。

    數(shù)據(jù)庫時可以連上的。可以用tnsping TEST 來獲得數(shù)據(jù)庫TEST能否連上

    附錄一:
    給用戶增加導入數(shù)據(jù)權(quán)限的操作
    第一,啟動sql*puls
    第二,以system/manager登陸
    第三,create user 用戶名 IDENTIFIED BY 密碼 (如果已經(jīng)創(chuàng)建過用戶,這步可以省略)
    第四,GRANT CREATE USER,DROP USER,ALTER USER ,CREATE ANY VIEW ,
    DROP ANY VIEW,EXP_FULL_DATABASE,IMP_FULL_DATABASE,
    DBA,CONNECT,RESOURCE,CREATE SESSION TO 用戶名字
    第五, 運行-cmd-進入dmp文件所在的目錄,
    imp userid=system/manager full=y file=*.dmp
    或者 imp userid=system/manager full=y file=filename.dmp



    安裝oracle9I
    Szportdb\szportdb\szportdb
    用sysdba 登錄建立用戶:szportdb 表空間可以自己設定,也可以Users
    倒入數(shù)據(jù)庫。

    Imp szportdb/szportdb@szportdb full=y C:\szportdb.dmp ignore=

    posted @ 2013-05-12 15:07 paulwong 閱讀(1794) | 評論 (0)編輯 收藏

    基于Apache Mina實現(xiàn)的TCP長連接和短連接實例

    1、前言

    Apache MINA是Apache組織的一個優(yōu)秀的項目。MINA是Multipurpose Infrastructure for NetworkApplications的縮寫。它是一個網(wǎng)絡應用程序框架,用來幫助用戶非常方便地開發(fā)高性能和高可靠性的網(wǎng)絡應用程序。在本文中介紹了 如何通過Apache Mina2.0來實現(xiàn)TCP協(xié)議長連接和短連接應用。

    2、系統(tǒng)介紹

    2.1系統(tǒng)框架

    整個系統(tǒng)由兩個服務端程序和兩個客戶端程序組成。分別實現(xiàn)TCP長連接和短連接通信。

    系統(tǒng)業(yè)務邏輯是一個客戶端與服務端建立長連接,一個客戶端與服務端建立短連接。數(shù)據(jù)從短連接客戶端經(jīng)過服務端發(fā)送到長連接客戶端,并從長連接客戶端接收響應數(shù)據(jù)。當收到響應數(shù)據(jù)后斷開連接。

    系統(tǒng)架構(gòu)圖如下:


    2.2處理流程

    系統(tǒng)處理流程如下:

    1) 啟動服務端程序,監(jiān)聽8001和8002端口。

    2) 長連接客戶端向服務端8002端口建立連接,服務端將連接對象保存到共享內(nèi)存中。由于采用長連接方式,連接對象是唯一的。

    3) 短連接客戶端向服務端8001端口建立連接。建立連接后創(chuàng)建一個連接對象。

    4) 短連接客戶端連接成功后發(fā)送數(shù)據(jù)。服務端接收到數(shù)據(jù)后從共享內(nèi)存中得到長連接方式的連接對象,使用此對象向長連接客戶端發(fā)送數(shù)據(jù)。發(fā)送前將短連接對象設為長連接對象的屬性值。

    5) 長連接客戶端接收到數(shù)據(jù)后返回響應數(shù)據(jù)。服務端從長連接對象的屬性中取得短連接對象,通過此對象將響應數(shù)據(jù)發(fā)送給短連接客戶端。

    6) 短連接客戶端收到響應數(shù)據(jù)后,關(guān)閉連接。

    3、服務端程序

    3.1長連接服務端

    服務啟動

    public class MinaLongConnServer {

    private static final int PORT = 8002;



    public void start()throws IOException{

    IoAcceptor acceptor = new NioSocketAcceptor();



    acceptor.getFilterChain().addLast("logger", new LoggingFilter());

    acceptor.getFilterChain().addLast("codec", newProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));



    acceptor.setHandler(new MinaLongConnServerHandler());

    acceptor.getSessionConfig().setReadBufferSize(2048);

    acceptor.bind(new InetSocketAddress(PORT));

    System.out.println("Listeningon port " + PORT);

    }

    }

    //消息處理

    public class MinaLongConnServerHandler extends IoHandlerAdapter {

    private final Logger logger = (Logger) LoggerFactory.getLogger(getClass());



    @Override

    public void sessionOpened(IoSession session) {

    InetSocketAddress remoteAddress = (InetSocketAddress)session.getRemoteAddress();

    String clientIp = remoteAddress.getAddress().getHostAddress();

    logger.info("LongConnect Server opened Session ID ="+String.valueOf(session.getId()));

    logger.info("接收來自客戶端 :" + clientIp + "的連接.");

    Initialization init = Initialization.getInstance();

    HashMap<String, IoSession> clientMap =init.getClientMap();

    clientMap.put(clientIp, session);

    }



    @Override

    public void messageReceived(IoSession session, Object message) {

    logger.info("Messagereceived in the long connect server..");

    String expression = message.toString();

    logger.info("Message is:" + expression);

    IoSession shortConnSession =(IoSession) session.getAttribute("shortConnSession");

    logger.info("ShortConnect Server Session ID ="+String.valueOf(shortConnSession.getId()));

    shortConnSession.write(expression);

    }



    @Override

    public void sessionIdle(IoSession session, IdleStatus status) {

    logger.info("Disconnectingthe idle.");

    // disconnect an idle client

    session.close(true);

    }



    @Override

    public void exceptionCaught(IoSession session, Throwable cause) {

    // close the connection onexceptional situation

    logger.warn(cause.getMessage(), cause);

    session.close(true);

    }

    }

    3.2短連接服務端

    服務啟動

    public class MinaShortConnServer {

    private static final int PORT = 8001;



    public void start()throws IOException{

    IoAcceptor acceptor = new NioSocketAcceptor();



    acceptor.getFilterChain().addLast("logger", new LoggingFilter());

    acceptor.getFilterChain().addLast("codec", newProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));



    acceptor.setHandler(new MinaShortConnServerHandler());

    acceptor.getSessionConfig().setReadBufferSize(2048);

    acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 3);

    acceptor.bind(new InetSocketAddress(PORT));

    System.out.println("Listeningon port " + PORT);

    }

    }

    消息處理

    public class MinaShortConnServerHandler extends IoHandlerAdapter {

    private final Logger logger = (Logger) LoggerFactory.getLogger(getClass());



    @Override

    public void sessionOpened(IoSession session) {

    InetSocketAddress remoteAddress = (InetSocketAddress)session.getRemoteAddress();

    logger.info(remoteAddress.getAddress().getHostAddress());

    logger.info(String.valueOf(session.getId()));

    }



    @Override

    public void messageReceived(IoSession session, Object message) {

    logger.info("Messagereceived in the short connect server");

    String expression = message.toString();

    Initialization init = Initialization.getInstance();

    HashMap<String, IoSession> clientMap =init.getClientMap();

    if (clientMap == null || clientMap.size() == 0) {

    session.write("error");

    else {

    IoSession longConnSession = null;

    Iterator<String> iterator =clientMap.keySet().iterator();

    String key = "";

    while (iterator.hasNext()) {

    key = iterator.next();

    longConnSession = clientMap.get(key);

    }

    logger.info("ShortConnect Server Session ID :"+String.valueOf(session.getId()));

    logger.info("LongConnect Server Session ID :"+String.valueOf(longConnSession.getId()));

    longConnSession.setAttribute("shortConnSession",session);

    longConnSession.write(expression);

    }

    }



    @Override

    public void sessionIdle(IoSession session, IdleStatus status) {

    logger.info("Disconnectingthe idle.");

    // disconnect an idle client

    session.close(true);

    }



    @Override

    public void exceptionCaught(IoSession session, Throwable cause) {

    // close the connection onexceptional situation

    logger.warn(cause.getMessage(), cause);

    session.close(true);

    }

    }



    4、客戶端程序

    4.1長連接客戶端

    使用java.net.Socket來實現(xiàn)向服務端建立連接。Socket建立后一直保持連接,從服務端接收到數(shù)據(jù)包后直接將原文返回。

    public class TcpKeepAliveClient {

    private String ip;

    private int port;

    private static Socket socket = null;

    private static int timeout = 50 * 1000;



    public TcpKeepAliveClient(String ip, int port) {

    this.ip = ip;

    this.port = port;

    }



    public void receiveAndSend() throws IOException {

    InputStream input = null;

    OutputStream output = null;



    try {

    if (socket == null || socket.isClosed() || !socket.isConnected()) {

    socket = new Socket();

    InetSocketAddress addr = new InetSocketAddress(ip, port);

    socket.connect(addr, timeout);

    socket.setSoTimeout(timeout);

    System.out.println("TcpKeepAliveClientnew ");

    }



    input = socket.getInputStream();

    output = socket.getOutputStream();



    // read body

    byte[] receiveBytes = {};// 收到的包字節(jié)數(shù)組

    while (true) {

    if (input.available() > 0) {

    receiveBytes = new byte[input.available()];

    input.read(receiveBytes);



    // send

    System.out.println("TcpKeepAliveClientsend date :" + new String(receiveBytes));

    output.write(receiveBytes, 0, receiveBytes.length);

    output.flush();

    }

    }



    catch (Exception e) {

    e.printStackTrace();

    System.out.println("TcpClientnew socket error");

    }

    }



    public static void main(String[] args) throws Exception {

    TcpKeepAliveClient client = new TcpKeepAliveClient("127.0.0.1", 8002);

    client.receiveAndSend();

    }



    }

    4.2短連接客戶端

    服務啟動

    public class MinaShortClient {

    private static final int PORT = 8001;



    public static void main(String[] args) throws IOException,InterruptedException {

    IoConnector connector = new NioSocketConnector();

    connector.getSessionConfig().setReadBufferSize(2048);



    connector.getFilterChain().addLast("logger", new LoggingFilter());

    connector.getFilterChain().addLast("codec", newProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));



    connector.setHandler(new MinaShortClientHandler());

    for (int i = 1; i <= 10; i++) {

    ConnectFuture future = connector.connect(new InetSocketAddress("127.0.0.1", PORT));

    future.awaitUninterruptibly();

    IoSession session =future.getSession();

    session.write(i);

    session.getCloseFuture().awaitUninterruptibly();



    System.out.println("result=" + session.getAttribute("result"));

    }

    connector.dispose();



    }

    }

    消息處理

    public class MinaShortClientHandler extends IoHandlerAdapter{

    private final Logger logger = (Logger) LoggerFactory.getLogger(getClass());



    public MinaShortClientHandler() {



    }



    @Override

    public void sessionOpened(IoSession session) {

    }



    @Override

    public void messageReceived(IoSession session, Object message) {

    logger.info("Messagereceived in the client..");

    logger.info("Message is:" + message.toString());

    session.setAttribute("result", message.toString());

    session.close(true);

    }



    @Override

    public void exceptionCaught(IoSession session, Throwable cause) {

    session.close(true);

    }

    }

    5、總結(jié)

    通過本文中的例子,Apache Mina在服務端可實現(xiàn)TCP協(xié)議長連接和短連接。在客戶端只實現(xiàn)了短連接模式,長連接模式也是可以實現(xiàn)的(在本文中還是采用傳統(tǒng)的java Socket方式)。兩個服務端之間通過共享內(nèi)存的方式來傳遞連接對象也許有更好的實現(xiàn)方式。

    posted @ 2013-05-11 21:56 paulwong 閱讀(558) | 評論 (0)編輯 收藏

    使用 Apache MINA 開發(fā)高性能網(wǎng)絡應用程序[轉(zhuǎn)]

    本文將通過一個簡單的問候程序 HelloServer 來介紹 MINA 的基礎架構(gòu)的同時演示如何使用 MINA 開發(fā)網(wǎng)絡應用程序。
    Apache MINA(Multipurpose Infrastructure for Network Applications) 是 Apache 組織一個較新的項目,它為開發(fā)高性能和高可用性的網(wǎng)絡應用程序提供了非常便利的框架。當前發(fā)行的 MINA 版本支持基于 Java NIO 技術(shù)的 TCP/UDP 應用程序開發(fā)、串口通訊程序(只在最新的預覽版中提供),MINA 所支持的功能也在進一步的擴展中。

    目前正在使用 MINA 的軟件包括有:Apache Directory Project、AsyncWeb、AMQP(Advanced Message Queuing Protocol)、RED5 Server(Macromedia Flash Media RTMP)、ObjectRADIUS、Openfire 等等。

    本文將通過一個簡單的問候程序 HelloServer 來介紹 MINA 的基礎架構(gòu)的同時演示如何使用MINA 開發(fā)網(wǎng)絡應用程序。

    環(huán)境準備

    首先到官方網(wǎng)站下載最新的 MINA 版本,地址是:http://mina.apache.org/downloads.html。下載之前先介紹一下 MINA 的兩個版本:1.0.x 適合運行環(huán)境為 JDK1.4,1.1.x 適合 JDK1.5 的版本,兩者的編譯環(huán)境都需要 JDK1.5。JDK1.5 已經(jīng)是非常普遍了,本文中使用 1.1.5 版本的 MINA,編譯和運行所需的文件是 mina-core-1.1.5.jar。
    下載 MINA 的依賴包 slf4j。MINA 使用此項目作為日志信息的輸出,而 MINA 本身并不附帶此項目包,請到http://www.slf4j.org/download.html 地址下載 slf4j 包,slf4j 項目解壓后有很多的文件,本例中只需要其中的 slf4j-api-1.4.3.jar 和 slf4j-simple-1.4.3.jar 這兩個 jar 文件。如果沒有這兩個文件就會導致啟動例子程序的時候報 org/slf4j/LoggerFactory 類沒找到的錯誤。
    當然要求機器上必須裝有 1.5 或者更新版本的 JDK。
    最好你應該選擇一個順手的 Java 開發(fā)環(huán)境例如 Eclipse 或者 NetBeans 之類的,可以更方便的編碼和調(diào)試,雖然我們的最低要求只是一個簡單的文本編輯器而已。



    編寫代碼并執(zhí)行

    編寫代碼 HelloServer.java 如下

    package demo.mina.echo;

    import java.io.IOException;
    import java.net.InetSocketAddress;

    import org.apache.mina.common.*;
    import org.apache.mina.transport.socket.nio.*;
    import org.apache.mina.filter.codec.ProtocolCodecFilter;
    import org.apache.mina.filter.codec.textline.TextLineCodecFactory;

    /**
     * HelloServer演示程序
     * 
    @author liudong (
                        
    http://www.dlog.cn/javayou
                    )
     
    */
    public class HelloServer {

        private static final int PORT = 8080;
    /**
     * 
    @param args
     * 
    @throws IOException 
     
    */
    public static void main(String[] args) throws IOException {
            IoAcceptor acceptor = new SocketAcceptor();        
            IoAcceptorConfig config = new SocketAcceptorConfig();
            DefaultIoFilterChainBuilder chain = config.getFilterChain();
            //使用字符串編碼
            chain.addLast("codec", 
    new ProtocolCodecFilter(new TextLineCodecFactory()));
            //啟動HelloServer
            acceptor.bind(new InetSocketAddress(PORT), new HelloHandler(), config);
            System.out
    .println("HelloServer started on port " + 
    PORT);
        }
    }

    /**
     * HelloServer的處理邏輯
     * 
    @author liudong
     
    */
    class HelloHandler extends IoHandlerAdapter {
    /**
     * 當有異常發(fā)生時觸發(fā)
     
    */
    @Override
        public void exceptionCaught(IoSession ssn, Throwable cause) {
            cause.printStackTrace();
            ssn.close();
        }

    /**
     * 有新連接時觸發(fā)
     
    */
    @Override
    public void sessionOpened(IoSession ssn) throws Exception {
        System.out.println("session open for " + ssn.getRemoteAddress());
        }

    /**
     * 連接被關(guān)閉時觸發(fā)
     
    */
    @Override
    public void sessionClosed(IoSession ssn) throws Exception {
        System.out.println("session closed from " + ssn.getRemoteAddress());
        }

    /**
     * 收到來自客戶端的消息
     
    */
    public void messageReceived(IoSession ssn, Object msg) throws Exception {    
        String ip = ssn.getRemoteAddress().toString();
    System.out.println("===> Message From " + ip +" : " + msg);    
        ssn.write("Hello " + msg);
        }
    }

    編譯執(zhí)行
    先不用試著去讀懂每一行代碼的具體意思,用你順手的編譯器編譯 HelloServer.java,如果報錯請確認是否已將前面提到的三個 jar 文件添加至類路徑中。如果一切順利接著就可以啟動HelloServer 程序,啟動后提示:HelloServer started on port 8080 表示啟動成功,如果啟動失敗,問題無外乎是類沒找到或者端口占用。如果端口被占用的話,換一個羅,修改 PORT 常量值后再次編譯并啟動。

    測試服務器
    打開命令行窗口,輸入 telnet localhost 8080 后,輸入您的英文名或者其他一些亂七八糟的字符后回車再去看看剛啟動的服務程序有何反應。我的反應如下:

    HelloServer started on port 8080
    session open for /127.0.0.1:3023
    ===> Message From /127.0.0.1:3023 :hello
    ===> Message From /127.0.0.1:3023 :hello
    ===> Message From /127.0.0.1:3023 :liudong
    ===> Message From /127.0.0.1:3023 :Winter Lau



    好了,一切正常,恭喜你的第一個使用 MINA 開發(fā)的網(wǎng)絡程序已經(jīng)成功運行了。




    MINA 基本類的描述

    在介紹架構(gòu)之前先認識幾個接口:

    IoAccepter 相當于網(wǎng)絡應用程序中的服務器端

    IoConnector 相當于客戶端

    IoSession 當前客戶端到服務器端的一個連接實例

    IoHandler 業(yè)務處理邏輯

    IoFilter 過濾器用于懸接通訊層接口與業(yè)務層接口






    MINA 的基礎架構(gòu)

    下圖是 MINA 的架構(gòu)圖,


    圖 1:MINA 的架構(gòu)圖


    在圖中的模塊鏈中,IoService 便是應用程序的入口,相當于我們前面代碼中的 IoAccepter,IoAccepter 便是 IoService 的一個擴展接口。IoService 接口可以用來添加多個 IoFilter,這些 IoFilter 符合責任鏈模式并由 IoProcessor 線程負責調(diào)用。而 IoAccepter 在 ioService 接口的基礎上還提供綁定某個通訊端口以及取消綁定的接口。在上面的例子中,我們是這樣使用 IoAccepter 的:

    IoAcceptor acceptor = new SocketAcceptor();



    相當于我們使用了 Socket 通訊方式作為服務的接入,當前版本的 MINA 還提供了除 SocketAccepter 外的基于數(shù)據(jù)報文通訊的 DatagramAccepter 以及基于管道通訊的 VmPipeAccepter。另外還包括串口通訊接入方式,目前基于串口通訊的接入方式已經(jīng)在最新測試版的 MINA 中提供。你也可以自行實現(xiàn) IoService 接口來使用自己的通訊方式。

    而在上圖中最右端也就是 IoHandler,這便是業(yè)務處理模塊。相當于前面例子中的 HelloHandler 類。在業(yè)務處理類中不需要去關(guān)心實際的通訊細節(jié),只管處理客戶端傳輸過來的信息即可。編寫 Handler 類就是使用 MINA 開發(fā)網(wǎng)絡應用程序的重心所在,相當于 MINA 已經(jīng)幫你處理了所有的通訊方面的細節(jié)問題。為了簡化 Handler 類,MINA 提供了 IoHandlerAdapter 類,此類僅僅是實現(xiàn)了 IoHandler 接口,但并不做任何處理。

    一個 IoHandler 接口中具有如下一些方法(摘自 MINA 的 API 文檔):

    void exceptionCaught(IoSession session, Throwable cause)
    當接口中其他方法拋出異常未被捕獲時觸發(fā)此方法
    void messageReceived(IoSession session, Object message)
    當接收到客戶端的請求信息后觸發(fā)此方法.
    void messageSent(IoSession session, Object message)
    當信息已經(jīng)傳送給客戶端后觸發(fā)此方法.
    void sessionClosed(IoSession session)
    當連接被關(guān)閉時觸發(fā),例如客戶端程序意外退出等等.
    void sessionCreated(IoSession session)
    當一個新客戶端連接后觸發(fā)此方法.
    void sessionIdle(IoSession session, IdleStatus status)
    當連接空閑時觸發(fā)此方法.
    void sessionOpened(IoSession session)
    當連接后打開時觸發(fā)此方法,一般此方法與 sessionCreated 會被同時觸發(fā)


    前面我們提到 IoService 是負責底層通訊接入,而 IoHandler 是負責業(yè)務處理的。那么 MINA 架構(gòu)圖中的 IoFilter 作何用途呢?答案是你想作何用途都可以。但是有一個用途卻是必須的,那就是作為 IoService 和 IoHandler 之間的橋梁。IoHandler 接口中最重要的一個方法是 messageReceived,這個方法的第二個參數(shù)是一個 Object 型的消息,總所周知,Object 是所有 Java 對象的基礎,那到底誰來決定這個消息到底是什么類型呢?答案也就在這個 IoFilter 中。在前面使用的例子中,我們添加了一個 IoFilter 是 new ProtocolCodecFilter(new TextLineCodecFactory()),這個過濾器的作用是將來自客戶端輸入的信息轉(zhuǎn)換成一行行的文本后傳遞給 IoHandler,因此我們可以在 messageReceived 中直接將 msg 對象強制轉(zhuǎn)換成 String 對象。

    而如果我們不提供任何過濾器的話,那么在 messageReceived 方法中的第二個參數(shù)類型就是一個 byte 的緩沖區(qū),對應的類是 org.apache.mina.common.ByteBuffer。雖然你也可以將解析客戶端信息放在 IoHandler 中來做,但這并不是推薦的做法,使原來清晰的模型又模糊起來,變得 IoHandler 不只是業(yè)務處理,還得充當協(xié)議解析的任務。

    MINA自身帶有一些常用的過濾器,例如LoggingFilter(日志記錄)、BlackListFilter(黑名單過濾)、CompressionFilter(壓縮)、SSLFilter(SSL加密)等。



    其他

    MINA 不僅僅是用來開發(fā)網(wǎng)絡服務器端應用程序,它一樣可以使用 IoConnector 來連接到各種各樣的網(wǎng)絡服務程序。

    通過本文中 HelloServer 這個例子,我們在驚嘆 MINA 可以帶來多么大便利的同時,還不得不為其卓越的性能而驕傲,據(jù)稱使用MINA開發(fā)服務器程序的性能已經(jīng)逼近使用 C/C++ 語言開發(fā)的網(wǎng)絡服務。作為 MINA 的入門文章,性能問題不在本文討論范圍內(nèi)。

    另外在 MINA 壓縮包中附帶有不少比 HelloServer 要好得多的例子,通過這些例子可以進一步的了解并掌握 MINA。




    參考資料

    http://mina.apache.org MINA 官方網(wǎng)站


    http://mina.apache.org/features.html 您可以在這里查看關(guān)于 MINA 的更多特性


    http://mina.apache.org/testimonials.html 看看別人是如何評價 MINA 的 http://asyncweb.safehaus.org/使用 MINA 開發(fā)的高性能 WEB 服務器 

    posted @ 2013-05-11 21:41 paulwong 閱讀(306) | 評論 (0)編輯 收藏

    僅列出標題
    共115頁: First 上一頁 65 66 67 68 69 70 71 72 73 下一頁 Last 
    主站蜘蛛池模板: 四虎影院免费视频| 久久狠狠爱亚洲综合影院 | 成人亚洲性情网站WWW在线观看| 国产成在线观看免费视频| 国产色爽免费无码视频| 日日躁狠狠躁狠狠爱免费视频| 久久亚洲精品国产精品婷婷| 亚洲精品免费在线| 亚洲伦理一区二区| 久久久亚洲精品国产| 亚洲午夜国产精品无码 | 最近国语视频在线观看免费播放 | 99精品视频在线免费观看 | 欧洲乱码伦视频免费| 狼群影院在线观看免费观看直播 | 亚洲第一成人在线| 亚洲av无码国产精品色午夜字幕| 国产免费一区二区三区VR| 韩国日本好看电影免费看| 我要看WWW免费看插插视频| 欧美好看的免费电影在线观看| 国产电影午夜成年免费视频| 色老头永久免费网站| 免费观看激色视频网站(性色)| 18禁在线无遮挡免费观看网站| 国产一级高青免费| 免费看成人AA片无码视频吃奶| 免费在线黄色电影| 性色午夜视频免费男人的天堂| 久久免费国产视频| 99久久精品国产免费| 青娱乐免费视频在线观看| 成人爽A毛片免费看| 日本一道高清不卡免费| 国产小视频在线观看免费| 亚洲国产成人精品91久久久 | 日韩国产免费一区二区三区| 国产精品免费综合一区视频| 国产综合精品久久亚洲| 亚洲色av性色在线观无码| 亚洲av无码一区二区三区四区|