Category: Java

四月 25th, 2016 by lanxinxichen@126.com

apache-tomcat
我之前的技术方向是PHP,现在是做java,暂且不提两门语言谁优谁劣,我就是感觉什么方便就用什么,适合用什么就用什么.现在做的NLP项目是基于java的web项目,想要在PHP的官网上面挂出来,方法有很多,比如:后端json API转化;无视端口的不一样,前端直接jsonp,当然最简单的办法就是今天提到的apache跟tomcat的整合.博主本身只是刚刚学会了,过程太顺利了,反而害怕以后会不会有什么隐患.遇到问题,以后继续更新在这里.
由于是tomcat跟apache的整合,那我就默认环境中已经有了这两个服务器软件,单纯运行的服务器配置就不再讲解了,只着重讲整合中需要做的工作.
首先打开apache的配置文件:http.conf
在http.conf中打开模块支持:

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so

如果在你的Apache/modules路径下没有这两个模块,请从我提供的百度云盘上面下载.百度云盘-php-apache-module,我这一步配置走的很顺,如果做完这一步apache启动不起来,就自己找匹配的模块吧.我用的集成环境,没有花时间在这个上面折腾.
然后配置转发请求到tomcat.
在http.conf中引入一个额外的配置文件httpd-proxy.conf,引入方式:Include conf/extra/httpd-proxy.conf,注意路径跟你放置的文件匹配起来.在配置文件中写入你要转发的请求.比如我现在的配置是:
ProxyPass /java/ ajp://127.0.0.1:8009/java/
ProxyPassReverse /java/ ajp://127.0.0.1:8009/java/
这个配置文件的意思是当我收到/java/的请求的时候通过ajp协议转发到ajp://127.0.0.1:8009/java/的URL请求中,其他的就没有什么可玩的了.具体的ProxyPass和ProxyPassReverse使用可以参看这里Apache配置中的ProxyPass 和 ProxyPassReverse .
总结以下:其实来讲这些东西思路都是一样的,就是代理的思想,我们平时遇到的负载均衡,cname请求转发,fq软件都是这个道理,只不过在服务器层间的转发或者封装了的转发要省很多事.需要注意的是路径的映射,从apache中配置的路径转发到tomcat的路径的时候需要对应起来,如果有同名的注意会不会覆盖请求.
参考文章:
Tomcat: Connector中HTTP与AJP差别与整合 – arun_yh – 博客园
整合apache和tomcat构建Web服务器 – iTech – 博客园

Posted in Java, PHP, 服务器 Tagged with: , , ,

二月 24th, 2016 by lanxinxichen@126.com

简述

初学quartz,按照IBM基于 Quartz 开发企业级任务调度应用一步一步学习的.遇到的问题在这里一一记录,可以给以后学习的人少走一些弯路.
当前项目中使用的quartz版本为:quartz-2.2.2,在该文章中有一些不兼容问题简单陈述

版本兼容

1. StatefulJob 过期
请使用@DisallowConcurrentExecution或者@PersistJobDataAfterExecution 注解的方式同时实现Job接口
2.JobDetail不支持构造函数
通过以下代码构建JobDetail
JobBuilder job = JobBuilder.newJob(TestJob.class);
JobDetail jobDetail = job.withIdentity(“sampleJob”, “sampleGroup”).build();
3.DailyTimeIntervalTrigger类被DailyTimeIntervalTriggerImpl替代
使用DailyTimeIntervalTriggerImpl
4.IntervalUnit不再是DailyTimeIntervalTrigger的属性
可以直接使用IntervalUnit.SECOND类似方法直接访问静态属性
5.deleteJob只有两个方法传入jobkey 或者jobkey列表
jobkey可以通过jobDetail直接getKey()获取,然后使用Scheduler对象的deleteJob方法删除
 

代码运行中的异常

异常1

Scheduler won't start - java.lang.NoClassDefFoundError:com/mchange/v2/c3p0/ComboPooledDataSource

错误分析:找不到类com/mchange/v2/c3p0/ComboPooledDataSource
解决:在下载的quartz解压文件夹中找到\quartz\lib\c3p0-*.jar 添加到class path中
参考:http://forums.terracotta.org/forums/posts/list/5268.page
 
异常2

插入数据postgresql报错:Caused by: org.quartz.JobPersistenceException: Couldn't retrieve trigger: 不良的类型值 long : \x [See nested exception: org.postgresql.util.PSQLException: 不良的类型值 long : \x]

错误分析:数据库不兼容(其实我也不太清楚,没挖那么深)
解决:在配置文件中把org.quartz.jobStore.driverDelegateClass的org.quartz.impl.jdbcjobstore.StdJDBCDelegate修改为postgresql专用的 org.quartz.impl.jdbcjobstore.PostgreSQLDelegate驱动类文件
参考:https://jira.talendforge.org/browse/TDI-27463
https://quartz-scheduler.org/documentation/quartz-2.2.x/configuration/ConfigJobStoreCMT
 
持续更新…

Posted in Java Tagged with:

一月 5th, 2016 by lanxinxichen@126.com

作为感受过whoosh的各种优点的人,初学Lucene,各种不习惯.在使用最新的Lucene5.4的时候,搜索字段一直有问题.报错:
Exception in thread "main" java.lang.IllegalStateException: unexpected docvalues type NONE for field 'id' (expected=NUMERIC). Use UninvertingReader or index with docvalues.
在尝试使用google 和stackoverflow用英语搜索各种问题之后,都没有解决.没想到用中文搜索竟然找到了答案.特写一篇文章,希望被收录,帮到更多的人.
首先,之前的教程都是如下代码:
Sort sort = new Sort(new SortField("id",SortField.INT,false));
TopDocs topDocs = indexSearcher.search(query,100,sort);
而这样的代码直接运行就会报上面的错.
实际上,Lucene在5.X的版本中,应该使用排序专用Field,而不是IntField这种.

NumericDocValuesField  //SortedNumericDocValuesField 已过时的API 

demo:

// doc.add(new IntField("id", article.getId(),Store.YES));
doc.add(new NumericDocValuesField("sortid", article.getId()));

使用一个NumericDocValuesField索引专用字段用来保存需要索引的字段,然后在搜索的时候使用

Sort sort = new Sort(new SortField("sortid", SortField.Type.INT, true));

Posted in Java Tagged with: , , , ,