【问题标题】:Sending message from Message Driven Bean to Session Bean将消息从消息驱动 Bean 发送到会话 Bean
【发布时间】:2013-03-17 04:47:47
【问题描述】:

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

【问题讨论】:

  • 你能添加createReplyMsg的代码吗?
  • @NayanWadekar 好的。已添加
  • 您必须配置ManagerBean 来监听MDB 回复的特定队列。很难定位问题,自己调试一下,消息发送是否失败,对方是否正确接收等。
  • @NayanWadekar 所以我的 mdb 的代码应该是正确的吗?通过我在 ManagerBean 中编写的代码,我为 mdb 的任何回复设置了一个侦听器,其中目标由 message.setJMSReplyTo(replyQueue) 提供。我已经尽力调试了,仍然不确定问题出在哪里。

标签: ejb jms


【解决方案1】:

如果您想将消息发送回 bean 的新实例。 IE。一个无状态的 bean,你可以使用 @EJB 注解注入一个新的 Bean 实例。如果您想将它发送到特定的有状态 bean,那么您应该有某种方式来识别第一条消息中的 Bean,例如 bean id。然后,当您发送返回消息时,此 id 将用于标识 bean。

【讨论】:

  • 我明白了……好吧。谢谢!但由于我的无状态会话 bean 位于 diff 项目中,我该如何调用它?
  • 如果它在同一台服务器上运行,请为您的会话 Bean 创建一个本地或远程接口。注射应该仍然有效。
  • 这个链接应该对stackoverflow.com/questions/8181146/…有帮助
【解决方案2】:

您可以将JMSCorrelationIDJMSReplyTo 结合使用,以通过JMS 实现请求/响应机制。

下面是未经测试的示例代码。

经理豆

message.setJMSReplyTo(queue);
String correlationId = generateRandomString();
message.setJMSCorrelationID(correlationId);
producer.send(message);

消息驱动 Bean

responseMessage.setJMSCorrelationID(requestMessage.getJMSCorrelationID());
queueProducer.send(requestMessage.getJMSReplyTo(), responseMessage);

编辑:摘录自文档以进一步澄清。

  • JMSCorrelationID : 客户端可以使用 JMSCorrelationID 标头字段将一条消息与另一条消息链接。一个典型的用途是链接一个 响应消息及其请求消息。

  • JMSReplyTo : JMSReplyTo 标头字段包含应发送对当前消息的回复的目的地。 在某些情况下 客户端可能希望将它之前发送的请求与它的回复相匹配 刚刚收到。客户端可以使用 JMSCorrelationID 头域 为此。

[强调我的]

【讨论】:

  • 嗨,感谢您的帮助。我可以只使用 message.setJMSReplyTo(queue) 而不必添加相关 ID 吗?
  • 如果您必须跟踪响应,可以使用 @user1097856 JMSCorrelationID。我已经更新了帖子,可以参考编辑部分了解更多详细信息。
  • 好的。我已经重新编辑了上面的代码。然而,即使我可以将消息从会话 bean 传递到 mdb,我似乎仍然无法从 mdb 得到回复回会话 bean。知道为什么吗?谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-15
  • 1970-01-01
相关资源
最近更新 更多