메시지를 수신하고 상태를 DB로 업데이트하는 MQ 수신기가 있습니다. 나는 Hibernate 세션이 Spring에 의해 관리되는 환경을 가지고있다.최대 절전 모드 업데이트를 수행 할 때의 불일치
다음은 MQ 리스너 구성입니다. MQ 메시지를 처리하는 자바 말에
<bean id="queue" class="com.ibm.mq.jms.MQQueue">
<constructor-arg value="queuename" />
</bean>
<bean id="listenerBean" class="com.mypackage.Listener">
<property name="service" ref="myService" />
</bean>
<bean id="listener" class="org.springframework.jms.listener.adapter.MessageListenerAdapter">
<constructor-arg><ref bean="listenerBean"/></constructor-arg>
</bean>
<bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="connectionFactory" />
<property name="destination" ref="queue" />
<property name="messageListener" ref="listener" />
<property name="exceptionListener" ref="exceptionListener" />
<property name="sessionTransacted" value="true" />
<property name="autoStartup" value="true" />
</bean>
,
public class Listener implements MessageDelegate{
public MyService service;
@Override
public void handleMessage(Serializable message) {
service.process(message);
}
}
서비스 클래스의 처리 방법은 DB를 업데이트 할 수있는 DAO 메소드를 호출합니다.
다음은 Spring sessionFactory bean org.springframework.orm.hibernate3.LocalSessionFactoryBean
에 사용되는 최대 절전 모드 속성입니다.
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
<prop key="hibernate.cache.use_second_level_cache">true</prop>
<prop key="hibernate.cache.use_query_cache">true</prop>
<prop key="hibernate.show_sql">false</prop>
<prop key="hibernate.generate_statistics">true</prop>
<prop key="hibernate.cache.provider_configuration_file_resource_path">ehcache_db_custom.xml</prop>
</props>
</property>
이 sessionFactory에 내 DAO 빈에 주입하고 난 MQ 메시지로부터 얻을 나는 고유 한 값을 기준으로 콩을 얻을 수 기준 API를 사용하고이 session
를 사용 sessionFactory.getCurrentSession()
를 사용하여 내 세션을 얻을 고유 한 결과를 얻으면 상태를 성공으로 변경하고 sessionFactory.getCurrentSession()
을 호출하여 session
을 얻고 session.update()
을 호출하여 DB를 업데이트하십시오.
hbm 파일을 사용하면서 bean에 대한 주석이 없습니다. 일대 다 또는 다 대일 매핑이없는 단순한 bean입니다. 주석은 @Transactional
입니다.
다음은 업데이트 스 니펫입니다. 저는 Spring이 트랜잭션을 처리한다고 생각합니다.
Session session = sessionFactory.getCurrentSession();
if(session != null && bean != null) {
session.update(bean);
}
은 내가 DB 업데이트가 실패 할 때마다 DB가 성공적으로 업데이트하고 예외 처리에 대한 (나 추가, log4j에) 로거가 있습니다.
이상한 부분이 있습니다.
로그가 최대 절전 모드에서 발생하는 예외를 표시하지 않고 로그 표시 DB가 성공적으로 업데이트되는 다중 스레드 환경에서 시나리오를 발견했습니다. 그러나 상태는 업데이트되지 않습니다. 이것은 일부 레코드에만 발생하며 전체에 대해서는 발생하지 않습니다. 성공적으로 업데이트 된 레코드가 있습니다. 데이터 관련 문제를 찾을 수 없습니다.
JUnit을 사용하여 업데이트하지 못한 레코드 중 하나를 실행했을 때 성공적으로 업데이트되었습니다.
설정이 끝나면 아무 것도 알려주지 않습니까?
MQ 리스너 코드를 추가하고 구성된 리스너 수를 알려줄 수 있습니까? – developer
@javaguy 질문에 MQ 리스너 코드가 업데이트되었습니다. 8 개의 JVM에 2 개의 서버에 8 개의 리스너가 분산되어 있습니다. – Prabhat