2

我正在执行以下 ActiveMq 程序,将文件放入队列中。

public static void main(String[] args) throws JMSException, IOException {
    FileInputStream in;
    //Write the file from some location that is to be uploaded on ActiveMQ server

    in = new FileInputStream("d:\\test-transfer-doc-1.docx");
    ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
                    "tcp://localhost:61616?jms.blobTransferPolicy.defaultUploadUrl=http://admin:admin@localhost:8161/fileserver/");
    ActiveMQConnection connection = (ActiveMQConnection) connectionFactory
                    .createConnection();
    connection.start();
    Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
    Queue destination = session.createQueue("stream.file");
    OutputStream out = connection.createOutputStream(destination);

    // now write the file on to ActiveMQ
    byte[] buffer = new byte[1024];
    for (int bytesRead=0;bytesRead!=-1;) {
            bytesRead = in.read(buffer);
            System.out.println("bytes read="+bytesRead);
            if (bytesRead == -1) {
                out.close();
                System.out.println("Now existiong from prog");
                //System.exit(0);
                break;
            }
            else{
                System.out.println("sender\r\n");
                out.write(buffer, 0, bytesRead);
            }
    }
    System.out.println("After for loop");  
}

当 bytesRead == -1 时,我想在其任务完成时从 JVM 卸载程序。为此,我最初使用break关键字,并在 Eclipse 控制台上产生以下输出

在此处输入图像描述

使用它,程序不会从 JVM 中卸载,因为控制台 RED 按钮仍然处于活动状态。

现在我使用 System.exit(0) 来达到这个目的,并从 JVM 中退出程序。但我不想为此目的使用 System.exit(0) 。我也尝试使用简单的 voidreturn来代替,break但它也不起作用。

请说明为什么breakreturn在这种情况下无法结束程序以及为什么它仍在运行?

问候,

阿伦

4

4 回答 4

5

您需要关闭您的资源(队列、输入流),因为它们可以使程序保持活动状态,之后简单的返回就足以结束程序。

于 2013-07-10T05:40:38.293 回答
2

返回和休息工作。问题是that connection.start();启动一个线程(您可以在调试模式下以 [Active MQ Transport...] 的名称看到它),直到存在一个正在运行的非守护线程,除非调用 System.exit,否则 JVM 不会终止。

于 2013-07-10T05:50:19.583 回答
2

JVM 仍然挥之不去的原因可能是某些用户线程还没有完成。根据初步调查,我相信您的 Session 在内部运行一个线程。我相信您应该在中断之前停止会话并关闭连接。那应该可以解决您的问题。

于 2013-07-10T05:52:20.370 回答
1

只要非恶魔线程正在运行,JVM就会运行 - 所以上面所有人都是正确的:您必须关闭所有资源,以便非恶魔线程关闭。

于 2013-07-10T07:46:43.473 回答