??xml version="1.0" encoding="utf-8" standalone="yes"?>国产69精品久久久久9999人,亚洲一区二区三区乱码,亚洲一级二级三级http://www.aygfsteel.com/Tower/archive/2005/05/13/4242.html非飞非飞Thu, 12 May 2005 16:08:00 GMThttp://www.aygfsteel.com/Tower/archive/2005/05/13/4242.htmlhttp://www.aygfsteel.com/Tower/comments/4242.htmlhttp://www.aygfsteel.com/Tower/archive/2005/05/13/4242.html#Feedback0http://www.aygfsteel.com/Tower/comments/commentRss/4242.htmlhttp://www.aygfsteel.com/Tower/services/trackbacks/4242.html@ My Space

非飞 2005-05-13 00:08 发表评论
]]>
JMX设计模式之MBeanForAppConfig模式http://www.aygfsteel.com/Tower/archive/2005/05/07/4053.html非飞非飞Fri, 06 May 2005 16:19:00 GMThttp://www.aygfsteel.com/Tower/archive/2005/05/07/4053.htmlhttp://www.aygfsteel.com/Tower/comments/4053.htmlhttp://www.aygfsteel.com/Tower/archive/2005/05/07/4053.html#Feedback0http://www.aygfsteel.com/Tower/comments/commentRss/4053.htmlhttp://www.aygfsteel.com/Tower/services/trackbacks/4053.html@ My space

非飞 2005-05-07 00:19 发表评论
]]>
NIO中Selector的工作原?http://www.aygfsteel.com/Tower/archive/2005/04/26/3809.html非飞非飞Tue, 26 Apr 2005 02:06:00 GMThttp://www.aygfsteel.com/Tower/archive/2005/04/26/3809.htmlhttp://www.aygfsteel.com/Tower/comments/3809.htmlhttp://www.aygfsteel.com/Tower/archive/2005/04/26/3809.html#Feedback3http://www.aygfsteel.com/Tower/comments/commentRss/3809.htmlhttp://www.aygfsteel.com/Tower/services/trackbacks/3809.html
Selector是用来获取注册在其中的channel的相关事件的发生Q也是acceptQread和write。selector中有3个key set?

key setQ包含代表所有在其中注册的channelQ可以通过selector.keys()得到?
selected-key setQ包含所有被到有关注的操作已经qA的keyQ通过selector.selectedKeys得到?
cancelled-key setQ包含所有已l被cancelQ但是还没有channelq没有deregister的keyQ这个集合是不能直接被访问的?br>
key通过调用channel的registerҎ被加入到key set中。被取消的key在select的时候会被从相应的key set中移除?br>
key set自n是不可以直接q行修改的? 无论是通过调用channel的closeҎq是调用key的cancelҎQkey都会被放|到canceled-key set中。取消的key会将其channel在下一ơselect时将注册撤销Q同时将key从所有的key set中移除?

key在执行select操作时被加入到selected-key set中。在selected-key set中的key可以通过调用iterator的removeҎQ将其从selected-key set中移除,不能通过其他的办法将其从selected-key set中移除?br>
通过selector?个方法selectQ阻塞选择Q直到有兛_的事件发生时退出阻塞)QselectNowQ不d选择Q,select(long)Q指定超旉择Q超时到达或者有兛_事g发生旉出阻塞)Q来获取兛_事g的发生。其执行步骤分ؓ以下3步:

1、将存在于canceled-key set中的key从所有的key set中移除,撤销注册的channelQ清Icanceled-key set?
2、地层操作系l检查是否有兛_的事件发生,当有兛_的事件发生时Q首先检查channel的key是否已经存在于selected-key set中,如果不存在,则将其加入到selected-key set中去Q同时修改key的ready-operation set来表明当前ready的操作,而以前存在于ready-operation set中的信息会被删除。如果对应的key已经存在于selected-key set中,q直接修改其ready-operation set来表明当前ready的操作,删除原来ready-operation set中的信息?
3、如果在W二步中有加入到canceled-key set中的keyQ在q一步会执行W一步的操作?

selector自n是线E安全的Q而他的key set却不是。在一ơ选择发生的过E中Q对于key的关心事件的修改要等C一ơselect的时候才会生效? 另外Qkey和其代表的channel有可能在M时候被cancel和close。因此存在于key set中的keyq不代表其key是有效的Q也不代表其channel是open的。如果key有可能被其他的线E取消或关闭channelQ程序必d 心的同步查这些条件?

