首页 文章 精选 留言 我的

精选列表

搜索[工单流转],共10004篇文章
优秀的个人博客,低调大师

HBASE+Solr实现详单查询

背景 某电信项目中采用HBase来存储用户终端明细数据,供前台页面即时查询。HBase无可置疑拥有其优势,但其本身只对rowkey支持毫秒级的快速检索,对于多字段的组合查询却无能为力。针对HBase的多条件查询也有多种方案,但是这些方案要么太复杂,要么效率太低,本文只对基于Solr的HBase多条件查询方案进行测试和验证。 原理 基于Solr的HBase多条件查询原理很简单,将HBase表中涉及条件过滤的字段和rowkey在Solr中建立索引,通过Solr的多条件查询快速获得符合过滤条件的rowkey值,拿到这些rowkey之后在HBASE中通过指定rowkey进行查询。 HBase与Solr系统架构设计 使用HBase搭建结构数据存储云,用来存储海量数据;使用SolrCloud集群用来搭建搜索引擎,将要查找的结构化数据的ID查找出来,只配置它存储ID。 wd代表用户write data写数据,从用户提交写数据请求wd1开始,经历wd2,写入MySQL数据库,或写入结构数据存储云中,wd3,提交到Solr集群中,从而依据业务需求创建索引。 rd代表用户read data读数据,从用户提交读数据请求rd1开始,经历rd2,直接读取MySQL中数据,或向Solr集群请求搜索服务,rd3,向Solr集群请求得到的搜索结果为ID,再向结构数据存储云中通过ID取出数据,最后返回给用户结果。 实现方法有两种 手工编码,直接用HBASE的API,可以参考下文:http://www.cnblogs.com/chenz/articles/3229997.html 可以使用HBASE/Solr的LUNA接口,就不用自己管理两者。 本文作者:朱洁 来源:51CTO

优秀的个人博客,低调大师

【曹工杂谈】说说Maven框架和插件的契约

