一个没有stopServer功能的RMI服务器,可以正常工作。
public class HelloServer extends UnicastRemoteObject implements HelloInterface
{
private final static int PORT=1102;
private final String serverName="server";
private Timer timer;
public HelloServer() throws RemoteException
{
timer = new Timer(); //At this line a new Thread will be created
timer.schedule(new StopServerTask(), 5000);
}
@Override
public String serverResponse(String request) throws RemoteException
{
return "Hello"+request;
}
public static void main(String[] args)
{
try
{
HelloServer skeleton=new HelloServer();
System.out.println("Starting server");
skeleton.startServer();
System.out.println("Server started");
}
catch (RemoteException ex)
{
ex.printStackTrace();
}
}
public void startServer()
{
try {
HelloServer skeleton=new HelloServer();
Registry reg=LocateRegistry.createRegistry(PORT);
reg.rebind(serverName, skeleton);
System.out.println("Server is ready");
} catch (RemoteException ex)
{
Logger.getLogger(HelloInterface.class.getName()).log(Level.SEVERE, null, ex);
}
}
public void stopServer()
{
System.out.println("Stopping server");
try {
Registry rmiRegistry = LocateRegistry.getRegistry(PORT);
HelloInterface myService = (HelloInterface) rmiRegistry.lookup(serverName);
rmiRegistry.unbind(serverName);
UnicastRemoteObject.unexportObject(rmiRegistry, true);
} catch (NoSuchObjectException e)
{
e.printStackTrace();
} catch (NotBoundException e)
{
e.printStackTrace();
} catch (RemoteException ex) {
Logger.getLogger(HelloServer.class.getName()).log(Level.SEVERE, null, ex);
}
}
class StopServerTask extends TimerTask
{
@Override
public void run()
{
stopServer();
}
}
}
每当被调用异常中的stopServer()抛出时
UnicastRemoteObject.unexportObject(rmiRegistry, true);
这是堆栈跟踪
java.rmi.NoSuchObjectException: object not exported
at sun.rmi.transport.ObjectTable.unexportObject(ObjectTable.java:153)
at java.rmi.server.UnicastRemoteObject.unexportObject(UnicastRemoteObject.java:297)
at rmi.HelloServer.stopServer(HelloServer.java:84)
即使我使用清理服务对象,情况也一样
UnicastRemoteObject.unexportObject(myService, true);
有人可以提出一种干净的方法来停止服务器,这还会释放端口以供重用。
您需要存储结果LocateRegistry.createRegistry(),
并取消导出结果。目前,您正在尝试取消导出存根。
我终于在我的程序中实现了Thread.interrupt()而不是Thread.stop()。然而,我不确定我做得好不好。 我有一个类,它扩展了Thread并声明了几个方法。每个方法都抛出InterruptedException(每个方法都执行I/O密集型操作,其中一些需要几分钟才能完成,因此我没有使用线程安全标志,因为该标志直到操作完成后才会被检查)。我还在这些方法的几个地方添加了以下代码来抛出
问题内容: 我最近一直在尝试使用logback,并且一直在Eclipse内部直接运行示例。当我这样做时,我注意到- 即使在我的静态方法结束之后(从Java驱动程序类内部),应用程序仍在运行。 最终,我确定Logback正在管理自己的线程,这些线程即使在我的主应用程序退出后仍保持活动状态。我四处搜寻一些解决方案,发现这是从Java内部显式关闭Logback的一种方式: 这真的是彻底关闭登录的唯一方法
我有一些简单的枚举名:失败/成功的结果 我有一个函数,它什么也没有得到,但返回未来的结果, 我不喜欢我的解决方案,它看起来很凌乱,有更简单的吗? 返回 我想在这里做的是,如果返回None,那么func应该返回Future[Fail],否则调用db,这也返回一个case类的未来,并基于响应返回Fail/Success。 但我正在寻找一种超级时尚的斯卡拉方式,让它看起来不错:) 谢谢
问题内容: 我正在尝试从WCF服务返回一些JSON。该服务仅从我的数据库返回一些内容。我可以得到数据。但是,我担心JSON的格式。当前,返回的JSON格式如下: 实际上,我希望JSON的格式尽可能整洁。我相信(我可能是不正确的),以干净的JSON表示的相同结果集应如下所示: 我不知道“ d”来自哪里。我也不知道为什么要插入转义字符。我的实体如下所示: 负责返回内容的服务定义为: 如何从WCF服务返
问题内容: 我已经到了秃顶几步之遥… 我正在尝试运行一项服务,该服务将检查我工作中的服务器是否正在运行。应该每5分钟执行一次。 我经历过TimerTask,ScheduledExecutorService,最后是Handler。他们都工作了好几个小时,除了一些不准确的地方外,还有1-5分钟的时间,然后突然,“计时器”就停止了发射。 现在,我已经了解到,如果Scheduler遇到未捕获的异常,它将停
问题内容: 顾名思义,是否有适当的方法来设置一些初始CSS属性(或类),并告诉浏览器将其转换为另一个值? 这不会激活Chrome 29 / Firefox 23中元素的不透明度。这是因为(源): […]您会发现,如果同时应用两组属性,则立即应用一组属性,然后浏览器将尝试优化属性更改,而忽略您的初始属性并防止过渡。在幕后,浏览器在绘画之前先批处理属性更改,这通常会加快渲染速度,但有时可能会产生不利影