d了的select可以通过调用selector的wakeupҎ来唤醒?img src ="http://www.aygfsteel.com/Tower/aggbug/3809.html" width = "1" height = "1" />

非飞 2005-04-26 10:06 发表评论
]]>
Linux下JNI调用http://www.aygfsteel.com/Tower/archive/2005/03/22/2338.html非飞非飞Tue, 22 Mar 2005 10:39:00 GMThttp://www.aygfsteel.com/Tower/archive/2005/03/22/2338.htmlhttp://www.aygfsteel.com/Tower/comments/2338.htmlhttp://www.aygfsteel.com/Tower/archive/2005/03/22/2338.html#Feedback0http://www.aygfsteel.com/Tower/comments/commentRss/2338.htmlhttp://www.aygfsteel.com/Tower/services/trackbacks/2338.html    做项目,无论是遗留品的再生产,q是寚w留品的再利用,都不可避免的会出C大堆的异构现象。解军_构通信问题是这c项目的主要问题。以前看见这U情늬一个解x案就是Socket通信。说实在的自己实现Socket通信Q定刉信协议Q或者是实现已有的通信协议都是很头痛的事情。本人有不堪回首的历史经历?BR>
    最q同样在目中需要去解决一个异构问题,׃旉的紧q,以及先天的运行环境(两个部分是运行在同一台机器上的)。考虑C使用JNIQ结果表明JNI是完全可以胜ȝ前的角色的。以前没有了解过JNIQL以ؓ它这不好那不好,用了用,表现q不错,而且实现h非常之简单?BR>
    整个实现q程可以分ؓ五步来完成:

1Q写一个声明了native的Java文gQ?/FONT>

package example;

public class TestJNI 
{
    
static 
{
        System.loadLibrary(
"test"
);
    }

    
    
public native String getNameCPP();
}


2) 使用javah产生对应的CPP头文Ӟ
命oQjavah -classpath <path> -jni example.TestJNI -d <out_dir>
生成的头文gexample_TestJNI.h如下Q?BR>
/* DO NOT EDIT THIS FILE - it is machine generated */
#include 
<jni.h>
/* Header for class example_TestJNI */

#ifndef _Included_example_TestJNI
#define _Included_example_TestJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     example_TestJNI
 * Method:    getNameForCPP
 * Signature: ()Ljava/lang/String;
 
*/

JNIEXPORT jstring JNICALL Java_example_TestJNI_getNameForCPP
  (JNIEnv 
*, jobject);

#ifdef __cplusplus
}

#endif
#endif

3Q实现对应的CPP代码Q?BR>
#include "example_TestJNI.h"
#include 
<string>

JNIEXPORT jstring JNICALL Java_example_TestJNI_getNameForCPP
  (JNIEnv 
* env, jobject)
{
    
//TODO 可以在此调用其他的代?/SPAN>
    std::string strName = "Tower";
    
return env->NewStringUTF(strName.c_str());
}


4) ~译CPP代码
命oQg++ -o libtest.so -shared -I<include_path> -I<java_home>/include -I<java_home>/include/linux example_TestJNI.cpp

5Q执?BR>
package example;

public class Test {
    
public static void main(String[] args) {
        TestJNI test 
= new TestJNI();
        System.
out.println("Hello " + test.getNameForCPP());
    }

}


export LD_EXPORT_PATH=<so_path>
java -cp <path> -Djava.library.path=<so_path> example.Test
输出QHello Tower


非飞 2005-03-22 18:39 发表评论
]]>
Hibernate中的l承映射http://www.aygfsteel.com/Tower/archive/2005/03/02/1617.html非飞非飞Wed, 02 Mar 2005 14:31:00 GMThttp://www.aygfsteel.com/Tower/archive/2005/03/02/1617.htmlhttp://www.aygfsteel.com/Tower/comments/1617.htmlhttp://www.aygfsteel.com/Tower/archive/2005/03/02/1617.html#Feedback0http://www.aygfsteel.com/Tower/comments/commentRss/1617.htmlhttp://www.aygfsteel.com/Tower/services/trackbacks/1617.html


Hibernate的承映包含了三种不同的策略:

  1. 每簇cM用一个表Q?
  2. 每个子类一个表Q?
  3. 每个具体内一个表Q有限制Q?BR>
假设我们有四个类AnimalQDogQCatQ其代码如下Q?BR>文g名:Animal.java
class Animal {
    
private String identifier;
    
private String name;
    
private String category;
    
// setter and getter
}

文g名:Dog.java
class Dog extends Animal {
    
private String 
    
// setter and getter
}

