Caused by: com.oracle.svm.core.jdk.UnsupportedFeatureError: No classes have been predefined during the image build to load from bytecodes at runtime.

spirngboot项目,graalvm native 编译完成后运行服务运行报错,

Caused by: com.oracle.svm.core.jdk.UnsupportedFeatureError: No classes have been predefined during the image build to load from bytecodes at runtime.

看帖子说是jdk版本问题,可我是用的graalvm编译的没错呀。后测试发现跟springboot版本有关,springboot3.1.0会报这个错,3.0.4和3.0.7测试过没问题

反序列化错误com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `***` (no Creators, like default constructor, exist): abstract types either need to be mapped to concrete types, have custom deserializer, or contain additional type information

在junit中用jackson做反序列化的时候报错

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of *** (no Creators, like default constructor, exist): abstract types either need to be mapped to concrete types, have custom deserializer, or contain additional type information

原因是用了2个class继承一个interface,反序列化interface时无法找到用哪个class结果出了异常,网上能搜到的解决方法是写个配置类,如:@Bean注解创建ObjectMapper、重写configureMessageConverters方法。

发现了一个更简单的方式,是在属性中加@JsonDeserialize注解如:

//这里I是interface I2是I的实现类
@JsonDeserialize(contentAs=I2.class)
public interface I{
  Integer a;
}

这样Junit中的反序列化就能跑通了

springcloud中怎么蓝绿发布嘞

百度上搜的有好多理论。就不说了
springcloud没啥管理界面。
搜到一个springcloudadmin的,结果是个第三方的。觉得不太稳。

我们的环境是,阿里云的docker,springcloud经典全家桶。
服务更新的时候是,同时启动版本1和版本2,两个服务,然后关掉老的版本1.
这样会造成5~10秒的服务中断

单一服务的时候,是用的阿里负载均衡的蓝绿发布。但使用注册服务eureka的话这样就不行了。

再说下早期的弯路,也是搜百度,springcloud如何优雅关闭,然后找到了,每个服务可以执行 shutdown方法,但这其实并没有什么卵用。阿里关闭服务的时候已经算是优雅关闭了。用这个效果一样。

最终解决的方向是,eureka里的 /status?value=OUT_OF_SERVICE
格式是 PUT方法(必须PUT别的不行)
http://eureka/apps/服务名(大小写都行)/[服务id]/status?value=OUT_OF_SERVICE
这样在eureka中服务会显示OUT_OF_SERVICE,新的请求就不会走这个服务了,如果想回滚只要这个服务没有删重新设置成UP就行了。
注意:如果里面运行着队列的话会继续执行的,并不会终止。

如何制作一个UI界面方便管理呢。
最早看贴子有说用postman的
然后想过做个html解析,处理下eureka页面。

现在的方案是,改写eureka的url
eureka.instance.status-page-url=http://处理页面/hoststatus?servicename=${spring.application.name}&clientid=${clientid}
这个配置是在每个服务里的。这样注册后,会在eureka中看到这个链接,不再是/info
这个页面里可以写个开关服务的按钮就行了。比较容易实现。

jmater,2毫秒间隔请求接口实测,0异常。

springcloud中缓存的小坑坑

在springboot中使用缓存是很随意的,dao中能加缓存 service中能加缓存,crontroller中都能加缓存。
但如果把springcloud包引入后会发现缓存不能随便用了,只能在dao层中使用
别的层如果还想用缓存注解尝试过把核心库中一个jar换成早期测试版可以办到。。。但这样会让微服务间无法正常请求数据。

目前只能在dao中使用缓存
参数设置方式只能是root.args[0],root.args[0].id 这种,不能用其他的别名

java 时区 CST

之前没关注过, 理解上系统时间是UTC+8,并且new Date()添加到数据库是对的就正常了。

但是:发现如果是录入时间 比如字符串 “2016-09-09 00:00:00” 那么转换成Date就变成了CST时间,这样再录入数据库就会错误。
会是 2016-09-09 00:00:00 CST

解决方法:修改数据库时区就好了

swagger+spring+junit冲突

swagger +spring+junit冲突
junit的测试跑不起来,主要原因是引用的注解造成的:

@Configuration
@EnableWebMvc
@EnableSwagger2
@ComponentScan(basePackages ={"xx"})
public class SwaggerConfig {
...
}

我的解决办法是把swaper配置文件分离出来,junit不调用.
原先配置文件只有默认的两个:
/WEB-INF/spring-servlet.xml
/WEB-INF/applicationContext.xml
修改后增加一个
/WEB-INF/spring-swagger.xml

并改成在web.xml导入配置文件

<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>
    /WEB-INF/spring-servlet.xml
    /WEB-INF/applicationContext.xml
    /WEB-INF/spring-swagger.xml
  </param-value>
</context-param>

参考:http://stackoverflow.com/questions/7471544/unit-testing-spring-mvc-web-app-could-not-autowire-field-private-javax-servlet

hadoop2.6 配置注意点

终于能用了,都快崩溃了
ERROR org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode: Exception in doCheckpoint
和之前种种异常,
列下需要注意的地方:

1:9000和9001, 这俩设置成统一的
2:虚拟机iptables 要关掉,有可能把端口封掉
3:hostname 跟hosts里设置成一样的会比较方便,生成id_rsa.pub的时候里面的路径就自动跟计算机名一致了
4: 我是用虚拟机的,1个master 1个slave 在slaves里把 master,slave1都加上了。

额外的诡异问题,配置好后运行无异常。但用测试demo,wordcount无法生成输出内容。
什么都没动,没关机器,第二天又自己好了。。