JMS消息生产者不会将消息发送到队列
问题描述:
我设置了一个EJB项目以使用JMS将持久性实体对象发送到MDB。我使用的是使用Apache ActiveMQ作为消息传递提供程序的JBoss EAP 7。余设置像这样的ConnectionFactory和队列:JMS消息生产者不会将消息发送到队列
这是接收“帐户”实体对象作为参数,并将其发送到队列我的消息生产者:
EntityEnqueueBean.java
@Stateless
@LocalBean
public class EntityEnqueueBean {
Context context = null;
public void enqueueEntity(Account accountEntity) {
try {
context = new InitialContext();
ConnectionFactory connectionFactory = (ConnectionFactory) context.lookup("java:/ConnectionFactory");
Destination queue = (Destination) context.lookup("java:/jms/queue/AccountAccessQueue");
Connection connection = connectionFactory.createConnection();
Session session = connection.createSession(true, Session.SESSION_TRANSACTED);
MessageProducer messageProducer = session.createProducer(queue);
ObjectMessage objectMessage = session.createObjectMessage(accountEntity);
messageProducer.send(objectMessage);
messageProducer.close();
session.close();
connection.close();
} catch (JMSException | NamingException e) {
e.printStackTrace();
}
}
}
MDB从队列接收消息并对其进行处理:
AccountPersistenceMDB.java
@MessageDriven(
activationConfig = { @ActivationConfigProperty(
propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
@ActivationConfigProperty(propertyName = "destination",
propertyValue ="java:/jms/queue/AccountAccessQueue")
})
public class AccountPersitenceMDB implements MessageListener {
public void onMessage(Message message) {
ObjectMessage objectMessage = null;
objectMessage = (ObjectMessage) message;
try {
Account accountEntity = (Account) objectMessage.getObject();
System.out.println("MDB accessCount: " + accountEntity.getAccessCount());
} catch (JMSException e) {
e.printStackTrace();
}
}
}
不知道什么,我得到错误的。我可能有代码来设置ConnectionFactory和队列错误,但我不确定,因为我是Java EE的新手。任何帮助表示赞赏。
答
感谢@mendieta我解决了这个问题。我阅读了JMS会话,它非常有意义。改变这一行EntityEnqueueBean.java的伎俩:
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+0
我通过相反的方式解决了一个问题。 Session.AUTO_ACKNOWLEDGE - > Session.SESSION_TRANSACTED。 – Edza
对服务器日志的任何堆栈跟踪?任何例外? –
@RamachandranGA不,一切正常,但MDB应该显示结果的部分不起作用。另外,在JBoss管理面板上监视队列显示没有消息在队列上发送过。我无法确定我做错了什么。 –
可能是交易存在问题,而您的邮件没有被提交。尝试将会话更改为此.. Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); – mendieta