一、前言
前面我们用三篇博客介绍了
-
OpenDDS在WIndows上的环境配置
-
三种方式运行发布订阅示例程序
-
创建自己的发布订阅程序
但上述都是OpenDDS自己的一个操作,那么如何在Java里面调用OpenDDS呢?
接下来介绍一下,如何使用Java来调用OpenDDS程序,介绍其准备工作和实例。
-
首先,你的OpenDDS配置环境要能支持Java,因此之前的环境配置则不能满足,需要重新配置
有了上述配置环境的基础,配置Java支持的环境就简单很多了,直接参考下面这篇博客OpenDDS配置Java运行环境_山中野竹的博客-CSDN博客
-
通过一个实例,在IDEA开发工具上,进行Java调用OpenDDS服务
二、实例演示
调用过程主要分为以下几步
-
生成要调用的发布订阅的 java程序和jar包文件
-
将 相应的jar包上传到本地maven仓库,并在Java项目中引用该Jar包
-
将生成的 Java程序放在项目中,并调用程序实现发布订阅服务
1. 生成 要调用的java相关文件
这一步和前面介绍过 创建自己的发布订阅程序有点像,因此就简要介绍了。主要步骤为:
-
创建一个 messenger文件夹,创建一个 UserMessenger.idl 文件
module UserManager {
#pragma DCPS_DATA_TYPE "UserManager::User"
#pragma DCPS_DATA_KEY "UserManager::User id"
struct User {
long id;
string name;
boolean sexual;
long age;
double height;
};
};
-
在cmd命令行窗口,在messenger路径下执行命令生成 UserManager_Export.h 文件
generate_export_file.pl UserManager>UserManager_Export.h
-
创建 UserManager.mpc 文件
project: dcps_test_java {
idlflags += -Wb,stub_export_include=UserManager_Export.h \
-Wb,stub_export_macro=UserManager_Export
dcps_ts_flags+= -Wb,export_macro=UserManager_Export
idl2jniflags += -Wb,stub_export_include=UserManager_Export.h \
-Wb,stub_export_macro=UserManager_Export
dynamicflags += USERMANAGER_BUILD_DLL
specific {
jarname = UserManager
}
TypeSupport_Files {
UserManager.idl
}
}
-
cmd命令窗口,在该路径下,使用mwc命令编译 mpc文件
perl E:\Software\Work\OpenDDS\ACE_wrappers\bin\mwc.pl -type vc10
-
使用vc++ 编译 messenger.sln文件,先在vc++中打开文件,选择自己的运行环境(32位或者64位)然后生成解决方案即可
基本上配置完Java的环境都是64位的。
得到我们需要的 UserMessenger.jar包文件
生成成功后,检查生成Jar包文件是否完整,检查生成文件中“classes-UserManager”文件夹下是否有UserTypeSupportImpl.class,即类型支持实现类文件
如果没有该文件,后期Java调用Jar包会有问题,为防止此问题,再使用VS对 Messenger.sln编译一下即可。
第二步第三步参考了以下两篇博客,大家可以先学习一下
OpenDDS Java开发(一):理解Messenger示例_hbyangland的博客-CSDN博客_java opendds
OpenDDS Java开发(二):根据IDL进行代码生成_hbyangland的博客-CSDN博客_idl 代码生成
2. 上传 jar包文件到仓库,并在项目中引用
在项目创建libs文件夹,并添加jar包文件,前三个jar是在OpenDDS/lib文件夹中,第四个是第一步生成的,根据业务需要确定第四个
第一次执行示例时,第四个jar包请采用OpenDDS自带的项目Jar包,jar包为messenger_idl_test.jar,jar包位置在:\OpenDDS\java\tests\messenger\messenger_idl
然后将jar包上传到maven仓库,使用cmd命令进行上传
// 上传格式
mvn install:install-file -Dfile=<path-to-file> -DgroupId=<group-id> -DartifactId=<artifact-id> -Dversion=<version> -Dpackaging=<packaging>
// 格式说明
<path-to-file>: 要安装的JAR的本地路径 ./libs/json-simple-1.1.1.jar
<group-id>:要安装的JAR的Group Id
<artifact-id>: 要安装的JAR的 Artificial Id
<version>: JAR 版本
<packaging>: 打包类型,例如JAR
// 上传案例
mvn install:install-file –Dfile=E:\Software\Work\OpenDDS\OpenDDS-3.10\java\tests\messenger\messenger_idl\messenger_idl_test.jar -DgroupId=com.dds.messenger -DartifactId=dds-messenger -Dversion=1.0 -Dpackaging=JAR
在maven仓库检查是否上传成功
仓库位置C:\Users\admin.m2\repository
上传成功后,在项目中设置pom文件,
// 添加jar包依赖(第一个依赖根据自己需要jar包更换)
<dependency>
<groupId>com.dds.messengerAll</groupId>
<artifactId>dds-messengerAll</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${basedir}/src/libs/UserManager.jar</systemPath>
</dependency>
<dependency>
<groupId>com.dds.OpenDDS_DCPS</groupId>
<artifactId>dds-OpenDDS_DCPS</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${basedir}/src/libs/OpenDDS_DCPS.jar</systemPath>
</dependency>
<dependency>
<groupId>com.dds.tao_java</groupId>
<artifactId>dds-tao_java</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${basedir}/src/libs/tao_java.jar</systemPath>
</dependency>
<dependency>
<groupId>com.dds.i2jrt</groupId>
<artifactId>dds-i2jrt</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${basedir}/src/libs/i2jrt.jar</systemPath>
</dependency>
// 因为idea的默认配置文件都是放在src/main/resources目录下,如果想要编译src/libs目录下的jar包,要在pom的build里配置resource
<resources>
<resource>
<!-- directory 表示取该目录下的文件 -->
<directory>src/libs</directory>
<!--targetPath 指定打包到哪个目录下 默认是放到class目录下-->
<targetPath>/BOOT-INF/lib/</targetPath>
<!-- 取符合格式的所有文件 *代表全部 -->
<includes>
<include>**/*.jar</include>
</includes>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
// 准备工作完成
3.将生成的 Java程序放在项目中,并调用程序实现发布订阅服务
使用OpenDDS自带的java文件
\OpenDDS-3.10\java\tests\messenger\publisher下的TestPublisher.java
\OpenDDS-3.10\java\tests\messenger\subscriber下的TestSubscriber.java和DataReaderListenerImpl.java
将文件放进项目中,然后调用文件执行发布订阅
平台执行发布订阅需要给定发布订阅启动参数
// 在发布订阅执行前,先定义字符串数组,后期要用
String[] ARGS = {"-DCPSBit","0","-DCPSConfigFile","C:\\Users\\lwy\\Desktop\\ddsexample\\demo-java\\messenger\\rtps.ini"};
// 注意最后一项是发布订阅的方式的配置文件路径,可以选用点对点方式,或者仓库方式
// 点对点方式,最后一项选择本地点对点配置文件,配置文件内容如下:
// 文件格式为.ini
[common]
DCPSGlobalTransportConfig=$file
DCPSDefaultDiscovery=DEFAULT_RTPS
[transport/the_rtps_transport]
transport_type=rtps_udp
// 仓库方式,最后一项选择本地仓库配置文件,配置文件内容如下:
// 其中第一项是你的仓库repo文件路径,注意file://+路径
// 文件格式为.ini
[common]
DCPSInfoRepo=file://E:\Software\Work\OpenDDS\OpenDDS-3.10\java\tests\messenger\repo.ior
DCPSGlobalTransportConfig=$file
[transport/1]
transport_type=tcp
然后分别调用发布和订阅函数(只写了业务逻辑,前后端如何调用大家自行编写)
先调用订阅
// 注入订阅类
@Resource
private TestSubscriber testSubscriber;
// 订阅
testPublisher.publish(ARGS);
调用发布
// 注入发布类
@Resource
private TestPublisher testPublisher;
// 发布
testSubscriber.subscribe(ARGS);
然后进行项目打包,通过项目中的maven-lifecycle-package,双击进行项目打包,
打包完成后,开始部署项目,测试发布订阅。在项目打包好的jar路径下执行命令行命令
运行命令如下:命令行中两个路径分别是opendds/lib路径和自己jar包位置路径
// 使用点对点方式,在项目jar文件路径下,使用命令行运行
java -ea -Dopendds.native.debug=true -Djava.library.path=E:\Software\Work\OpenDDS\OpenDDS-3.10\lib;C:\Users\lwy\Desktop\ddsexample\0830ceshi\Messenger -jar XXX.jar
// 使用仓库方式
// 首先,在一个cmd窗口开启仓库,该窗口执行路径在对应的仓库配置文件和repo.ior文件路径下
DCPSInfoRepo -o
// 然后第二个窗口,项目jar文件路径下,执行如下命令
java -ea -Dopendds.native.debug=true -Djava.library.path=E:\Software\Work\OpenDDS\OpenDDS-3.10\lib;C:\Users\lwy\Desktop\ddsexample\0830ceshi\Messenger -jar XXX.jar
!!!! 记录自己的一个小问题
在新电脑上集成DDS程序,集成好跑程序时,显示找不到自定义的jar包,此时自定义的jar包我拷贝到一个路径上了,却显示找不到,于是在新电脑上重新生成了该jar包(前面生成jar包的步骤,在新电脑上来了一遍!),之后就能跑通程序了。 也不知道是不是这个问题,衰
出了问题就是根据报错,去猜想,去试,去问,去查! 共勉!
自己的一点实践,内容较多,细节不易一一展示,希望能帮到大家!
点个赞吧