为什么杀死它后ActiveMQ消费者被视为连接10秒?

时间:2017-09-12 14:23:11

标签: activemq

我开始使用ActiveMQ时遇到了一些问题。我在没有任何自定义的情况下使用本地ActiveMQ,我编写了简单的发布商应用

@Component
public class VirtualTopicSender {

    @Autowired
    private JmsTemplate jmsTemplate;

    public void send() {
        Topic topic = new ActiveMQTopic("VirtualTopic.TEST-VIRTUAL-TOPIC");
        int i = 0;

        while(true) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            jmsTemplate.convertAndSend(topic, i++);
        }
    }

}

还有简单的接收器

@Component
public class VirtualTopicReceiver {

    @JmsListener(destination="Consumer.myConsumer0.VirtualTopic.TEST-VIRTUAL-TOPIC", containerFactory = "defaultMessageListenerContainerFactory")
    public void receiveMessages(Session session, String message) {
        System.out.println(message);
        try {
            session.commit();
        } catch (JMSException e) {
            e.printStackTrace();
        }
        try {
            System.out.println(session.getTransacted());
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }
}

两者都是springboot's。

我在做的是:

  • 在终端中启动接收器应用程序
  • 在终端中启动发布商应用
  • 从接收器看到一些输出并用ctrl + c
  • 杀死它
  • 再次启动接收器

现在我从10秒钟开始缺少输出,netstat也显示连接已建立10秒

$ netstat -an | grep 575* | grep 61616
  TCP    127.0.0.1:57809        127.0.0.1:61616        ESTABLISHED
  TCP    127.0.0.1:61616        127.0.0.1:57788        TIME_WAIT
  TCP    127.0.0.1:61616        127.0.0.1:57789        TIME_WAIT
  TCP    127.0.0.1:61616        127.0.0.1:57790        TIME_WAIT
  TCP    127.0.0.1:61616        127.0.0.1:57791        TIME_WAIT
  TCP    127.0.0.1:61616        127.0.0.1:57792        TIME_WAIT
  TCP    127.0.0.1:61616        127.0.0.1:57793        TIME_WAIT
  TCP    127.0.0.1:61616        127.0.0.1:57794        TIME_WAIT
  TCP    127.0.0.1:61616        127.0.0.1:57795        TIME_WAIT
  TCP    127.0.0.1:61616        127.0.0.1:57796        TIME_WAIT
  TCP    127.0.0.1:61616        127.0.0.1:57797        TIME_WAIT
  TCP    127.0.0.1:61616        127.0.0.1:57798        TIME_WAIT
  TCP    127.0.0.1:61616        127.0.0.1:57799        TIME_WAIT
  TCP    127.0.0.1:61616        127.0.0.1:57800        TIME_WAIT
  TCP    127.0.0.1:61616        127.0.0.1:57801        TIME_WAIT
  TCP    127.0.0.1:61616        127.0.0.1:57802        TIME_WAIT
  TCP    127.0.0.1:61616        127.0.0.1:57803        TIME_WAIT
  TCP    127.0.0.1:61616        127.0.0.1:57804        TIME_WAIT
  TCP    127.0.0.1:61616        127.0.0.1:57805        TIME_WAIT
  TCP    127.0.0.1:61616        127.0.0.1:57806        TIME_WAIT
  TCP    127.0.0.1:61616        127.0.0.1:57808        TIME_WAIT
  TCP    127.0.0.1:61616        127.0.0.1:57809        ESTABLISHED

你知道如何摆脱那10秒的延迟吗?如果我使用多个接收器实例进行一些应用程序,那么在ActiveMQ切换实例之前我不会有丢失消息10秒的风险,但是现在我不知道如何解决这个问题。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

好的,现在一切都很清楚了。昨天我花了一整天的时间阅读文档并试图理解这种行为,但今天我决定确保消费者在按ctrl + c时真的死了 - 好吧它没有。

我已经在我的接收器正在呼叫的另一个应用程序中创建了简单的休息端点,并且在ctrl + c接收器仍然进行了10秒的休息呼叫之后。

有问题的行为存在于git bash中。