Пожалуйста, помогите мне понять следующее.
У меня есть пружинный интеграционный тест, который я пытаюсь проверить методом класса 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 MessageListener:
@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 видел объекты, созданные в основном потоке, в котором выполняется метод теста?