文g名:Cat.java
class Cat extends Animal {
    
private String 
    
// setter and getter
}

  • 每簇cM用一个表
       使用每簇cM用一个表的策略时Q有一个限制就时子cM能有NOT NULLQ映文件ؓQ?BR>       文g名:Animal.hbm.xml
       <class name="Animal" table="TB_ANIMAL">
          
<id name="identifier" type="string" column="IDENTIFIER">
             
<generator class="uuid.hex"/>
          
</id>
          
<discriminator column="ANIMAL_TYPE" type="string"/>
          
<property name="name" column="NAME" type="string"/>
          
          
<subclass name="Dog" discriminator-value="DOG">
             
          
</subclass>
          
<subclass name="Cat" discriminator-value="CAT">
             
          
</subclass>
       
</class>

  • 每个子类一个表
       使用每个子类一个表的策略时Q可以用一个映文件实玎ͼ也可以分成多个映文件来实现。每个子cM个映文件的情况Q?BR>       文g名:Animal.hbm.xml
       <class name="Animal" table="ANIMAL">
          
<id name="identifier" column="IDENTIFIER" type="string">
             
<generator class="uuid.hex"/>
          
</id>
          
<property >
       
</class>
       文g名:Dog.hbm.xml
       
<joined-subclass name="Dog" table="DOG" extends="Animal">
          
<key column="DOG_ID"/>
          
       
</joined-subclass>
       文g名:Cat.hbm.xml
       
<joined-subclass name="Cat" table="CAT" extends="Cat">
          
<key column="CAT_ID"/>
          
       
</joined-subclass>

       每个子类一个表的策略实际上一Uone-to-one的映?BR>
  • 每个具体内一个表Q有限制Q?/B>
       使用每个具体内一个表Q有限制Q策略时Q每一个子cȝ映射文g要包含所有父cM的属性,映射文gQ?BR>       文g名:Dog.hbm.xml
       <class name="Dog" table="DOG">
          
<id name="identifier" column="IDENTIFIER" type="string">
             
<generator class="uuid.hex"/>
          
</id>
          
<property name="name" column="NAME" type="string"/>
          
       
</class>
       文g名:Cat.hbm.xml
       
<class name="Cat" table="CAT">
          
<id name="identifier" column="IDENTIFIER" type="string">
             
<generator class="uuid.hex"/>
          
</id>
          
<property name="name" column="NAME" type="string"/>
          
       
</class>






非飞 2005-03-02 22:31 发表评论
]]>
通过mx4j实现JMXConnectorServer和JMXConnectorhttp://www.aygfsteel.com/Tower/archive/2005/02/05/1037.html非飞非飞Sat, 05 Feb 2005 11:07:00 GMThttp://www.aygfsteel.com/Tower/archive/2005/02/05/1037.htmlhttp://www.aygfsteel.com/Tower/comments/1037.htmlhttp://www.aygfsteel.com/Tower/archive/2005/02/05/1037.html#Feedback0http://www.aygfsteel.com/Tower/comments/commentRss/1037.htmlhttp://www.aygfsteel.com/Tower/services/trackbacks/1037.html
    对于如何产生和注册MBeansQmx4j提供了一个相当方便的工具Qؓ什么说相当方便Q是因ؓ它真的实在是太方便了。通过写一个xml配置文g可以完成所有的工作。比起M-LET实是强了不。下面就是一个在MBean Server产生注册一个NamingService、JMXConnectorServer和一个自写的MBean的配|文件?BR>
<?xml version="1.0" encoding="UTF-8"?>
<configuration port="9999">
   
<startup>
      
<create classname="mx4j.tools.naming.NamingService" objectname="naming:type=rmiregistry">
         
<arg type="int">1099</arg>
      
</create>
      
<call operation="start" objectname="naming:type=rmiregistry" />

      
<object objectid="rmi">
         
<call classname="javax.management.remote.JMXConnectorServerFactory" method="newJMXConnectorServer">
            
<arg type="javax.management.remote.JMXServiceURL">
               
<new classname="javax.management.remote.JMXServiceURL">
                  
<arg type="string">service:jmx:rmi://localhost/jndi/rmi://localhost:1099/jmx</arg>
               
</new>
            
</arg>
            
<arg type="java.util.Map" />
            
<arg type="javax.management.MBeanServer" />
         
</call>
      
</object>
      
<register objectname="connectors:type=rmi,protocol=jrmp">
         
<arg type="object" refobjectid="rmi" />
      
</register>
      
<call method="start" refobjectid="rmi" />
      
