#java #glassfish #jms #java-ee-7
#java #glassfish #jms #java-ee-7
Вопрос:
Недавно я написал некоторый тестовый код для Java EE JMS API и наткнулся на то, что мне кажется ошибкой.
Тест довольно прост: компонент CDI подключается к странице JSF и отправляет предопределенное значение JMSMessage
в Queue
. Существует компонент, управляемый сообщениями, который прослушивает сообщения об этом Queue
, и он отвечает на входящие сообщения в onMessage
своем методе. Посредством другого вызова со страницы JSF компонент CDI пытается синхронно получать новые сообщения и отображает их во внешнем интерфейсе.
Вот источник:
MDB
@JMSDestinationDefinition(
name = "java:app/jms/SomeQueue",
interfaceName = "javax.jms.Queue",
destinationName = "SomeQueue")
@MessageDriven(activationConfig = {
@ActivationConfigProperty(propertyName = "destinationLookup", propertyValue = "java:app/jms/SomeQueue"),
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue")
})
public class MyBean implements MessageListener {
@Inject
private JMSContext context;
@Resource
private MessageDrivenContext mdc;
@Resource(lookup = "java:app/jms/SomeQueue")
private Queue queue;
@Override
public void onMessage(Message message) {
TextMessage tMessage = (TextMessage) message;
try {
context.createProducer().send(queue, tMessage.getText() ", Answer");
} catch (JMSException e) {
mdc.setRollbackOnly();
e.printStackTrace();
}
}
}
Компонент CDI
@RequestScoped
@Named("jmssender")
public class JMSSender {
@Inject
private JMSContext context;
@Resource(lookup = "java:app/jms/SomeQueue")
private Queue queue;
@Inject
private UserTransaction utx;
private String answer;
private TextMessage message;
private int num;
public void sendMessage() {
try {
utx.begin();
message = context.createTextMessage();
String message = "This is message Nr. " num;
try {
this.message.setText(message);
} catch (JMSException e) {
e.printStackTrace();
message = "An error occurred";
}
context.createProducer().send(queue, message);
utx.commit();
} catch (HeuristicRollbackException e) {
e.printStackTrace();
} catch (RollbackException e) {
e.printStackTrace();
} catch (SystemException e) {
e.printStackTrace();
} catch (HeuristicMixedException e) {
e.printStackTrace();
} catch (NotSupportedException e) {
e.printStackTrace();
}
}
public void receive() {
try {
utx.begin();
answer = context.createConsumer(queue).receiveBody(String.class);
utx.commit();
} catch (NotSupportedException |
SystemException |
HeuristicRollbackException |
RollbackException |
HeuristicMixedException e) {
answer = "Error receiving message";
e.printStackTrace();
}
}
------getters and setters-----
num
Свойство используется для идентификации каждого отправляемого сообщения. Я использовал message
свойство, чтобы проверить, правильно ли были отправлены мои JMSMessages.
Проблема
После отправки сообщения я пытаюсь получить ответ и увидеть его в своем интерфейсе, он выглядит так:
Это сообщение Nr . 8 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 Версия 2.0 2.0
По-видимому, он зацикливает часть строки, которую я вложил в исходное сообщение, хотя при изменении точности where в коде к сообщению добавляется дополнительная строка «, Answer», само сообщение «это сообщение NR. X» зацикливается. Также кажется, что длина зацикленного фрагмента зависит от того, насколько велик интервал между нажатием кнопки «отправить» и «получить».
Если я только укажу строку типа «Hello» или просто отправлю сообщение обратно с помощью TMessage.getText() , оно работает нормально и не зацикливает какую-либо конкретную часть
Я делаю ошибку или это на самом деле ошибка?
Обновить
-Удалены все виды использования интерфейса UserTransaction (думал, что это может потребоваться для подтверждения сообщений в компоненте CDI) — не помогло
Комментарии:
1. Вы отправляете сообщение из MDB в ту же очередь, в которой этот MDB прослушивает? Разве это не должна быть другая очередь?
2. Имеет смысл 🙂 Я попробую. Также в целом: нужно ли мне управлять транзакцией в веб-контейнере, чтобы сообщение было правильно подтверждено?
3. Спасибо за помощь… Вы были правы, я чувствую себя немного расстроенным из-за того, что упустил что-то настолько очевидное. Чтобы правильно реализовать механизм запроса / ответа, было бы использовать временные пункты назначения, не так ли?