我从来没有听过任何人谈论CORBA的任何东西,除了嘲弄的条款,这是奇怪的,考虑到10多年前它是蜜蜂的膝盖.为什么CORBA会失宠呢?是纯粹的实施是坏的还是有更基本的东西?
JDK-11将删除JDK的许多旧部分(JEP-320).对于其中一些(例如JAXB),功能将作为常规库提供.您只需添加另一个依赖项,一切正常.
但对于CORBA则不然,因为
使用Java中的CORBA开发现代应用程序没有太大的兴趣
然而,我仍然处于痛苦的境地,需要维护仍旧需要CORBA的旧应用程序,同时仍希望更新到JDK-11.
在没有删除这些应用程序的CORBA功能的情况下,是否有替换库或迁移到JDK-11的另一种好方法?
我正在研究一个基于.NET的服务器组件,该组件使用各种特定于目的地的协议与一组目的地(特定股权期权交换)进行通信.我们计划添加的下一个目标使用CORBA,因此我正在研究可以说CORBA的.NET库.
到目前为止,我发现了三种可能性:
有没有人有任何这些经验,无论好坏?
还有其他选择吗?
基于CORBA库( -我可以使用C++的一个omniORB和TAO通过混合本地管理C++/CLI代码似乎是前两名,但也有其他人),但数据需要去从的管理核心服务器在某些时候,为编组添加性能成本,并在混合代码场景中使用本机C++库往往相当痛苦.
更新 - 我们已经开始使用IIOP.NET,到目前为止看起来还不错.表现为最新版本(1.9 SP1)似乎是可以接受,而API是相当容易使用.我一定会看IKVM由托德·斯托特的建议-这看起来像一个非常有趣的可能性,如果IIOP.NET没有做成.
更新#2(2010年7月) - 我们已经在生产中使用IIOP.NET一段时间,效果很好.IIOP.NET项目并不完全是我所谓的活动,但后来也不是CORBA,因此似乎没有太多需要进行更多的开发.
我相信它在某种程度上与CORBA有关(我不确定).我很好奇它的功能和工作原理.当我搜索"IOR文件"时谷歌没有帮助我,我不确定我还能搜索什么.感谢任何能够利用可用资源向我指出正确方向的人.
我需要从64位进程调用omniORB的DLL,因为我得到它我需要将这些DLL编译为64位.
omniORB似乎一般支持64位,但make-process(*.mk)中没有包含配置文件...所以我想我必须创建一个我自己的...
还有人试过吗?并且:在64位模式下运行ORB是否"容易"(假设我有一种创建这些DLL的方法)或者是否还有其他陷阱我现在没有想到?:)
提前致谢!
在Glassfish v2中,我通过在ORB节点下的管理控制台中启用"IIOP客户端身份验证"复选框来保护我的JNDI查找.
在我的独立客户端中,我然后执行"ProgrammaticLogin",然后允许我进行JNDI查找.
但是,在Glassfish v3中,如果要在同一设置中执行任何JNDI查找,则会出现此错误:
18.08.2010 14:31:10 com.sun.enterprise.transaction.JavaEETransactionManagerSimplified
initDelegates INFO: Using
com.sun.enterprise.transaction.jts.JavaEETransactionManagerJTSDelegate
as the delegate
org.omg.CORBA.NO_PERMISSION:
----------BEGIN server-side stack trace----------
org.omg.CORBA.NO_PERMISSION:
vmcid: 0x0
minor code: 0
completed: No
Run Code Online (Sandbox Code Playgroud)
我非常确定"ProgrammaticLogin"通常可以正常工作,因为它允许我在我的安全EJB上进行远程方法调用(使用@RolesAllowed
但如果IIOP客户端身份验证被关闭).
我登录的用户是我为"文件"领域创建的简单用户.
任何想法,为什么ProgrammticLogin无法在Glassfish v3中用于授权JNDI查找?
或者从独立客户端使用ORB进行身份验证的正确方法是什么?以此目的?
我们一直在使用SAP"COM许可证桥"来访问其许可证服务器并以编程方式查询系统的硬件密钥(以重用自己的许可证).这在SAP Business One版本2007A,2007B和8.8上运行良好,但是在8.81中它们似乎更新了它们的CORBA接口而没有更新COM包装器,因为我们现在在尝试调用GetHardwareKey函数时获得了内存异常.
所以我下载了IIOP.NET并开始尝试编写自己的界面.无论如何我从来都不喜欢COM包装器.但我遇到了我的旧远程.NET远程控制 - 无法在服务器和客户端都没有定义公共接口的情况下调用远程方法.我尝试使用IIOP.NET附带的IDL到CLS编译器,但我继续得到关于接口beign不兼容的错误(SAP没有提供IDL文件).我不知道IIOP和CORBA如何确定接口是否兼容.但我甚至尝试调试IIOP.NET代码并强制它执行该方法,尽管不兼容,但收到一个空字符串而不是我想要的硬件密钥.
我的下一步是尝试实现虚假的许可证服务器并检查来自生产客户端的请求,以期确定它们应该是什么样子,但考虑到我遇到的困难,我并不指望取得多大的成功.深入了解.NET远程的内容.
我真正的问题是如何获取或生成SAP Business One硬件密钥,但由此产生的问题包括:
编辑:我设法通过应用RepositoryID属性使IIOP.NET/CORBA相信我有一个兼容的接口:
[Ch.Elca.Iiop.Idl.InterfaceType(Ch.Elca.Iiop.Idl.IdlTypeInterface.ConcreteInterface)]
[Ch.Elca.Iiop.Idl.RepositoryID("IDL:LicenseInfo:1.0")]
public interface ILicenseInfo : Ch.Elca.Iiop.Idl.IIdlEntity
{
void GetHardwareKey(out string hwKey);
}
Run Code Online (Sandbox Code Playgroud)
但我仍然得到一个空字符串结果.
编辑2:经过一些实验和调试之后,我发现响应消息确实包含了我正在寻找的数据,但是没有正确地解析成客户端值,可能是因为我的接口定义不好.希望进一步调试响应处理将帮助我弄清楚如何纠正我的界面.奇怪的是,它从响应中解析的第一件事是一个空的盒装值,这似乎不适合"out string"参数.
编辑3:我发现我需要将字符串属性应用于这样的参数,以防止它们被视为盒装值:
void GetHardwareKey([StringValue(), WideChar(true)] out string hwKey);
Run Code Online (Sandbox Code Playgroud)
但是,尽管有WideChar属性,我对CodeSet不支持WChar或其他东西的错误.我已经非常接近搞清楚了.
编辑4:我对如何为WChar设置代码集感到困惑.如果我没有设置它,我收到一个错误:"未指定或不支持WChar代码集." 因为服务器返回了一个unicode字符串而没有覆盖默认字符集.我找不到任何方法来覆盖客户端.我试着打电话:
omg.org.CORBA.OrbServices.GetSingleton().OverrideDefaultCharSets(
CharSet.UTF8, WCharSet.UTF16);
Run Code Online (Sandbox Code Playgroud)
但这似乎对客户端没有任何影响.示例代码显示在服务器端调用它.但我没有写服务器,所以我无法控制它.我唯一的选择是为了我自己的目的重写IIOP.NET代码,强制默认的WChar CodeSet生效?
我想确保我的CORBA客户端能够适应中断,我让客户端工作,并通过Windows中的网络适配器禁用来测试弹性.CORBA连接显然失败,并且功能不可用,但是当再次启用适配器时它不会恢复.ORB.init
再次调用,但我继续得到相同的错误.
似乎在org.omg.CORBA.TRANSIENT
抛出后会保留一些静态状态,导致客户端报告网络连接超时,即使问题已完全解决.只有重新启动进程(dropwizard runnable JAR)才能让客户端再次运行.
这是启动ORB的代码:
String[] orbInits = {"-ORBInitRef", orbInitRef};
Properties properties = new Properties() {
{
setProperty("org.omg.CORBA.ORBClass", orbClass);
setProperty("org.omg.CORBA.ORBSingletonClass", orbSingletonClass);
setProperty("jacorb.connection.client.connect_timeout", "" + connectionTimeout);
}
};
return ORB.init(orbInits, properties);
Run Code Online (Sandbox Code Playgroud)
即使应用程序在每次尝试执行操作时调用ORB.init(即关闭ORB池),问题仍然存在.
客户端在中断场景中抛出的错误包括:
org.omg.CORBA.TIMEOUT: connection timeout of 2000 milliseconds expired
org.omg.CORBA.TRANSIENT: Retries exceeded, couldn't reconnect to <IP>:<PORT>
Run Code Online (Sandbox Code Playgroud)
在至少一个(可能是所有)情况下,在org.omg.CORBA.TRANSIENT
成为永久性之前没有org.omg.CORBA.TIMEOUT (即TIMEOUT
可能是对数噪声).
显然,因为客户端也是一个服务器,我们宁愿不必在每次中断后重新启动它(并且它们确实发生了,特别是在开发环境中).
实现是JACORB(org.jacorb.orb.ORB/org.jacorb.orb.ORBSingleton)版本2.2.4.