2018世界杯赛程关注市场发展趋势,一直以逐渐积累的在线娱乐名气俘获大众之心,以游戏的高娱乐性增加玩家的信任,俄罗斯VS沙特即时比分凭借高起点、高品质的开发理念,解决了一般游戏存在的无趣,放弃那些令人觉得无聊的反应迟钝的操作系统,结合时代发展创新游戏,大大的增强了游戏品牌的影响力,俄罗斯VS沙特直播运行至今,就朝着打破传统的目标,坚持向市场上提供多款品质一流的国产游戏,在为国内的游戏行业做出自己的贡献的同时,目标是打造具有中国特色的游戏品牌,由于有着全国领先的技术优势,满足用户不断变化的需求,将一个顶级完善的游戏平台贡献给大家,并会推出更多精彩的产品
通过使用Statment或者PreparedStatement做批量查询。点击《值得关注的技术和设计公众号》,发现精彩!(点击上方公众号,可快速关注)来源:伯乐在线专栏作者-?乒乓狂魔?链接:http://blog.jobbole.com/102976/点击→了解如何加入专栏作者1需要解决的疑惑目前的日志框架有jdk自带的logging,log4j1、log4j2、logback,目前用于实现日志统一的框架apache的commons-logging、slf4j为了理清它们的关系,与繁杂的各种集成jar包,如下:log4j、log4j-api、log4j-corelog4j-1.2-api、log4j-jcl、log4j-slf4j-impl、log4j-jullogback-core、logback-classic、logback-accesscommons-loggingslf4j-api、slf4j-log4j12、slf4j-simple、jcl-over-slf4j、slf4j-jdk14、log4j-over-slf4j、slf4j-jcl分成3篇文章来阐述jdk自带的logging、log4j1、log4j2、logback的使用与原理简述slf4j、apache的commons-logging与上述日志框架的集成原理slf4j目前与commons-logging混用的境况2jdk自带的logging2.1使用案例privatestaticfinalLoggerlogger=Logger.getLogger(JdkLoggingTest.class.getName());?publicstaticvoidmain(String[]args){????logger.info("jdklogginginfo:amsg");}其中的Logger是:java.util.logging.Logger2.2简单过程分析不想看源码的请略过创建一个LogManager默认是java.util.logging.LogManager,但是也可以自定义,修改系统属性”java.util.logging.manager”即可,源码如下(manager就是LogManager):try{???cname=System.getProperty("java.util.logging.manager");??if(cname!=null){??????try{??????????Classclz=ClassLoader.getSystemClassLoader().loadClass(cname);??????????manager=(LogManager)clz.newInstance();??????}catch(ClassNotFoundExceptionex){??????????Classclz=Thread.currentThread().getContextClassLoader().loadClass(cname);??????????manager=(LogManager)clz.newInstance();??????}??}}catch(Exceptionex){???System.err.println("CouldnotloadLogmanager\""+cname+"\"");??ex.printStackTrace();}if(manager==null){???manager=newLogManager();}加载配置文件默认是jre目录下的lib/logging.properties文件,也可以自定义修改系统属性”java.util.logging.config.file”,源码如下:Stringfname=System.getProperty("java.util.logging.config.file");if(fname==null){???fname=System.getProperty("java.home");??if(fname==null){??????thrownewError("Can'tfindjava.home??");??}??Filef=newFile(fname,"lib");??f=newFile(f,"logging.properties");??fname=f.getCanonicalPath();}InputStreamin=newFileInputStream(fname);BufferedInputStreambin=newBufferedInputStream(in);try{???readConfiguration(bin);}创建Logger,并缓存起来,放置到一个Hashtable中,并把LogManager设置进新创建的logger中以tomcat为例,它就自定义了上述配置。4.1服务提供者需要编写一个ServiceProvider类,来发布RMI服务,并将RMI地址注册到ZooKeeper中(实际存放在ZNode上):packagecom.king.zkrmi;?importorg.apache.zookeeper.*;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;?importjava.io.IOException;importjava.net.MalformedURLException;importjava.rmi.Naming;importjava.rmi.Remote;importjava.rmi.RemoteException;importjava.rmi.registry.LocateRegistry;importjava.util.concurrent.CountDownLatch;?/**?*RMI服务提供者?*/publicclassServiceProvider{???privatestaticfinalLoggerLOGGER=LoggerFactory.getLogger(ServiceProvider.class);???//用于等待SyncConnected事件触发后继续执行当前线程??privateCountDownLatchlatch=newCountDownLatch(1);???//发布RMI服务并注册RMI地址到ZooKeeper中??publicvoidpublish(Remoteremote,Stringhost,intport){????Stringurl=publishService(remote,host,port);//发布RMI服务并返回RMI地址????if(url!=null){??????ZooKeeperzk=connectServer();//连接ZooKeeper服务器并获取ZooKeeper对象??????if(zk!=null){????????createNode(zk,url);//创建ZNode并将RMI地址放入ZNode上??????}????}??}???//发布RMI服务??privateStringpublishService(Remoteremote,Stringhost,intport){????Stringurl=null;????try{??????url=String.format("rmi://%s:%d/%s",host,port,remote.getClass().getName());??????LocateRegistry.createRegistry(port);??????Naming.rebind(url,remote);??????LOGGER.debug("publishrmiservice(url:{})",url);????}catch(RemoteException|MalformedURLExceptione){??????LOGGER.error("",e);????}????returnurl;??}???//连接ZooKeeper服务器??privateZooKeeperconnectServer(){????ZooKeeperzk=null;????try{??????zk=newZooKeeper(Constant.ZK_CONNECTION_STRING,Constant.ZK_SESSION_TIMEOUT,newWatcher(){????????@Override????????publicvoidprocess(WatchedEventevent){??????????if(event.getState()==Event.KeeperState.SyncConnected){????????????latch.countDown();//唤醒当前正在执行的线程??????????}????????}??????});??????latch.await();//使当前线程处于等待状态????}catch(IOException|InterruptedExceptione){??????LOGGER.error("",e);????}????returnzk;??}???//创建ZNode??privatevoidcreateNode(ZooKeeperzk,Stringurl){????try{??????byte[]data=url.getBytes();??????Stringpath=zk.create(Constant.ZK_PROVIDER_PATH,data,ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL_SEQUENTIAL);??//创建一个临时性且有序的ZNode??????LOGGER.debug("createzookeepernode({}=>{})",path,url);????}catch(KeeperException|InterruptedExceptione){??????LOGGER.error("",e);????}??}}涉及到的Constant常量,见如下代码:packagecom.king.zkrmi;?/**?*ZK常量?*/publicinterfaceConstant{???StringZK_CONNECTION_STRING="localhost:2181";??intZK_SESSION_TIMEOUT=5000;??StringZK_REGISTRY_PATH="/registry";??StringZK_PROVIDER_PATH=ZK_REGISTRY_PATH+"/provider";}注意:我们首先需要使用ZooKeeper的客户端工具创建一个持久性ZNode,名为“/registry”,该节点是不存放任何数据的,可使用如下命令:create/registrynull4.2服务消费者服务消费者需要在创建的时候连接ZooKeeper,同时监听/registry节点的NodeChildrenChanged事件,也就是说,一旦该节点的子节点有变化,就需要重新获取最新的子节点。
俄罗斯VS沙特即时比分 踩踩 评论
正在载入,请稍候...

QQ空间 新浪微博 腾讯微博 百度空间 百度搜藏 人人网 开心网 更多

Baidu