<create classname="nsmp.examples.mbeans.rmi.MyRemoteServiceObject" objectname="services:type=my-remote" />
   
</startup>

   
<shutdown>
      
<call operation="stop" objectname="services:type=my-remote" />
      
<call method="stop" refobjectid="rmi" />
      
<call operation="stop" objectname="naming:type=rmiregistry" />
      
<unregister objectname="services:type=my-remote"/>
      
<unregister objectname="connectors:type=rmi,protocol=jrmp" />
      
<unregister objectname="naming:type=rmiregistry" />
   
</shutdown>
</configuration> 

java代码Q?BR>
package nsmp.agent;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.Reader;
import java.net.Socket;

import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
import javax.management.ObjectName;

import mx4j.tools.config.ConfigurationLoader;
import nsmp.util.NsmpGlobals;

/**
 * @version 1.0
 * @author tower
 *
 * TODO write the comment of this type
 
*/

public class NsmpServer {
    
public void startup() throws Exception {
        MBeanServer server 
= MBeanServerFactory.newMBeanServer();
        ConfigurationLoader loader 
= new ConfigurationLoader();

        server.registerMBean(loader, ObjectName.getInstance(
"config:service=loader"));
        Reader reader 
= new BufferedReader(new FileReader(NsmpGlobals.NSMP_HOME + "/conf/config.xml"));
        
        loader.startup(reader);
        reader.close();
        System.
out.println("Start the nsmp server successfully!");
    }

    
public void shutdown() throws Exception {
          String shutdownCommand 
= "shutdown";
          Socket socket 
= new Socket("127.0.0.1"9999);
          socket.getOutputStream().write(shutdownCommand.getBytes());
          socket.close();
    }

}


    startupҎ调用配置文g的startup部分完成创徏和注册,shutdownҎ调用配置文g的shutdown部分释放相应的资源。通过调用 startupҎ可以v动MBeanServer提供服务了。对于shutdown开始搞了我半天startup?ConfigurationLoader都没有创Z个侦听端口来接收shutdown命oQ看了看mx4j的源码发?ConfigurationLoader也没有发C么特D地斏V捉摸半天终于发C自己放了一个愚W的错误Qeclipse是用普通用h限开的,没有办法创徏侦听Q改成root后一切ok?BR>
    接下随便写了一个JMXConnectorQ代码:

/*
 * Copyright (C) The MX4J Contributors.
 * All rights reserved.
 *
 * This software is distributed under the terms of the MX4J License version 1.0.
 * See the terms of the MX4J License in the documentation provided with this software.
 
*/


package nsmp.examples.mbeans.rmi;

import java.util.Map;

import javax.management.MBeanInfo;
import javax.management.MBeanOperationInfo;
import javax.management.MBeanServerConnection;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;


/**
 * @version $Revision: 1.3 $
 
*/

public class Client
{
   
public static void main(String[] args) throws Exception
   
{
           JMXServiceURL address 
= new JMXServiceURL("service:jmx:rmi://localhost/jndi/rmi://localhost:1099/jmx");
           Map creationEnv 
= null;
           JMXConnector connector 
= JMXConnectorFactory.newJMXConnector(address, creationEnv);
           
           Map connectionEnv 
= null;
           connector.connect(connectionEnv);
           
           MBeanServerConnection serverConnection 
= connector.getMBeanServerConnection();
           ObjectName name 
= ObjectName.getInstance("services:type=my-remote");
           MBeanInfo mbInfo 
= serverConnection.getMBeanInfo(name);
           MBeanOperationInfo[] operationInfo 
= mbInfo.getOperations();
           
           
for (int i = 0; i < operationInfo.length; i++{
               System.
out.println(operationInfo[i].getName());
           }

           
           serverConnection.invoke(name, 
"sayHello"new Object[] {"Tower He"}new String[] {"java.lang.String"});
   }

}



JMXConnector是通过获取一个MBeanServerConnection来实现远E调用的Q运行了一下一切顺利通过?BR>
下蝲Q?A href="http://www.aygfsteel.com/Files/Tower/MX4JExample.rar">MX4JExample.rar


非飞 2005-02-05 19:07 发表评论
]]>
վ֩ģ壺 ̨| | Һ| ɽ| | ͻȪ| ײ| Ž| | | Ӫɽ| β| | | ͺ| | ̨| | Ϫ| ɽ| ȳ| | ʡ| ޳| ɽ| ˴| Ļ| | | ȫ| ˳| | | | | | | ̨| ͼ| | |