如何使用使用者从wildfly jms队列接收消息

时间:2017-08-20 07:35:28

标签: java jms message-queue wildfly-10 activemq-artemis

我从wildfly jms队列接收消息时遇到了一个棘手的问题,我的代码是打击:

Session produceSession = connectionFactory.createConnection().createSession(false, Session
                    .CLIENT_ACKNOWLEDGE);
            Session consumerSession = connectionFactory.createConnection().createSession(false, Session
                    .CLIENT_ACKNOWLEDGE);
            ApsSchedule apsSchedule = new ApsSchedule();

            boolean success;
            MessageProducer messageProducer = produceSession.createProducer(outQueueMaxusOrder);
            success = apsSchedule.sendD90Order(produceSession,messageProducer, d90OrderAps);
            if (!success) {
                logger.error("Can't send APS schedule msg ");
            } else {
                MessageConsumer consumer = consumerSession.createConsumer(inQueueDeliveryDate);
                data = apsSchedule.receiveD90Result(consumerSession,consumer);
            }

然后进入receiveD90Result():

public DeliveryData receiveD90Result(Session session, MessageConsumer consumer) {
    DeliveryData data = null;
    try {
         Message message = consumer.receive(10000);

        if (message == null) {
            return null;
        }
        TextMessage msg = (TextMessage) message;
        String text = msg.getText();
        logger.debug("Receive APS d90 result: {}", text);

        ObjectMapper mapper = new ObjectMapper();
        data = mapper.readValue(text, DeliveryData.class);
    } catch (JMSException je) {
        logger.error("Can't receive APS d90 order result: {}", je.getMessage());
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            consumer.close();
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }
    return data;
}

但是在实现consumer.receive(10000)时,项目无法从队列中获取消息。 如果我使用MDB的异步方式来侦听队列,我可以从队列中获取消息。 怎么解决?我花了2天时间解决它,我真的不在乎。可以有人帮我吗?Thx!Thx!Thx!

2 个答案:

答案 0 :(得分:0)

您可以选择多种模式从队列中获取消息。默认情况下,消息队列在使用中是异步的。但是,有些情况下您希望同步读取它,例如发送带有帐号的消息并使用另一个队列来读取响应并将其与消息ID或消息相关ID进行匹配。当您进行接收时,程序正在等待消息在接收中指定的轮询间隔内到达。

你看到的代码片段,正如我所看到的那样,它使用的是psuedo同步方法。如果必须将其用作MDB,则必须实现消息驱动Bean(EJB资源)或消息侦听器。

MDB / Message Listener的工作方式更基于事件,而不是具有超时的轮询(如接收),您实现了一个名为onMessage()的回调,每次有消息时都会调用该回调。而不是同步调用,这变得异步。您的应用程序可能需要在设计方面进行一些更改。

答案 1 :(得分:0)

我不知道你在哪里调用javax.jms.Connection.start()。实际上,看起来您甚至没有对用于javax.jms.MessageConsumer的javax.jms.Connection实例的引用。如果你没有引用javax.jms.Connection,那么你就不能调用start()而你不能在你完成时调用close()所以你&#39 ;会泄漏连接。

此外,连接很重"对象并且意味着要重复使用。您应该为生产者和消费者创建单个连接。此外,如果您的应用程序不会使用来自多个线程的javax.jms.Session,那么您也不需要多个会话。