我需要使用Diameter协议将我的Java Web应用程序中的某些消息发送到某些服务器,特别是CCR-CCA方案。我看过jdiameter开源项目,但是我的用例不需要这么复杂,因为我只需要发送一个请求并记录响应(实际上我什至不需要CER-CEA部分)。 所以我以为我可以使用在我的webapp下运行的Seagull。我下载了Seagull(适用于Windows),而我想做的基本上是从java环境中为直径环境运行来自Seagull的.bat文件。
那是我到目前为止所做的。.
1)调用客户端的简单测试。这里的包装器仅设置工作目录并启动进程
public static void main(String[] args) {
List<String> cmd=new ArrayList<>();
cmd.add("cmd.exe");
cmd.add("/c");
cmd.add("my_start_client.bat");
JavaProcessBuilderWrapper wrapper = new JavaProcessBuilderWrapper();
Process p = wrapper.createProcess(RedirectErrorsTo.STDERR,
new HashMap<>(), new File("my_working_dir"), cmd);
BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
StringBuilder output = new StringBuilder();
String line;
try {
while ((line = reader.readLine()) != null) {
output.append(line);
}
System.out.println(line);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
2)我修改了来自Seagull的客户端和服务器的.bat文件,以使用CCR-CCA协议。
使用此配置运行Java main会导致
致命:键盘保存的配置失败错误
在我的日志上。
3)因此,如here所述,我进一步修改了客户端的.bat文件以使其在后台模式下运行,最后添加了-bg。现在我的客户的蝙蝠像这样
@ECHO OFF
rem
"Diameter Start Script Sample"
"Local env"
SET RUN_DIR=C:\Program Files\Seagull
set PATH=%PATH%;%RUN_DIR%
set LD_LIBRARY_PATH=%RUN_DIR%
set RUN_DIR=%RUN_DIR%\diameter-env\run
cd %RUN_DIR%
cls
mode 81,25
echo "Seagull Diameter Client Sample Start"
seagull -conf ..\config\conf.client.xml -dico ..\config\base_ro_3gpp.xml -scen ..\scenario\ccr-cca.ro.client.xml -log ..\logs\ccr-cca.client.log -llevel ETM -bg
pause
由于我遇到了一些麻烦,为了使事情简单,我只是尝试使其至少通过cmd起作用(不使用我的java方法),但是我认为后台模式很混乱,因为现在当我启动服务器时然后我的客户进入背景模式,有时我会得到
致命:分叉错误
但是在大多数情况下,客户端发送一条消息,然后在我的控制台上我看到我的软件正在导致连接中止(错误代码-1),并且从日志中我看到该通道刚刚关闭,而且我的客户甚至没有收到答案。 (注意,现在我保持配置文件不变)
你们有没有面对过这种行为?还有其他关闭连接的功能(也许是防火墙)吗?我是否必须提供其他配置才能使其正常工作?
一旦我可以使用它,我可以使用我的Java Web应用程序(使用与我已经提到的方法类似的方法)进行直径调用吗?
在此先感谢您的帮助。