Spring Cloud Config 发现自以为是的bug之旅

最近开始学习Sping Cloud,在学习Spring Cloud Config的过程中,发现如果想加载本地的配置文件,需要启用spring.profiles.active=native。
完整配置:

1
2
3
4
5
6
7
8
9
10
spring:
application:
name: microservice-config
profiles:
active: native
cloud:
config:
server:
native:
search-locations: file:///H://workspace//microservice-config-repo

但是又使用了多环境配置多环境配置,如:

1
2
3
4
5
6
7
8
9
  ---
spring:
profiles: local
---
spring:
profiles: dev
---
spring:
profiles: pro

刚开始,我认为多环境与配置中心的配置他俩有冲突,因为使用了多环境就没法使用native。还自以为是的认为这是一个bug,跑到spring cloud config的git issue录了个问题https://github.com/spring-cloud/spring-cloud-config/issues/757。

后来发现原来spring.profiles.active 可以设置多个值,使用“,”分隔,无先后顺序。

rocketmq “no route info of this topic”异常解决

一、问题重现

rocketmq按照官方Quick Start https://rocketmq.incubator.apache.org/docs/quick-start/:

  1. Start Name Server
  2. Start Broker
  3. Send & Receive Message

执行到第三步事,异常:

1
2
com.alibaba.rocketmq.client.exception.MQClientException: No route info of this topic, TopicTestA
at

二、问题查找

经过查找资料,大部分是在启动broker的时候添加autoCreateTopicEnable=true 参数,经过实际测试,该参数并不能解决问题

三、问题解决

https://github.com/alibaba/RocketMQ/issues/44 ISSUES中已经有很多人遇到过此问题。实际的问题原因是系统防火墙。关闭防火墙或者添加9876、10911端口开放规则即可。

兼职之血泪经验

作为程序猿,肯定避免不了有熟悉的人来找帮忙做些东西,刚开始就只是单纯地帮忙,随着别人给些红包就慢慢的收费了,也有了自己的定价。俗话说,林子大了什么鸟都有,你就会遇到各种奇葩的人。本人虽然只是结了几个做前端页面的小活,也有了一些个人总结。

ORA-12155 Error

最近查看生产机日志,返现数据库链接老是报【 ORA-12155: TNS: 在 NSWMARKER 包中收到错误的数据类型】异常,
百度、Google后发现问题原因是Internal error during break handling.但是没有找到合适的解决办法。

后来想到TNS、Internal error代表的是网络间的异常,会不会是驱动jar包的问题呢。到官网下载了一个官方的ojdbc6.jar(Oracle11g)替换了下驱动,经过测试,果然是驱动包的问题。

an-ajax-status0-error-caused-the-problem

Ajax方法接口调用时,突然遇到了status0异常,本机测试接口没有发现异常,说明接口无误。

服务器接口有问题,说明是服务器的某个环节出现了问题,经过排查,发现web服务器(Apache)的磁盘空间满,清理日志文件后测试恢复正常

$.when(array)

1
var promises = [
	ajaxs(1000).then(function(data){console.log(data)},function(data){console.log('reject:'+data)}),
	ajaxs(2000).then(function(data){console.log(data)},function(data){console.log('reject:'+data)}),
	ajaxs(3000).then(function(data){console.log(data)},function(data){console.log('reject:'+data)}),
	ajaxs(4000).then(function(data){console.log(data)},function(data){console.log('reject:'+data)}),
	ajaxs(4000).then(function(data){console.log(data)},function(data){console.log('reject:'+data)}),
	ajaxs(3000).then(function(data){console.log(data)},function(data){console.log('reject:'+data)}),
	ajaxs(2000).then(function(data){console.log(data)},function(data){console.log('reject:'+data)}),
	ajaxs(5000).then(function(data){console.log(data)},function(data){console.log('reject:'+data)}),
	ajaxs(1000).then(function(data){console.log(data)},function(data){console.log('reject:'+data)}),
	ajaxs(6000).then(function(data){console.log(data)},function(data){console.log('reject:'+data)}),
	ajaxs(3000).then(function(data){console.log(data)},function(data){console.log('reject:'+data)}),
];


$.when.apply($, promises).then(function(schemas) {
	console.log("DONE", this, schemas);
}, function(e) {
	console.log('FAIL');
});



var i=0;
function ajaxs(timeout) {
	var dtd = $.Deferred();
	setTimeout(function() {
		if(i%2==0){
			dtd.resolve(timeout);
		}else{
			dtd.reject(timeout);
		}
		i++;
	}, timeout);
	return dtd.promise();
}

Mybatis设置全局变量

mybatis可以设置全局变量,可以用于数据库类型的标示,比如:dbType=oracle、dbType=mysql;
可通过configurationProperties参数设置,设置方法如下:

1
2
3
4
5
6
7
8
9
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:mybatis/mybatis-config.xml"/>
<property name="configurationProperties">
<props>
<prop key="dbType">oracle</prop>
</props>
</property>
</bean>

java中获取此参数可以通过:

1
sqlSessionFactory.getConfiguration().getVariables().getProperty("dbType")

java实现webuploader跨域上传

项目中使用webuploader进行文件上传,需要用到跨域,查看webuploader的issues发现是支持上传的,但是他们写的回复都是不清不白的,有点迷糊;想了半天才知道咋回事,也可能是我比较笨,再次记录下java中详细的处理。

webuploader进行上传,会执行2个请求;一个option请求,一个post(根据你的webuploader的配置method 值决定),需要在option请求中对响应头进行处理,post响应头也进行响应的处理。

以servlet为例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
@WebServlet(description = "文件上传",value = {"/file/upload"})
public class FileUpload extends HttpServlet {

public FileUpload() {
super();
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setHeader("Access-Control-Allow-Origin", "*");
resp.setHeader("Access-Control-Allow-Methods", "*");
resp.setHeader("Access-Control-Allow-Headers", "x-requested-with,content-type");
resp.setContentType("application/json");
resp.setCharacterEncoding("utf-8");
//文件上传逻辑


}

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}

@Override
protected void doOptions(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setHeader("Access-Control-Allow-Credentials", "false");
resp.setHeader("Access-Control-Allow-Origin", "*");
resp.setHeader("Access-Control-Allow-Methods", "*");
resp.setHeader("Access-Control-Allow-Headers", "x-requested-with,content-type");
resp.setContentType("application/json");
resp.setCharacterEncoding("utf-8");
super.doOptions(req, resp);
}

再次测试跨域上传,正常