??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 GMT http://www.aygfsteel.com/Tower/archive/2005/05/13/4242.html http://www.aygfsteel.com/Tower/comments/4242.html http://www.aygfsteel.com/Tower/archive/2005/05/13/4242.html#Feedback 0 http://www.aygfsteel.com/Tower/comments/commentRss/4242.html http://www.aygfsteel.com/Tower/services/trackbacks/4242.html @ My Space ]]> JMX设计模式之MBeanForAppConfig模式 http://www.aygfsteel.com/Tower/archive/2005/05/07/4053.html非飞 非飞 Fri, 06 May 2005 16:19:00 GMT http://www.aygfsteel.com/Tower/archive/2005/05/07/4053.html http://www.aygfsteel.com/Tower/comments/4053.html http://www.aygfsteel.com/Tower/archive/2005/05/07/4053.html#Feedback 0 http://www.aygfsteel.com/Tower/comments/commentRss/4053.html http://www.aygfsteel.com/Tower/services/trackbacks/4053.html @ My space ]]> NIO中Selector的工作原? http://www.aygfsteel.com/Tower/archive/2005/04/26/3809.html非飞 非飞 Tue, 26 Apr 2005 02:06:00 GMT http://www.aygfsteel.com/Tower/archive/2005/04/26/3809.html http://www.aygfsteel.com/Tower/comments/3809.html http://www.aygfsteel.com/Tower/archive/2005/04/26/3809.html#Feedback 3 http://www.aygfsteel.com/Tower/comments/commentRss/3809.html http://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" /> ]]> Linux下JNI调用 http://www.aygfsteel.com/Tower/archive/2005/03/22/2338.html非飞 非飞 Tue, 22 Mar 2005 10:39:00 GMT http://www.aygfsteel.com/Tower/archive/2005/03/22/2338.html http://www.aygfsteel.com/Tower/comments/2338.html http://www.aygfsteel.com/Tower/archive/2005/03/22/2338.html#Feedback 0 http://www.aygfsteel.com/Tower/comments/commentRss/2338.html http://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 __cplusplusextern " 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 ]]>Hibernate中的l承映射 http://www.aygfsteel.com/Tower/archive/2005/03/02/1617.html非飞 非飞 Wed, 02 Mar 2005 14:31:00 GMT http://www.aygfsteel.com/Tower/archive/2005/03/02/1617.html http://www.aygfsteel.com/Tower/comments/1617.html http://www.aygfsteel.com/Tower/archive/2005/03/02/1617.html#Feedback 0 http://www.aygfsteel.com/Tower/comments/commentRss/1617.html http://www.aygfsteel.com/Tower/services/trackbacks/1617.html
Hibernate的承映包含了三种不同的策略:
每簇cM用一个表Q?
每个子类一个表Q?
每个具体内一个表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用一个表的策略时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策略时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 > ]]>通过mx4j实现JMXConnectorServer和JMXConnector http://www.aygfsteel.com/Tower/archive/2005/02/05/1037.html非飞 非飞 Sat, 05 Feb 2005 11:07:00 GMT http://www.aygfsteel.com/Tower/archive/2005/02/05/1037.html http://www.aygfsteel.com/Tower/comments/1037.html http://www.aygfsteel.com/Tower/archive/2005/02/05/1037.html#Feedback 0 http://www.aygfsteel.com/Tower/comments/commentRss/1037.html http://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 ]]>
վ֩ģ壺
̨ |
|
Һ |
ɽ |
|
ͻȪ |
ײ |
Ž |
|
|
Ӫɽ |
β |
|
|
ͺ |
|
̨ |
|
Ϫ |
ɽ |
ȳ |
|
ʡ |
|
ɽ |
˴ |
Ļ |
|
|
ȫ |
˳ |
|
|
|
|
봨 |
|
̨ |
ͼ |
|
|