JDK11把JAVA EE部分删除了

JavaEE由4部分组成:

JAX-WS (Java API for XML-Based Web Services),
JAXB (Java Architecture for XML Binding)
JAF (the JavaBeans Activation Framework)
Common Annotations.
但是这个特性和JavaSE关系不大。并且JavaEE被维护在Github(https://github.com/javaee)中,版本同步造成维护困难。最后,JavaEE可以单独引用,maven中心仓库也提供了JavaEE(http://mvnrepository.com/artifact/javax/javaee-api/8.0),所以没必要把JavaEE包含到JavaSE中。

 

做了这么多年Java开发,不知道JDK中包含的jAVA EE分4部分,脸红。。。

https://mp.weixin.qq.com/s/Yz8V3inWN8uErKM-IdMFWQ

 

关于React中动态render String的React元素

由于产品需要,React的Form元素是动态生成的,虽然阿里的antd给了动态生成Form的demo https://ant.design/components/form-cn/#components-form-demo-dynamic-form-item ,事实上,我也按照这个Demo把动态生成Form 表单的特色加入到了自己的产品里。

对于简单的动态表单生成,这个feature也足够了,但是对于稍微复杂的表单布局,如下图所示:

 

表单的字段1)要分组 2)一行排2个字段以上,用阿里的antd就比较困难。而且这些字手段是从配置信息动态读取出来的。

这些字手段是从配置信息动态读取出来是个字符串,如何把这些字符串在React动态呈现出来?

http://w3cgeek.com/inject-jsx-formatted-string-into-react-component.html 这里讲了两种String 转换为JSX的方法。简单的String/Html转JSX还可以,但是带第三方自定义函数的,又无法转了。

我最后放弃了String转React的JSX Component的想法,直接在服务器端生成String类型的HTML,直接用React的dangerouslySetInnerHTML 奇门绝技,在服务器端动态生成HTML的动态表单,用React的dangerouslySetInnerHTML 呈现。

 

让HtmlUnit忽略执行某个JavaScript文件

开始是想在HtmlUnit执行完一些JS文件后获取对应URL的HTML页面,但是期间发生阻塞。。。

怀疑是HtmlUnit在执行某个JS文件时陷入了无限循环中,检查是哪个JS文件造成的,如果该JS文件没有太大的价值就可以让HtmlUnit忽略它不执行它:
新建一个类:
class InterceptWebConnection extends FalsifyingWebConnection{
    public InterceptWebConnection(WebClient webClient) throws IllegalArgumentException{
        super(webClient);
    }
    @Override
    public WebResponse getResponse(WebRequest request) throws IOException {
        WebResponse response=super.getResponse(request);
        if(response.getWebRequest().getUrl().toString().endsWith("dom-drag.js")){
            return createWebResponse(response.getWebRequest(), "", "application/javascript", 200, "Ok");
        }
        return super.getResponse(request);
    }
}
然后创建你自己的webClient:
new InterceptWebConnection(webClient);

安装kubernetes阿里云镜像

/etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
       http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg

java后端系统架构,解决方案合集

缓存框架:

spring cache:http://spring.io/guides/gs/caching/

jetcache :https://github.com/alibaba/jetcache

redis相关 :

redisson :https://github.com/redisson/redisson

jedis :https://github.com/xetorthio/jedis

redisDesktop :https://github.com/uglide/RedisDesktopManager

cachecloud :https://github.com/sohutv/cachecloud

api文档管理:

easy-mock :https://github.com/easy-mock/easy-mock

ApiManager :https://github.com/EhsanTang/ApiManager

showdoc :https://github.com/star7th/showdoc

配置中心 :

apollo :https://github.com/ctripcorp/apollo

disconf :https://github.com/knightliao/disconf

spring cloud config

注册中心服务:

zookpeer :http://zookeeper.apache.org/

eureka :https://github.com/Netflix/eureka

consul :https://github.com/hashicorp/consul

etcd :https://github.com/coreos/etcd

rpc :

dubbo :https://github.com/apache/incubator-dubbo

motan :https://github.com/weibocom/motan

sofa-rpc :https://github.com/alipay/sofa-rpc

mqrpc :https://gitee.com/kailing/springboot-mqrpc

微服务 :

spring cloud :http://projects.spring.io/spring-cloud/

ServiceComb :http://servicecomb.incubator.apache.org/cn/

api网关 :

zuul :https://github.com/Netflix/zuul

kong :https://github.com/Kong/kong

orange :https://github.com/sumory/orange

分布式事务 :

lcn : https://github.com/codingapi/tx-lcn/

tcc-transaction :https://github.com/changmingxie/tcc-transaction

coolmq :https://github.com/vvsuperman/coolmq

Raincat :https://github.com/yu199195/Raincat

分布式锁 :

klock :https://gitee.com/kekingcn/spring-boot-klock-starter

lock-spring :https://github.com/zouyingchun/lock-spring

分布式任务调度 :

xxl-job : https://github.com/xuxueli/xxl-job

Elastic-job : https://github.com/elasticjob/elastic-job-lite

批处理 :

spring batch :https://spring.io/projects/spring-batch

partitionjob :https://gitee.com/kailing/partitionjob

NewSql :

tidb :https://github.com/pingcap/tidb

oceanbase :https://github.com/alibaba/oceanbase

数据库中间件:

cetus :https://github.com/Lede-Inc/cetus

DBProxy :https://github.com/Meituan-Dianping/DBProxy

mycat :https://github.com/MyCATApache/Mycat-Server

sharding-jdbc :https://github.com/shardingjdbc/sharding-jdbc

