【问题标题】:JMS Queue receive causes application to crashJMS 队列接收导致应用程序崩溃
【发布时间】:2017-07-02 23:34:03
【问题描述】:

我创建了一个非常简单的 JMS 队列示例来发送和接收消息。我已将其设置为在发送一定数量后接收消息,然后对其进行处理。在收到所有消息后,尝试发送更多消息会导致应用程序崩溃。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.annotation.Resource;
import javax.ejb.Singleton;
import javax.ejb.Startup;
import javax.jms.*;

@Startup
@Singleton
public class JMSQueue {
    /** SLF4J logger. */
    @SuppressWarnings("unused")
    private final Logger log = LoggerFactory.getLogger(JMSQueue.class);

    @Resource(mappedName = "jms/__defaultQueue")
    private Queue queue;

    @Resource(mappedName = "jms/__defaultQueueConnectionFactory")
    private QueueConnectionFactory factory;

    private int count = 0;

    private QueueConnection connection;
    private QueueSession session;
    private MessageProducer producer;
    private QueueReceiver receiver;

    public void init(){
        try {
            connection = factory.createQueueConnection();
            session = connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);

            producer = session.createProducer(queue);
            receiver = session.createReceiver(queue);
            connection.start();
        } catch (JMSException e) {
            log.error("JMS Queue Initialization failed.", e);
        }
    }

    public void sendMessage() throws JMSException {
        String messageBody = "ping" + count;
        Message request = session.createTextMessage(messageBody);
        request.setJMSReplyTo(queue);
        producer.send(request);
        count++;
        if (count >= 10) {
            count = 0;
            Message response = receiver.receive();
            while (response != null){
                String responseBody = ((TextMessage) response).getText();
                log.debug("jms - " + responseBody);
                try {
                    response = receiver.receive();
                } catch(JMSException e){
                    response = null;
                }
            }
        }
    }
}

我运行一次 init 来创建连接、生产者和接收者,然后运行 ​​sendMessage 10 次。在第十次它吐出所有十个收到的消息的输出。如果在那之后我再点击 sendMessage 几次,我的应用程序就会崩溃。我已尝试更改它以在每条未更改任何内容的消息之后创建和关闭连接。我正在运行 glassfish 应用程序 Web 服务器,并尝试使用队列来通知用户尝试访问的每个 rest 调用。

【问题讨论】:

  • 你收到错误了吗?
  • 不,但是在尝试显示错误时,我意识到了问题。接收挂起,因为它没有超时。

标签: java glassfish jms


【解决方案1】:

原来的问题是接收被无限期挂起,因为没有超时。添加 1 毫秒的超时解决了这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-21
    • 2016-06-04
    • 2011-08-24
    • 2014-05-03
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    相关资源
    最近更新 更多