说说Maven框架和插件的契约 前言 Maven框架就像现在公司内的各种平台方,规定一些契约,然后想办法拉动业务方,一起在这个平台上去做生态共建。Maven也是这样,其实它就是一个插件执行的框架,Maven刚开始肯定不知道会有谁去贡献插件,插件如果写得五花八门的话,那对于平台方来说,可能就是一个灾难,所以,平台方就要负责定标准,要在我平台上写插件,必须怎么怎么样。 Maven给插件就定了契约,这个契约,是通过api jar包的方式。每次发布Maven新版本,与之伴随的,都会有一个api jar包。 如果有人要基于这个版本的api jar包来开发插件,就需要把这个插件引入到自己的插件工程中。然后根据api jar包中的契约接口,来实现自己的插件逻辑。 比如,maven clean插件的工程代码中,就依赖了api jar包。如下: api jar包中的契约接口长啥样呢? public interface Mojo { ... void execute() throws MojoExecutionException, MojoFailureException; } 核心方法就是这个,只要你实现这个接口就完事了。 作为框架方,怎么去调用这个插件呢?简而言之,就是: 1、找到插件的实现类jar包,然后构造一个该插件的类加载器,去加载这个jar包,然后找到对应的实现了契约接口的类,比如这里的CleanMojo 2、加载了这个CleanMojo的class之后,当然是反射生成对象,然后强制转换为契约接口,然后调用契约接口就行。比如: Class cleanMojoClass = 插件的类加载器加载插件的jar包; Mojo cleanMojo = (Mojo)cleanMojoClass.newInstance(); cleanMojo.execute(); 到此为止,我们的理论知识已经足够了,我们是不是可以show the code了? 工程实践 我们会模拟上面的过程, 建一个Maven module,用来存放插件api契约接口; 建一个Maven module,引入api,实现插件api,这样,我们的插件就算是实现好了; 接下来,把这两个工程编译一下,把jar包安装到本地仓库; 再新建一个工程,模拟Maven框架去加载插件,并执行插件。 插件api工程 直接用maven的archetype中的quickstart,新建一个module,里面很简单,就一个接口: 然后执行mvn install,安装到本地仓库。 插件实现工程 在pom中,我们会引入api。 <dependencies> <dependency> <groupId>org.example</groupId> <artifactId>my-plugin-api</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies> 代码也很简单,就一个实现类。 然后执行mvn install,安装到本地仓库。 主工程,模拟框架去调用插件 主工程就是模拟我们的Maven框架,由于我们调用插件,肯定是通过api的方式,所以,pom中肯定是要引入api的。 <dependencies> <dependency> <groupId>org.example</groupId> <artifactId>my-plugin-api</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies> 接下来,我们写了个测试类: public static void main( String[] args ) throws MalformedURLException, ClassNotFoundException, InstantiationException, IllegalAccessException { // 1.1处 URL urlForPluginApi = new URL("file:/C:\\Users\\Administrator\\.m2\\repository\\org\\example\\my-plugin-api\\1.0-SNAPSHOT\\my-plugin-api-1.0-SNAPSHOT.jar"); URL urlForPluginImpl = new URL("file:/C:\\Users\\Administrator\\.m2\\repository\\org\\example\\my-plugin-implementation\\1.0-SNAPSHOT\\my-plugin-implementation-1.0-SNAPSHOT.jar"); URL[] urls = {urlForPluginApi, urlForPluginImpl}; // 1.2 URLClassLoader urlClassLoader = new URLClassLoader(urls,ClassLoader.getSystemClassLoader()){ @Override public Class<?> loadClass(String name) throws ClassNotFoundException { try{ // 保证:寻找类时,优先查找自己的classpath,找不到,再去交给parent classloader Class<?> clazz = findClass(name); return clazz; }catch (ClassNotFoundException exception ){ return super.loadClass(name); } } }; // 1.3 Class<?> implClazzByPluginClassloader = urlClassLoader.loadClass("org.example.MyMojoImplementation"); // 1.4 MojoInterface mojoInterface = (MojoInterface) implClazzByPluginClassloader.newInstance(); // 1.5 mojoInterface.execute(); System.out.println( "Hello World!" ); } 我先大概讲解一下上述代码: 1.1处,构造了两个url,分别指向我本地仓库的两个文件,也就是api.jar和插件对应的实现的jar 1.2处,使用1.1中的url,构造了一个classloader,这个classloader的parent classloader,我们传的是,系统的AppClassloader。 同时,我们重写了这个classloader的行为,重写后的行为如下:遇到要加载的类时,自己优先加载,也就是会去自己的两个url里面找,看看能不能找到,如果找不到,就会进入异常,异常被我们捕获后,交给parent classloader去加载; 1.3处,我们用新建的classloader,去加载了插件的实现类 1.4处,利用1.3处加载的实现类的class,反射生成对象,强转为MojoInterface接口对象 1.5处,多态方式执行插件逻辑 大家不妨思考下,大家觉得,最终的执行结果是啥?我们的“hello world”能打印出来吗? 这个代码,我们上传了gitee,大家可以拉下来看。 https://gitee.com/ckl111/maven-3.8.1-source-learn 我这边给大家展示下,执行结果: 大家看看,这像话吗,明明我的插件代码里,是实现了接口的,怎么就不能向上转型呢?: public class MyMojoImplementation implements MojoInterface{ @Override public void execute() { System.out.println("implementation execute business logic"); } } 这个。。。怎么说呢。。。这么跟你解释吧,我们加载MyMojoImplementation时,发现这个类吧,还实现了接口MojoInterface,那么,这个接口类也就需要加载,因为我们classloader进行了改写(优先由自己进行加载),因此,最终呢,MojoInterface也就和MyMojoImplementation一样,都是由插件类加载器去加载的。 最终呢,在向上转型时,会出现下边这个情况,两边不匹配,就报错了。 MojoInterface(框架中的这个类,是由框架的类加载器加载的) mojoInterface = (MojoInterface) implClazzByPluginClassloader.newInstance();(这个实现类实现的接口,是由插件类加载器加载的) 课后题 我们对代码进行了修改,改成了如下的样子,结果,就可以跑通我们的hello world了。这又是为啥呢? 我是逐日, 深圳腾讯打工人,成都深圳两地反复横跳的后端java程序猿一枚. 之前在深圳3年,后来去了成都4年,现在又来了深圳,也开始写写前端,有需要内推的可以找我。对于一线编码实战、网络、数据库、高并发等有浓厚兴趣。 也欢迎加我,拉进技术群一起交流;腾讯内推也可以找我。 本文由博客一文多发平台 OpenWrite 发布!

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册