项目采用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 停不掉的更多相关文章

  1. 项目tomcat启动停在Initializing Spring root WebApplicationContext

    来源于:http://ourteam.iteye.com/blog/1270699 某日,再次启动项目,spring一直停在这一句: Initializing Spring root WebAppli ...

  2. CentOS Linux下一个tomcat起停,查看日志的shell script

    CentOS 的tomcat安装目录:/usr/local/tomcat vi MyTomcatUitl.sh          创建文件chmod u+x MyTomcatUtil.sh   赋执行 ...

  3. tomcat启停脚本

    脚本存放目录 /etc/init.d/ #!/bin/bash # description: Tomcat8 Start Stop Restart # processname: tomcat8 # c ...

  4. JMX configuration for Tomcat

    Window下执行步骤: D:\apache-tomcat-7.0.57\bin\catalina.bat set CATALINA_OPTS=-Dcom.sun.management.jmxremo ...

  5. 基于heartbeat的单播方式实现tomcat高可用

    1.节点规划 在master.backup节点上添加eth0.eth1两网卡,具体添加过程,参考“基于VMware为CentOS 6.5配置两个网卡” 2.IP规划   master backup e ...

  6. 企业级Tomcat部署实践及安全调优

    1.1 Tomcat简介 Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache.Sun和其他一些公司及个人 ...

  7. tomcat 进程莫名停止

    背景: 有一次晚上下班,发完版,刚把电脑合上走到楼下,就接到报警,说是线上有一个tomcat进程不存在了,想着以为是误报,但是还是回去看看了,发现线上确实是刚才发版的项目,进程不存在了,想了想,刚才测 ...

  8. linux下配置tomcat集群的负载均衡

    linux下配置tomcat集群的负载均衡 一.首先了解下与集群相关的几个概念集群:集群是一组协同工作的服务实体,用以提供比单一服务实体更具扩展性与可用性的服务平台.在客户端看来,一个集群就象是一个服 ...

  9. Nginx+Memcached+Tomcat集群配置实践(Sticky Session)

    准备工作 创建一个简单的web应用,名为session.其中有两个页面,分别如下所示: 页面login.jsp <%@ page language="java" conten ...

随机推荐

  1. 谈谈DOMContentLoaded:Javascript中的domReady引入机制

    一.扯淡部分 回想当年,在摆脱写页面时js全靠从各种DEMO中copy出来然后东拼西凑的幽暗岁月之后,毅然决然地打算放弃这种处处“拿来主义”的不正之风,然后开启通往高大上的“前端攻城狮”的飞升之旅.想 ...

  2. 菜鸟学Struts2——Actions

    在对Struts2的工作原理学习之后,对Struts2的Action进行学习.主要对Struts2文档Guides中的Action分支进行学习,如下图: 1.Model Driven(模型驱动) St ...

  3. Java 堆内存与栈内存异同(Java Heap Memory vs Stack Memory Difference)

    --reference Java Heap Memory vs Stack Memory Difference 在数据结构中,堆和栈可以说是两种最基础的数据结构,而Java中的栈内存空间和堆内存空间有 ...

  4. 4.Android 打包时出现的Android Export aborted because fatal error were founds [closed]

    Android 程序开发完成后,如果要发布到互联网上供别人使用,就需要将自己的程序打包成Android 安装包文件(Android Package,APK),其扩展名为.apk.使用run as 也能 ...

  5. 漫谈TCP

    不得不承认,tcp是一个非常复杂的协议.它包含了RFC793及之后的一些协议.能把tcp的所有方面面面具到地说清楚,本身就是个很复杂的事情.如果再讲得枯燥,那么就会更让人昏昏欲睡了.本文希望能尽量用稍 ...

  6. css知多少之绝对定位小记

    一.position定位常见属性 对于属性position来说,属性值有static/relative/absolute/fixed/inherit以下只对绝对定位position:absolute详 ...

  7. jira的插件开发流程实践

    怎么开头呢,由于自己比较懒,博客一直不怎么弄,以后克己一点,多传点自己遇到的问题和经历上来,供自己以后记忆,也供需要的小伙伴少走点弯路吧 最近公司项目需要竞标一个运维项目,甲方给予了既定的几种比较常用 ...

  8. 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 ...

  9. [Xamarin] 透過Native Code呼叫 JavaScript function (转帖)

    今天我們來聊聊關於如何使用WebView 中的Javascript 來呼叫 Native Code 的部分 首先,你得先來看看這篇[Xamarin] 使用Webview 來做APP因為這篇文章至少講解 ...

  10. 【腾讯优测干货分享】如何降低App的待机内存(三)——探索内存增长的原因

    本文来自于腾讯优测公众号(wxutest),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/8BiKIt3frq9Yv9KV5FXlGw 1.3新问题的进一步挖 ...