当前位置: 代码迷 >> J2SE >> 大家给个提醒,多谢了。同样的程序在main函数里执行和在servlet执行,结果是不一样的呢
  详细解决方案

大家给个提醒,多谢了。同样的程序在main函数里执行和在servlet执行,结果是不一样的呢

热度:91   发布时间:2016-04-23 20:40:27.0
大家给个提醒,谢谢了。同样的程序在main函数里执行和在servlet执行,结果是不一样的呢?
普通JAVA代码

public static void main(String[] args){     
    Comp comp = new Comp();
    comp.lgm("a.bmp", "b.bmp");        
}


Servlet代码
	
public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletExceptionIOException {   
 
        try { 
             
            Comp comp = new Comp();
            comp.lgm("a.bmp", "b.bmp");   
             
             
        }catch (Exception e){
            e.printStackTrace();
        }
         
        response.sendRedirect("/default.jsp");
         
    }


被调函数Comp.lgm

public String lgm(String a,String b){       
    String strScore = "zheng dao.";       
    Comp hello = new Comp();
    hello.open();
 
    String file1 = a;
    String file2 = b;          
 
    System.out.println("11111111111111111111111");               
 
    try{       
         
        int init = hello.initTHFaceID("/gfserver/lib/Work",1);   
        System.out.println("22222222222222222222222222");           
 
        int free = hello.freeTHFaceID(1);
    }catch(Exception e){
 
        System.out.print("Pserrorerrorerrorerror:"+e.toString());
        e.printStackTrace();
    }                       
 
    System.out.println("333333333333333333333333333333"); 
 
    hello.close();//当servlet的时候,这个close没有关闭成功。但是普通JAVA关闭成功   
 
    System.out.println("444444444444444444444444444444444"); 
 
    return strScore;
}



JNIEXPORT void JNICALL Java_com_Compare_open(JNIEnv *env, jobject obj){

imglib = dlopen("libMidCompare.so", RTLD_LAZY);
if(imglib!=NULL){
   printf("Open libMidCompare.so with handle ok.\n");
}else{
   printf("Open libMidCompare.so with handle fail!\n");
}
}



JNIEXPORT void JNICALL Java_com_Compare_close(JNIEnv *env, jobject obj){

if (imglib != NULL ) {
printf("close--2 ! \n");
    dlclose(imglib);
    printf("close--3 ! \n");///////通过SERVLETR这个没有执行到,但是普通JAVA可以执行到
      printf("Close with handle ok.\n");
}else{
    printf("Close with handle fail!\n");
}

}


第三方厂商提供我们一个SO文件,里面有初始化资源函数,释放初始化资源函数,还有其他涉及业务的函数。。

通过编写一个普通JAVA main程序可以调用成功。首先OPEN SO动态链接库,然后打出1111,然后又初始化资源,然后打印2222,然后打出3333,然后释放资源,然后CLOSE so资源,最后打出4444这样的顺序。

但是我将同样的程序写在java servlet web工程下,为什么就执行就不对。
1.首先顺序不对,先打出111没有错,然后分别打出22222,3333,然后才OPENT SO动态链接,然后初始化资源,然后释放资源,然后CLOSE SO资源(此时关闭错误),并且4444没有打印出来。

难道是第三方提供的动态链接库不支持B/S结构的,或者是他们的SO中函数有另外的线程与JAVA SERVLET 线程不同步。

仅仅开了一个SERVLE,就是说我是通过但线程执行的啊。 
------解决方案--------------------
看着挺复杂的样子。。
------解决方案--------------------
顺序应该是不会颠倒的,可能是输出的时候受到了什么影响

可以debug试试
------解决方案--------------------
是否达到了最终的功能?
 debug下是否有异常,应该很好判断。
------解决方案--------------------
这个可能和web容器自己的线程有关系。
你先试下异步操作有没有问题
	private ExecutorService es;

@Override
public void init() throws ServletException {
  相关解决方案