Java는 Oracle AQ에서 메시지를 삭제할 수 없습니다
-
13-12-2019 - |
문제
Spring DefaultMessagelistenerContainer를 기반으로하는 WebLogic에 응용 프로그램을 배포하려고합니다.JNDI 이름에서 AQ 연결 팩토리 및 대상에 대한 액세스를 제공하기 위해 외부 서버를 사용하여 WebLogic을 설정했습니다.
나는받는 메시지를 기록하는 간단한 메시지 수신기가 있습니다 (단지 테스트).이 메시지 수신기를 아래에 표시된 Spring DMLC에서 래핑합니다.
<jee:jndi-lookup id="connectionFactory" jndi-name="jms/aq/admAQCF" />
<jee:jndi-lookup id="handlersDest" jndi-name="jms/aq/dpqueue"/>
<beans:bean id="testMessageListener" class="aquila.administrator.docprod.core.handler.adm.TestHandler"/>
<beans:bean id="testMLC" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<beans:property name="connectionFactory" ref="connectionFactory"/>
<beans:property name="destination" ref="handlersDest"/>
<beans:property name="messageListener" ref="testMessageListener"/>
</beans:bean>
.
WebLogic 에서이 응용 프로그램을 배포하려고 할 때마다 DMLC에서 다음 예외를 얻을 수 있습니다.
testMLC-26 [Tue Mar 13 14:07:52 GMT 2012] AQjmsConsumer.jdbcDequeue: Exception: oracle.jms.AQjmsException: JMS-122: Internal error Corrupted message
oracle.jms.AQjmsException: JMS-122: Internal error Corrupted message
at oracle.jms.AQjmsError.throwEx(AQjmsError.java:334)
at oracle.jms.AQjmsUtil.getTextData(AQjmsUtil.java:751)
at oracle.jms.AQjmsTextMessage.readTextMessageContainer(AQjmsTextMessage.java:308)
at oracle.jms.AQjmsTextMessage.<init>(AQjmsTextMessage.java:148)
at oracle.jms.AQjmsConsumer.jdbcDequeue(AQjmsConsumer.java:1389)
at oracle.jms.AQjmsConsumer.receiveFromAQ(AQjmsConsumer.java:1035)
at oracle.jms.AQjmsConsumer.receiveFromAQ(AQjmsConsumer.java:960)
at oracle.jms.AQjmsConsumer.receiveFromAQ(AQjmsConsumer.java:938)
at oracle.jms.AQjmsConsumer.receive(AQjmsConsumer.java:790)
at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveMessage(AbstractPollingMessageListenerContainer.java:431)
at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:311)
at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:264)
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1071)
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1063)
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:960)
at java.lang.Thread.run(Thread.java:662)
.
Java가 대기열에서 메시지를 수신 할 수 있도록이 문제를 해결하는 방법을 알고 있습니까?
감사합니다
해결책
이 답변은 실제로 메시지 대기열에서 덮개를 삭제하려고 시도하는 모든 경로에 "orai18n.jar"를 추가하는 것이 었습니다.내 예에서는 APPLISE 서버의 클래스 경로에 JAR을 추가했으며 문제를 해결했습니다.
제휴하지 않습니다 StackOverflow