我有一个程序,在一个ejb项目中创建会话bean,并使用队列将消息发送到单独项目的消息驱动bean。在消息驱动的bean中,我设法检索从会话bean发送的消息。然后该消息将用于获取另一个值,我必须将其发送回会话bean。关于如何做的任何想法。非常感谢您给予的任何帮助。
ManagerBean :(部分代码)
queueConnection=queueConnectionFactory.createConnection();
session=queueConnection.createSession(false, Session.AUTO_ACKNOWLEDGE);
replyQueue=session.createTemporaryQueue();
consumer=session.createConsumer(replyQueue);
consumer.setMessageListener(new LpsListener());
queueConnection.start();
producer=session.createProducer(queue);
message=session.createMapMessage();
message.setJMSReplyTo(replyQueue);
producer.send(message);
和我的MDB :(部分在OnMessage中)
msg=(MapMessage)message;
String memId=msg.getString("MemberId");
int fine=mmr.getFine(memId);
queueConnection=queueConnectionFactory.createConnection();
replyDest=msg.getJMSReplyTo();
replyCorrelationMsgId=msg.getJMSMessageID();
queueSession=queueConnection.createSession(true, 0);
queueProducer=queueSession.createProducer(replyDest);
replyMsg=createReplyMsg(queueSession, replyCorrelationMsgId);
queueProducer.send(replyMsg);
private ObjectMessage createReplyMsg(Session session, String msgId)throws JMSException{
ObjectMessage replyMsg=session.createObjectMessage();
replyMsg.setIntProperty("fine", fine);
replyMsg.setJMSCorrelationID(msgId);
return replyMsg;
}
答案 0 :(得分:0)
如果要将消息发送回bean的新实例。即。无状态bean,您可以使用@EJB
注释注入Bean的新实例。如果您想将它发送到特定的有状态bean,那么您应该在第一条消息中使用某种方式来标识Bean,就像bean id一样。当您发送返回消息时,此ID将用于标识bean。
答案 1 :(得分:0)
您可以将JMSCorrelationID
与JMSReplyTo
结合使用,以便与JMS建立请求/响应机制。
以下是未经测试的示例代码。
经理Bean
message.setJMSReplyTo(queue);
String correlationId = generateRandomString();
message.setJMSCorrelationID(correlationId);
producer.send(message);
消息驱动Bean
responseMessage.setJMSCorrelationID(requestMessage.getJMSCorrelationID());
queueProducer.send(requestMessage.getJMSReplyTo(), responseMessage);
编辑:摘录文档以进一步说明。
JMSCorrelationID:客户端可以使用JMSCorrelationID标头字段将一条消息与另一条消息相关联。典型的用途是链接a 响应消息及其请求消息。
JMSReplyTo: JMSReplyTo标头字段包含应发送对当前消息的回复的目标。 在某些情况下 客户可能希望将之前发送的请求与其具有的回复进行匹配 刚刚收到。客户端可以使用JMSCorrelationID头字段 为此目的。
[强调我的]