请帮我理解以下内容。用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