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

博客内容讲述了在Java主函数和Servlet环境下调用第三方SO库进行资源操作时出现的不同行为。在主函数中,程序按预期顺序执行,但在Servlet中,执行顺序出现混乱,资源关闭出现问题。作者怀疑可能与SO库不支持B/S结构或线程同步有关,并提出了可能的解决方案,包括尝试异步操作和检查线程安全。
摘要由CSDN通过智能技术生成

大家给个提醒,谢谢了。同样的程序在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 ServletException, IOException {

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 {

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值