我有一个用Apache Camel 2.17.0
实现的简单java测试应用程序<camelContext id="txn-route-context" xmlns="http://camel.apache.org/schema/spring">
<route id="partnerToDB-route">
<from uri="jms001:queue:camelInAction.sample.partners?username=admin&password=" />
<transacted />
<bean ref="partner" method="toSql" />
<to uri="jdbc:testoracledb001" />
<log message="Finished running SQL...wait for program exit..."></log>
</route>
</camelContext>
该路由从jms队列中读取消息,使用&#34; partner&#34;来构造插入SQL语句。 bean&#34; toSQL&#34;方法,然后调用JDBC端点通过JDBC运行insert语句,写一条日志消息,然后退出。
如果我将它打包为可运行的jar并使用&#34; java -jar直接运行它,那么这个Java程序运行没有问题...&#34;
然后我将runnable jar打包在一个高山java docker镜像中,然后在docker容器中运行它。请注意,我在运行Docker-Machine的Win7 PC上
docker build -t "alpine:Java8" .
docker run alpine:Java8 java -jar /jdbctest/jdbctest.jar
第一个docker run是可以的......但如果我多次重复相同的docker run命令,那么进程可能会停留在JDBC端点直到超时......
20160401 10:00:49,752[camelInAction.sample.partners]] EndpointMessageListener WARN Execution of JMS message listener failed. Caused by: [org.apache.camel.RuntimeCamelException - java.sql.SQLRecoverableException: No more data to read from socket]
org.apache.camel.RuntimeCamelException: java.sql.SQLRecoverableException: No more data to read from socket
at org.apache.camel.util.ObjectHelper.wrapRuntimeCamelException(ObjectHelper.java:1680)
at org.apache.camel.spring.spi.TransactionErrorHandler$1.doInTransactionWithoutResult(TransactionErrorHandler.java:190)
at org.springframework.transaction.support.TransactionCallbackWithoutResult.doInTransaction(TransactionCallbackWithoutResult.java:34)
at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:133)
at org.apache.camel.spring.spi.TransactionErrorHandler.doInTransactionTemplate(TransactionErrorHandler.java:176)
当问题发生一次时,如果我再次执行docker run,它是可重复的。如果我删除docker镜像,重建图像并执行docker run,程序将恢复正常,直到我多次运行它。
我看不到任何进一步的日志或调查错误......想寻求进一步调查的建议
补充一些Dockerfile内容
FROM alpine:3.3
#...curl and apk commands to install Jdk8... skip here
ENV JAVA_HOME=${JAVA_HOME} \
PATH=${PATH}:${JAVA_HOME}/bin
VOLUME /jdbctest
COPY ./jdbctest.jar /jdbctest/
补充我的Spring JDBC连接配置
<bean id="db001" class="oracle.jdbc.pool.OracleDataSource" destroy-method="close">
<property name="URL" value="${db001.url}" />
<property name="user" value="${db001.username}"/>
<property name="password" value="${db001.password}"/>
<property name="connectionCachingEnabled" value="true"/>
</bean>
完成了一些测试:
1)使用centos:最新作为基本图像而不是alpine linux ...我可以重复docker运行大约4-5次,但后来得到了#34; java.sql.SQLRecoverableException:没有更多数据要读取来自socket&#34; ...如果我重新构建docker镜像并且&#34; docker run&#34;再次
2)&#34; docker rm&#34;我能找到的所有容器&#34; docker ps -a&#34;在每次重新运行之前,发现了同样的问题。
3)通过连接另一台Oracle数据库服务器进行测试......同样的问题仍然存在。 Oracle DB版本是Oracle Database 11g企业版版本11.2.0.4.0 - 64位。我正在使用ojdbc6.jar jdbc驱动程序。
4)如果我运行相同的jar而不将其包装在docker容器中,则问题不会发生