在docker容器

时间:2016-04-01 10:11:01

标签: java spring docker apache-camel spring-jdbc

我有一个用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容器中,则问题不会发生

0 个答案:

没有答案