1. axis2 webservice 主线程不允许执行耗时操作
遇到的现象:暴露的接口需要处理与另外的一个接口进行交互100余次
症状:通过自己的接口调用另外一台主机的接口,前两次能获取值 往后都连接超时
解决办法:
a.在接口方法中我通过main方法调取外一台主机接口不会发生任何超时,排除了对方接口处理数据效率问题,问题属性我方接口
b.我把另一项目中的axis2.xml整个替换,并没有发现限制三次连接问题
c.通过排查排除拦截机制问题
d.我在接口中开启一个新线程用来接口交互发现问题完美解决。得出理论 即:
调用我方接口,接口开启一个主线程 然而主线程并不能进行耗时操作,这个有点类似于安卓的handler机制,由于线程机制特殊性,即主线程执行结束 新建线程没执行完成会继续执行下去 并不与主线程产生依赖关系。
2.定时任务问题
遇到 的现象:定时任务开启,service被@autoware后无法注入
症状:由于service无法手动注入 无法通过new的方式所以会报空指针异常
解决办法:
a.通过spring.xml中的自动扫描指向到该文件夹下,失败 service还是无法自动注入
b.可以通过白盒测试法 拿到该service javabean非注解方式,虽然当时并没有这样操作但理论上可行
<pre name="code" class="html">import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
private ApplicationContext applicationContext;
@Before
public void setUp() throws Exception {
applicationContext = new FileSystemXmlApplicationContext("classpath:spring/applicationContext.xml");
}
@Test
public void testSelectBySelective() {
MobileDepartmentTotalService mobileDepartmentTotalService = (MobileDepartmentTotalService)applicationContext.getBean("mobileDepartmentTotalService");
//MobileDepartmentTotal mobileDepartmentTotal = new MobileDepartmentTotal();
List<MobileDepartmentTotal> list = mobileDepartmentTotalService.selectBySelective(null);
System.out.println(list.size());
}
c.我把放在定时任务中的整个业务逻辑放入接口中通过httpClient方式调用,这是我当时脑海中第一想到能100%解决的办法,代码如下
HttpClient httpClient = new HttpClient();
GetMethod getMethod = new GetMethod(url);
getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,new DefaultHttpMethodRetryHandler());
try {
httpClient.executeMethod(getMethod);
ByteArrayOutputStream out = new ByteArrayOutputStream();
InputStream in = getMethod.getResponseBodyAsStream();
int len = 0;
byte[] buf = new byte[1024];
while((len=in.read(buf))!=-1){
out.write(buf, 0, len);
}
responseMsg = out.toString("UTF-8");
} catch (HttpException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
//释放连接
getMethod.releaseConnection();
}