项目采用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. 谈谈一些有趣的CSS题目(十二)-- 你该知道的字体 font-family

    开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...

  2. 微信公众号开发之VS远程调试

    目录 (一)微信公众号开发之VS远程调试 (二)微信公众号开发之基础梳理 (三)微信公众号开发之自动消息回复和自定义菜单 前言 微信公众平台消息接口的工作原理大概可以这样理解:从用户端到公众号端一个流 ...

  3. 一起学 Java(三) 集合框架、数据结构、泛型

    一.Java 集合框架 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常形成一个 ...

  4. ASP.NET Web API 跨域访问(CORS)

    一.客户端用JSONP请求数据 如果你想用JSONP来获得跨域的数据,WebAPI本身是不支持javascript的callback的,它返回的JSON是这样的: {"YourSignatu ...

  5. DBSCAN密度聚类算法

    DBSCAN(Density-Based Spatial Clustering of Applications with Noise,具有噪声的基于密度的聚类方法)是一种很典型的密度聚类算法,和K-M ...

  6. golang sync.WaitGroup bug

    注意,这个结构体,要是想在函数之间传来传去的话,必须要使用指针....... 这个结构体里没有 指针,这个类型可以说没有“引用特性”. 被坑了一晚上.特此记录.

  7. SymmetricDS 快速和灵活的数据库复制

    开始谈谈开源的SymmetricDS,谈谈实际使用中,遇到的一些问题和解决办法.持续更新: SymmetricDS 快速和灵活的数据库复制 实际使用 和 埋过的坑 (一)知识篇 SymmetricDS ...

  8. 编写一个通用的Makefile文件

    1.1在这之前,我们需要了解程序的编译过程 a.预处理:检查语法错误,展开宏,包含头文件等 b.编译:*.c-->*.S c.汇编:*.S-->*.o d.链接:.o +库文件=*.exe ...

  9. Hacker Rank: Two Strings - thinking in C# 15+ ways

    March 18, 2016 Problem statement: https://www.hackerrank.com/challenges/two-strings/submissions/code ...

  10. 前端如何正确选择offer,到底选哪个?

    文章背景:来自于一次线上交流,当时回答感觉比较粗糙,做个阶段性的总结,也分享给其它朋友. 当时的题目是,共2个offer,如何选择: 1. 美团外卖前端 2. 京东深圳前端研发(只有通过邮件,还有收到 ...