請幫我理解以下內容。用JPA和JMS進行春季集成測試的交易傳播
我有一個Spring集成測試,我想測試ProcessCommentsDao類的方法:)
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:testContext.xml"})
@Transactional()
public class ParseCommentsTest {
@Resource
private ProcessCommentsDao processCommentsDao;
@Test
public void testJMS() throws Exception {
// Test data creation
.........................
processCommentsDao.parseComments();
}
}
在該方法中parseComments(,我得到實體的名單,然後每個實體處理通過Spring的JMS消息監聽實現:
@Service
public class ProcessCommentsDaoImpl extends BaseDao implements IProcessCommentsDao {
private static final int PARSE_COMMENTS_COUNT_LIMIT = 100;
@Autowired
private JmsTemplate jmsTemplate;
@Autowired
private Queue parseCommentsDestination;
@Override
public void parseComments() {
List<Comment> comments = attributeDao.findTopUnparsedComments(PARSE_COMMENTS_COUNT_LIMIT);
for (Comment comment : comments) {
jmsTemplate.convertAndSend(parseCommentsDestination, comment);
}
}
}
了MessageListener的執行標準如下:
@Component
public class QueueListener implements MessageListener {
@PersistenceContext
private EntityManager em;
@Transactional()
public void onMessage(final Message message) {
try {
if (message instanceof ObjectMessage) {
final ObjectMessage objMessage = (ObjectMessage) message;
Comment comment = (Comment) objMessage.getObject();
//...Some logic ...
comment = em.find(Comment.class, comment.getId());
comment.setPosStatus(ParsingType.PROCESSED);
em.merge(comment);
//...Some logic ...
} catch (final JMSException e) {
e.printStackTrace();
}
}
}
其結果是,該方法em.find(Comment.class,comment.getId())返回null,因爲數據是在另一個線程創建和當前線程不知道這個交易什麼。有沒有辦法設置事務傳播,以便MessageListener方法可以在主線程中創建,其中測試方法在哪裏運行?
謝謝爲了您的評論。我也想過以你所建議的方式進行測試。另外,我找到了我的問題的解決方案。我在下一篇文章中寫過。關於測試中的種族問題,我發佈了一個不完整的版本。更正了下面的代碼。 – Prix 2011-12-29 12:05:40