项目采用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. Python高手之路【六】python基础之字符串格式化

    Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...

  2. ASP.NET Core 折腾笔记一

    前言: 在ASP.NET Core 1.0时,曾折腾过一次,后因发现不了System.Data而停止. 更因VS2015提示过期Delete掉VS了,其实主要还是笔记本的硬盘空间吃紧. 快双十一了,本 ...

  3. HTML kbd键盘元素

    1. 说明 kbd :即Keyboard Input Element(键盘输入元素).表示键盘按键的语义元素,常用于网页上对快捷键.按键说明的场景. 样式规格:内联样式. 为了在页面上突出显示,可以给 ...

  4. 深入理解BFC

    定义 在解释BFC之前,先说一下文档流.我们常说的文档流其实分为定位流.浮动流和普通流三种.而普通流其实就是指BFC中的FC.FC是formatting context的首字母缩写,直译过来是格式化上 ...

  5. MVC如何使用开源分页插件shenniu.pager.js

    最近比较忙,前期忙公司手机端接口项目,各种开发+调试+发布现在几乎上线无问题了:虽然公司项目忙不过在期间抽空做了两件个人觉得有意义的事情,一者使用aspnetcore开发了个人线上项目(要说线上其实只 ...

  6. TypeScript为Zepto编写LazyLoad插件

    平时项目中使用的全部是jQuery框架,但是对于做webapp来说jQuery太过于庞大,当然你可以选择jQuery 2.*针对移动端的版本. 这里我采用移动端使用率比较多的zepto框架,他跟jqu ...

  7. angular2系列教程(十)两种启动方法、两个路由服务、引用类型和单例模式的妙用

    今天我们要讲的是ng2的路由系统. 例子

  8. 关于Android避免按钮重复点击事件

    最近测试人员测试我们的APP的时候,喜欢快速点击某个按钮,出现一个页面出现多次,测试人员能不能禁止这样.我自己点击了几下,确实存在这个问题,也感觉用户体验不太好.于是乎后来我搜了下加一个方法放在我们U ...

  9. C#发送邮箱

    之前自己从来没有做过发送邮箱的功能,前段时间项目需要,在找了很多帖子之后,终于实现了. 之后有整理了一下,写了一个类.直接给类传递信息,就可以发送了. 这里还需要说明的是,发送邮箱需要开通POP3/S ...

  10. 解决“chrome提示adobe flash player 已经过期”的小问题

    这个小问题也确实困扰我许久,后来看到chrome吧里面有人给出了解决方案: 安装install_flash_player_ppapi, 该软件下载地址:http://labs.adobe.com/do ...