Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Docker Java回调期间套接字读取中断 上下文_Java_Docker Java - Fatal编程技术网

从Docker Java回调期间套接字读取中断 上下文

从Docker Java回调期间套接字读取中断 上下文,java,docker-java,Java,Docker Java,我有一个Web服务在队列中写入测试id。然后,侦听器读取队列,搜索测试并启动它。在这些步骤中,它在数据库中写入测试更新,以便向用户显示。更准确地说:测试是在docker容器中启动的,在测试结束时,我想将测试状态更新为FINISHED。为此,我使用带有回调的docker java库 问题 在调用回调时,我会在更新测试的调用中收到多条错误消息(但如果第二次尝试两次,则只会发生一次,但它仍然会从事务管理器写入大量错误消息) 以下是记录的错误消息: 2020-11-20 09:20:43639警告[do

我有一个Web服务在队列中写入测试id。然后,侦听器读取队列,搜索测试并启动它。在这些步骤中,它在数据库中写入测试更新,以便向用户显示。更准确地说:测试是在docker容器中启动的,在测试结束时,我想将测试状态更新为
FINISHED
。为此,我使用带有回调的docker java库

问题 在调用回调时,我会在更新测试的调用中收到多条错误消息(但如果第二次尝试两次,则只会发生一次,但它仍然会从事务管理器写入大量错误消息)

以下是记录的错误消息:

2020-11-20 09:20:43639警告[docker java stream--1032099154](org.jboss.jca.core.connectionmanager.listener.TxConnectionListener)IJ000305:发生连接错误:org.jboss.jca.core.connectionmanager.listener。TxConnectionListener@600268e6[state=NORMAL-managed-connection=org.jboss.jca.adapters.jdbc.local。LocalManagedConnection@236f1a69连接句柄=1 lastReturned=1605860423264 lastValidated=1605860242146 lastCheckedOut=1605860443564 trackByTx=true pool=org.jboss.jca.core.connectionmanager.pool.strategy。OnePool@2efb0d3b微通道板=SemaphoreConcurrentLinkedQueueManagedConnectionPool@3e8e7a62[池=应用程序]xaResource=LocalXAResourceImpl@482fdad2[connectionListener=600268e6 connectionManager=4c83f895 warned=false currentXid=null productName=Oracle productVersion=Oracle数据库18c企业版18.0.0.0版-生产
版本18.3.0.0.0 jndiName=java:/ApplicationDS]txSync=TransactionSynchronization@1387480544{tx=本地事务(委托=TransactionImple,所有者=提供程序JBoss JTA事务提供程序的本地事务上下文)wasTrackByTx=true登记=true取消=false}]:java.sql.SQLRecoverableException:IO错误:套接字读取中断
2020-11-20 09:20:43647信息[docker java stream--1032099154](org.jboss.jca.core.connectionmanager.listener.TxConnectionListener)IJ000302:未注册的未注册句柄:org.jboss.jca.adapters.jdbc.jdk8。WrappedConnectionJDK8@4f3c1cb2对于托管连接:org.jboss.jca.adapters.jdbc.local。LocalManagedConnection@236f1a69
2020-11-20 09:20:43656警告[docker java stream--1032099154](com.arjuna.ats.jta)ARJUNA016031:XAOnePhaseResource.rollback for失败,异常:org.jboss.jca.core.spi.transaction.local.xaexception:IJ001160:无法回滚本地事务
原因:org.jboss.jca.core.spi.transaction.local.LocalResourceException:IO错误:套接字读取中断
在org.jboss.ironjacamar。jdbcadapters@1.4.22.Final//org.jboss.jca.adapters.jdbc.local.LocalManagedConnection.rollback(LocalManagedConnection.java:139)
...
原因:java.sql.SQLRecoverableException:IO错误:套接字读取中断
位于com.oracle.jdbc//oracle.jdbc.driver.T4CConnection.doRollback(T4CConnection.java:1140)
...
原因:java.io.InterruptedIOException:套接字读取中断
位于com.oracle.jdbc//oracle.net.nt.TimeoutSocketChannel.handleInterrupt(TimeoutSocketChannel.java:258)
...
说明 开始时,我考虑了一个连接问题,可能事务在回调时不再可用(因为docker运行时间太长),可能它必须无效

但在最后,正如控制台中所写的,它来自于线程试图获取锁以更新测试时的中断,我发现了这种中断的来源:我查看了docker java库中的,我发现:

Thread-Thread=新线程(()->{
Thread streamingThread=Thread.currentThread();
try(DockerHttpClient.Response=执行(请求)){
callback.onStart(()->{
streamingThread.interrupt();
response.close();
});
sourceConsumer.accept(响应);
callback.onComplete();
}捕获(例外e){
回调。onError(e);
}
},“docker java stream-”+Objects.hashCode(请求));
setDaemon(true);
thread.start();
在这里,提供给
onStart
的closable会中断线程

@Override
public void onComplete() {
    try {
        close();
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}
决议 问题最终来自我编写的以下代码:

@Override
public void onComplete() {
    super.onComplete();
    updateTest(FINISHED);
}
我从父级调用了
onComplete
方法,但不知道is做了什么,并且像往常一样,在执行任何其他操作之前,首先调用了该方法。要纠正这一点,我只需在最后调用super方法:

@Override
public void onComplete() {
    updateTest(FINISHED);
    super.onComplete();
}