我正在执行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任务完成时从JVM卸载程序。为此,我最初使用break
关键字,并在Eclipse控制台上生成以下输出
使用此程序,程序无法从JVM卸载,因为控制台RED按钮仍处于活动状态。
现在我使用System.exit(0)来实现此目的,并从JVM退出程序。但我不想为此目的使用System.exit(0)。我也尝试使用简单的void return
代替break
,但它也无效。
请说明为什么break
和return
在这种情况下不能用于结束程序以及为什么它仍在运行?
此致
阿伦
答案 0 :(得分:5)
您需要关闭资源(队列,输入流),因为它们可以使程序保持活动状态,之后简单的返回就足以结束程序。
答案 1 :(得分:2)
返回和中断工作。问题是that connection.start()
;启动一个Thread(你可以在调试模式下以[Active MQ Transport ...]的名义看到它)直到存在一个正在运行的非守护进程线程,除非调用System.exit,否则JVM不会终止。
答案 2 :(得分:2)
JVM仍然挥之不去的原因可能是某些用户线程仍未完成。从初步调查我相信你的Session内部运行一个线程。我相信你应该在停止之前停止你的会话并关闭你的连接。这应该可以解决你的问题。
答案 3 :(得分:1)
只要非恶魔线程正在运行,JVM就会运行 - 所以上面的所有人都是正确的:你必须关闭所有资源,以便非恶魔线程关闭。