tomcat RMI 停不掉
项目采用jfinal框架,做了一个RMI的服务,对其它程序提供服务。实现上,写了一个RmiPlugin
java
package com.wisdombud.cloudtalk.plugin;
import java.io.IOException;
import java.rmi.Naming;
import java.rmi.NoSuchObjectException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;
import javax.rmi.PortableRemoteObject;
import com.jfinal.kit.LogKit;
import com.jfinal.plugin.IPlugin;
import com.wisdombud.cloudtalk.rmi.RecommendService;
import com.wisdombud.cloudtalk.rmi.RecommendServiceImpl;
public class RmiPlugin implements IPlugin {
private Registry reg;
@Override
public boolean start() {
RecommendService service;
try {
service = new RecommendServiceImpl();
reg = LocateRegistry.createRegistry(6600);
Naming.rebind("rmi://127.0.0.1:6600/RecommendService", service);
} catch (IOException e) {
e.printStackTrace();
return false;
}
return true;
}
@Override
public boolean stop() {
try {
UnicastRemoteObject.unexportObject(reg, true);
} catch (NoSuchObjectException e) {
LogKit.error("UnicastRemoteObject unexportObject failed", e);
try {
PortableRemoteObject.unexportObject(reg);
return true;
} catch (NoSuchObjectException e1) {
LogKit.error("PortableRemoteObject unexportObject failed", e1);
}
return false;
}
return true;
}
}
> 程序启动没有问题,运行也可以,但tomcat shutdown的时候停不掉。
> jstack 导出线程栈后,发现有一个“RMI reaper ”的非守护线程。google,发现了RMI的使用问题
1. Naming 和 Registry 的区别
2. 停掉的时候没有取消绑定服务
stackOverFlow的答案如下:
>Sure enough, I had a bug in the code that caused one of my (many) UnicastRemoteObjects to not unexport itself when the calling application was done utilizing it. So the answer is:
> **Unexporting all UnicastRemoteObjects within a running JVM is sufficient to close all RMI non-daemon threads.**
所以代码应该如下
```java```
package com.wisdombud.cloudtalk.plugin;
import java.io.IOException;
import java.rmi.NoSuchObjectException;
import java.rmi.NotBoundException;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;
import javax.rmi.PortableRemoteObject;
import com.jfinal.kit.LogKit;
import com.jfinal.plugin.IPlugin;
import com.wisdombud.cloudtalk.rmi.RecommendService;
import com.wisdombud.cloudtalk.rmi.RecommendServiceImpl;
public class RmiPlugin implements IPlugin {
private Registry reg;
@Override
public boolean start() {
RecommendService service;
try {
service = new RecommendServiceImpl();
reg = LocateRegistry.createRegistry(6600);
reg.rebind("rmi://127.0.0.1:6600/RecommendService", service);
} catch (IOException e) {
e.printStackTrace();
return false;
}
return true;
}
@Override
public boolean stop() {
try {
String[] lNames = reg.list();
for (String lName : lNames) {
Remote lRemoteObj = reg.lookup(lName);
reg.unbind(lName);
UnicastRemoteObject.unexportObject(lRemoteObj, true);
}
UnicastRemoteObject.unexportObject(reg, true);
} catch (RemoteException | NotBoundException e) {
LogKit.error("UnicastRemoteObject unexportObject failed", e);
try {
PortableRemoteObject.unexportObject(reg);
return true;
} catch (NoSuchObjectException e1) {
LogKit.error("PortableRemoteObject unexportObject failed", e1);
}
return false;
}
return true;
}
}
tomcat RMI 停不掉的更多相关文章
- 项目tomcat启动停在Initializing Spring root WebApplicationContext
来源于:http://ourteam.iteye.com/blog/1270699 某日,再次启动项目,spring一直停在这一句: Initializing Spring root WebAppli ...
- CentOS Linux下一个tomcat起停,查看日志的shell script
CentOS 的tomcat安装目录:/usr/local/tomcat vi MyTomcatUitl.sh 创建文件chmod u+x MyTomcatUtil.sh 赋执行 ...
- tomcat启停脚本
脚本存放目录 /etc/init.d/ #!/bin/bash # description: Tomcat8 Start Stop Restart # processname: tomcat8 # c ...
- JMX configuration for Tomcat
Window下执行步骤: D:\apache-tomcat-7.0.57\bin\catalina.bat set CATALINA_OPTS=-Dcom.sun.management.jmxremo ...
- 基于heartbeat的单播方式实现tomcat高可用
1.节点规划 在master.backup节点上添加eth0.eth1两网卡,具体添加过程,参考“基于VMware为CentOS 6.5配置两个网卡” 2.IP规划 master backup e ...
- 企业级Tomcat部署实践及安全调优
1.1 Tomcat简介 Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache.Sun和其他一些公司及个人 ...
- tomcat 进程莫名停止
背景: 有一次晚上下班,发完版,刚把电脑合上走到楼下,就接到报警,说是线上有一个tomcat进程不存在了,想着以为是误报,但是还是回去看看了,发现线上确实是刚才发版的项目,进程不存在了,想了想,刚才测 ...
- linux下配置tomcat集群的负载均衡
linux下配置tomcat集群的负载均衡 一.首先了解下与集群相关的几个概念集群:集群是一组协同工作的服务实体,用以提供比单一服务实体更具扩展性与可用性的服务平台.在客户端看来,一个集群就象是一个服 ...
- Nginx+Memcached+Tomcat集群配置实践(Sticky Session)
准备工作 创建一个简单的web应用,名为session.其中有两个页面,分别如下所示: 页面login.jsp <%@ page language="java" conten ...
随机推荐
- 谈谈DOMContentLoaded:Javascript中的domReady引入机制
一.扯淡部分 回想当年,在摆脱写页面时js全靠从各种DEMO中copy出来然后东拼西凑的幽暗岁月之后,毅然决然地打算放弃这种处处“拿来主义”的不正之风,然后开启通往高大上的“前端攻城狮”的飞升之旅.想 ...
- 菜鸟学Struts2——Actions
在对Struts2的工作原理学习之后,对Struts2的Action进行学习.主要对Struts2文档Guides中的Action分支进行学习,如下图: 1.Model Driven(模型驱动) St ...
- Java 堆内存与栈内存异同(Java Heap Memory vs Stack Memory Difference)
--reference Java Heap Memory vs Stack Memory Difference 在数据结构中,堆和栈可以说是两种最基础的数据结构,而Java中的栈内存空间和堆内存空间有 ...
- 4.Android 打包时出现的Android Export aborted because fatal error were founds [closed]
Android 程序开发完成后,如果要发布到互联网上供别人使用,就需要将自己的程序打包成Android 安装包文件(Android Package,APK),其扩展名为.apk.使用run as 也能 ...
- 漫谈TCP
不得不承认,tcp是一个非常复杂的协议.它包含了RFC793及之后的一些协议.能把tcp的所有方面面面具到地说清楚,本身就是个很复杂的事情.如果再讲得枯燥,那么就会更让人昏昏欲睡了.本文希望能尽量用稍 ...
- css知多少之绝对定位小记
一.position定位常见属性 对于属性position来说,属性值有static/relative/absolute/fixed/inherit以下只对绝对定位position:absolute详 ...
- jira的插件开发流程实践
怎么开头呢,由于自己比较懒,博客一直不怎么弄,以后克己一点,多传点自己遇到的问题和经历上来,供自己以后记忆,也供需要的小伙伴少走点弯路吧 最近公司项目需要竞标一个运维项目,甲方给予了既定的几种比较常用 ...
- mysql删除重复记录语句的方法
例如: id name value 1 a pp 2 a pp 3 b iii 4 b pp 5 b pp 6 c pp 7 c pp 8 c iii id是主键 要求得到这样的结果 id name ...
- [Xamarin] 透過Native Code呼叫 JavaScript function (转帖)
今天我們來聊聊關於如何使用WebView 中的Javascript 來呼叫 Native Code 的部分 首先,你得先來看看這篇[Xamarin] 使用Webview 來做APP因為這篇文章至少講解 ...
- 【腾讯优测干货分享】如何降低App的待机内存(三)——探索内存增长的原因
本文来自于腾讯优测公众号(wxutest),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/8BiKIt3frq9Yv9KV5FXlGw 1.3新问题的进一步挖 ...