2017-12-05 28 views
0

간단히 말해서, 저는 스프링 에서 가져온 간단한 JMS 구성을 사용합니다. 시작 가이드 : https://spring.io/guides/gs/messaging-jms/. TX는 성공적인 경우에만,현재 JMS 상태를 즉시 무시하고 메시지를 보냅니다.

@Service 
open class MyService(private val t: JmsTemplate) { 
// 
    @Transactional 
    open fun go(sth: String) { 
    val result = // some logic here 
    t.convertAndSend("NeedsToBeDelivered", result) 
    // more logic which might fail 
    } 
} 

결과를 전달하지 않을 경우 :

내 경우에는 내가 TX 실패하더라도 거래 방법, STH 같은 (코 틀린 코드)에서 JMS 메시지를 전송하고 싶습니다이다 - 로직 섹션이 실패하면 - msg가 손실됩니다. 여러 가지 방법으로 AMQ를 구성하려고했지만 몇 가지 TX 변형을 시도했지만 나에게 적합한 것은 아닙니다.

나는 에 관심이 있습니다. TX 상태를 무시하고 2/즉각 배송 (현재 TX가 완료 될 때까지 연기되지 않았습니다).

제안 사항?

UPDATE

어제 나는이 일을 시도하고 예상대로 작동합니다. 우리가 모든 conn.close() -like 혼란 및 예외 처리를 피하기 이런 식으로 일을 가진 - 게리에 의해 제안

@Transactional(propagation = NOT_SUPPORTED) 
fun sendNoTx(msg: String, destination: String) = try { 
    val con = cf.createConnection() // cf stands for connection factory 
    con.start() 
    val session = con.createSession(false, AUTO_ACKNOWLEDGE) 
    val producer = session.createProducer(session.createQueue(destination)) 
    producer.send(session.createTextMessage(msg)) 
    con.close() 
} catch (e: Exception) { 
    LOG.warn("Failed to send NO TX message", e) 
} 

더 우아한 해결책은 CF의 또 다른 인스턴스와이 JmsTemplate을 공급하는 것입니다.

답변

0

JmsTemplate이 수신기 컨테이너의 트랜잭션에 참여하지 않도록 2 개의 연결 팩토리를 사용해야합니다.

서식 파일은 연결 팩토리에서 입력 한 트랜잭션 리소스 (세션)에 대한 조회를 수행합니다.

연결 팩토리가 다른 경우 연결 팩토리를 찾지 못하며 자체 세션을 대신 사용합니다.