发表于: 2019-10-28 21:08:30
1 894
一、今天完成的事
1.尝试服务器运行服务端,调用service失败
尝试本地运行服务端,远程调用本地服务失败
尝试修改ip,都调用本地失败
尝试服务器开启服务端,本地调用失败
尝试本地开启服务端,本地客户端调用成功
.png)
.png)
2.还看到一个师兄使用打war包的方法通过servlet容器来启动
模仿了一下我还是没有实现,可供参考
enter增加一个监听器
public class Enter implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.setProperty("java.rmi.server.hostname", "localhost");
node.start();
System.out.println("server2启动");
}
/**
* * Notification that the servlet context is about to be shut down.
* * All servlets and filters have been destroy()ed before any
* * ServletContextListeners are notified of context
* * destruction.
*
* @param sce
*/
@Override
public void contextDestroyed(ServletContextEvent sce) {
}
}
配置web.xml
id="WebApp_ID" version="3.0">
<!--加载配置文件-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!-- ContextLoaderListener监听器:监听Web容器,一旦启动,自动装配ApplicationContext的配置信息 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
<listener-class>com.ksy.Enter</listener-class>
</listener>
</web-app>
分别用tomcat启动client,resin启动server
没启动成功,借他的图片
.png)
二、遇到的问题
1.启动jetty出现了问题
.png)
解决方法:
.png)
遇到jetty出这种问题的小伙伴看过来。
反正我改了一天,终于找到解决办法。
2.运行之后能成功访问到jetty。但是Tuscany的rmi还是没访问到。
运行server.jar包报下面错
.png)
据说不影响,我还是没连上,而且服务开启后,过段时间就会挂掉。
.png)
还有一个原因是包冲突或者包版本过高。实测
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!--//定义统一版本号-->
<spring.version>3.0.5.RELEASE</spring.version>
</properties>
3.0.5.RELEASE可在本地跑通。
Tuscany五个包要整全
<!--tuscanyRmi包-->
<dependency>
<groupId>org.apache.tuscany.sca</groupId>
<artifactId>tuscany-implementation-spring-runtime</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.tuscany.sca</groupId>
<artifactId>tuscany-sca-api</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.tuscany.sca</groupId>
<artifactId>tuscany-base-runtime</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.tuscany.sca</groupId>
<artifactId>tuscany-binding-rmi-runtime</artifactId>
<version>2.0.1</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.apache.tuscany.sca.aggregation</groupId>
<artifactId>tuscany-binding-rmi-runtime-aggregation</artifactId>
<version>2.0.1</version>
</dependency>
3.RMI no such object in table异常
同一RMI服务端export多个远程服务实现时,在客户端调用时有的能访问,有的不能访问,出现异常:NoSuchObjectException: no such object in table
问题分析
在远程服务器export服务实现时是通过匿名对象的方式:
SmsSenderImplsmsSender = new SmsSenderImpl();
iSmsSender =(ISmsSender) UnicastRemoteObject.exportObject(smsSender, 0);
registry.bind("SmsSender",iSmsSender);
在匿名对象创建后,没有其他的引用,方法返回后,可能会被System GC(垃圾回收),所以出现可能该对象不存在的现象。
解决方法
将服务实现对象设为static静态变量,我的相关代码如下:
public static SmsSenderImpl smsSender = new SmsSenderImpl();//用static,避免NoSuchObjectException
public static ISmsSender iSmsSender = null;
public static void startSmsServer() {
try {
iSmsSender = (ISmsSender) UnicastRemoteObject.exportObject(smsSender, 0);
Registry registry = null;
int port = 9999;
try{
registry = LocateRegistry.getRegistry(port);
registry.list();
}catch(Exception ex){
registry = LocateRegistry.createRegistry(port);
}
registry.bind("SmsSender", iSmsSender);
logger.info("启动远程短信调用接口...");
} catch (Exception e) {
logger.error("启动远程短信调用接口异常!", e);
}
}
目前就这几个问题,我已阵亡,期待下一位勇士。
分享Tuscany demo 实例
坑乎上的可能问题总结
tuscany war包部署到服务器,客户端发布失败
org.apache.tuscany.sca.host.rmi.rmihostruntimeexception
tiles框架配置出错
demo配置文件未加载
三、收获
Tuscany用得好开心
四、明天的计划
放弃Tuscany跑项目了,准备去学习springboot和dubbo
评论