dble :https://github.com/actiontech/dble

proxysql :https://github.com/sysown/proxysql

数据库连接池:

druid :https://github.com/alibaba/druid

tomcatjdbc :http://tomcat.apache.org/tomcat-8.0-doc/jdbc-pool.html

HikariCP :https://github.com/brettwooldridge/HikariCP

数据访问 :

jpa : https://github.com/spring-projects/spring-data-jpa

querydsl :https://github.com/querydsl/querydsl

jooq :https://github.com/jOOQ/jOOQ

mango :https://github.com/jfaster/mango

minidao :https://gitee.com/jeecg/minidao

binlog增量日志消费:

keking-binlog :https://gitee.com/kekingcn/keking-binlog-distributor

mysql-binlog-connector-java :https://github.com/shyiko/mysql-binlog-connector-java

canal :https://github.com/alibaba/canal

puma :https://github.com/dianping/puma

open-replicator :https://github.com/whitesock/open-replicator

索引引擎:

elasticsearch :https://github.com/elastic/elasticsearch

solr :http://lucene.apache.org/solr/guide/7_3/

lucene :http://lucene.apache.org/

消息中间件:

RabbitMQ :http://www.rabbitmq.com/getstarted.html

ActiveMQ :https://github.com/apache/activemq

kafka :https://github.com/apache/kafka

rocketmq :https://github.com/apache/rocketmq

zbus :http://zbus.io/

DevOps:

jenkins :https://jenkins.io

hudson :http://www.eclipse.org/hudson

rundeck :https://github.com/rundeck/rundeck

Hygieia :https://github.com/capitalone/Hygieia

应用安全:

openrasp :https://github.com/baidu/openrasp

apm :

skywalking :https://github.com/apache/incubator-skywalking

pinpoint :https://github.com/naver/pinpoint

zipkin :https://github.com/openzipkin/zipkin

cat :https://github.com/dianping/cat

快速开发,微核心:

spring boot :http://projects.spring.io/spring-boot/

jfinal :https://gitee.com/jfinal/jfinal

nutz :https://github.com/nutzam/nutz

日志采集:

logpipe :https://github.com/calvinwilliams/logpipe

logstash :https://github.com/elastic/logstash

爬虫相关:

webmagic :https://gitee.com/flashsword20/webmagic

WebCollector :https://github.com/CrawlScript/WebCollector

jsoup :https://github.com/jhy/jsoup

感觉蚂蚁金服的RPC框架 sofa-rpc 跟好多年前EJB调用一模一样啊

看到蚂蚁金服的RPC框架 sofa-rpc 调用Demo : https://github.com/alipay/sofa-rpc/wiki/Getting-Started-With-RPC  ,感觉跟多年前EJB调用方式一模一样啊

其它RPC 例如Dubbo也没用过,一直用Spring Cloud,蚂蚁金服的RPC调用性能远超Google的lstio,真的是这样吗?

再看扩展点https://github.com/alipay/sofa-rpc/wiki/Extension-Loader

感觉是Ecplise 插件机制的框架应用在了RPC

所以感觉蚂蚁金服的RPC框架是在Spring Boot基础之上,借鉴了EJB Remote Call机制和Ecplise插件扩展机制,看其致谢:SOFARPC 最早源于阿里内部的 HSF,非常感谢毕玄创造了 HSF,使 SOFARPC 的发展有了良好的基础,也非常感谢寒泉子,独明,世范在 SOFARPC 发展过程中作出的贡献。毕玄、寒泉子,独明出身于IBM ?

关于Mybatis从几百万条记录返回7万条记录,并在tomcat显示问题

1)由于客户字段并不统一,随时有可能变化,是由Excel上传动态解析Excel形成的一个动态表,所以Mybatis返回,resultType并不是一个具体的Bean ,而是一个List<Map>

<select id=”find” resultType=”java.util.HashMap”
parameterType=”java.util.HashMap”>
${sql}
</select>

数据量小的时候,还不明显,数据量一大,数万条记录,就要了 老命了,用List<Map>解决动态字段的问题,在大数据下 是很不实用的,所以我直接用了JDBC的ResultSet,并用流式打开PreparedStatement

SqlSession session = sqlSessionFactory.openSession();
// List ll=session.selectList(“query”,TableObject.class);
JSONArray vos = new JSONArray();
Connection conn = null;
try {
conn = session.getConfiguration().getEnvironment().getDataSource().getConnection();
PreparedStatement stmt = conn.prepareStatement(sql, ResultSet.TYPE_FORWARD_ONLY,
ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);
ResultSet rs = stmt.executeQuery();
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();

try {
while (rs.next()) {
JSONObject vo = new JSONObject();
for (int i = 1; i <= columnCount; i++) {
String key = rsmd.getColumnName(i);
String value = rs.getString(i);
vo.put(key, value);
}
vos.add(vo);
}
} catch (Exception e) {
e.printStackTrace();
}

rs.close();
stmt.close();
// conn.close();
} catch (Exception e) {
e.printStackTrace();
}

session.close();

时间立即由几十秒 缩短为 几秒或者10几秒

2) 数据量返回太大,tomcat假死

tomcat的server.xml修改为:

<Connector port=”8080″ protocol=”HTTP/1.1″
connectionTimeout=”20000″
compression=”on”
compressionMinSize1=”2048″
noCompressionUserAgents=”gozilla, traviata”
compressableMimeType=”text/html,text/xml,text/javascript,text/css,text/plain”
redirectPort=”8443″ />

即启用tomcat压缩形式,tomcat响应立即 由一分钟以上 缩短为几秒。