从消息驱动Bean向会话Bean发送消息

时间:2013-03-27 06:44:40

标签: ejb jms

我有一个程序,在一个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;
            }

2 个答案:

答案 0 :(得分:0)

如果要将消息发送回bean的新实例。即。无状态bean,您可以使用@EJB注释注入Bean的新实例。如果您想将它发送到特定的有状态bean,那么您应该在第一条消息中使用某种方式来标识Bean,就像bean id一样。当您发送返回消息时,此ID将用于标识bean。

答案 1 :(得分:0)

您可以将JMSCorrelationIDJMSReplyTo结合使用,以便与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头字段   为此目的。

  •   

[强调我的]