我想知道是否有人有资源在Python中使用Corba?我已经google了一下,看到有人推荐fnorb,但它不支持Corba的一些新功能.Omniorb似乎是一个很好的选择,但我不知道如何使用Python(也不是fnorb).
感谢任何建议,我之前只用Java实现了一些简单的例子,所以我对Corba的理解很少.
谢谢!
在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生效?
我正在尝试在以下环境中创建企业Web应用程序.
我创建了一个类库(New Project - > Java - > Java Class Library)来放置remote(javax.ejb.Remote)接口,该接口由无状态会话bean实现.类库已添加到两个模块(EJB和WAR)的类路径中.
我已将远程接口和所有实体类放在类库中(我不知道这是方法).
这适用于带注释的接口@Local.@Remote当我尝试返回实体的对象列表时,当JPA涉及时,它甚至可以使用但失败并出现以下异常.
java.rmi.MarshalException:CORBA MARSHAL 1330446347也许; 嵌套异常是:org.omg.CORBA.MARSHAL:警告:IOP00810011:CDRInputStream中的ValueHandler上的readValue异常vmcid:OMG次代码:11完成:也许
完整的堆栈跟踪.
javax.ejb.EJBException: java.rmi.MarshalException: CORBA MARSHAL 1330446347 Maybe; nested exception is:
org.omg.CORBA.MARSHAL: WARNING: IOP00810011: Exception from readValue on ValueHandler in CDRInputStream vmcid: OMG minor code: 11 completed: Maybe
at remote.admin.sessionbeans._AdminRemoteSessionBeanRemote_Wrapper.getZones(remote/admin/sessionbeans/_AdminRemoteSessionBeanRemote_Wrapper.java)
at managedbeans.ZoneBean.getZones(ZoneBean.java:27)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) …Run Code Online (Sandbox Code Playgroud) 我想确保我的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.
我怎么能等待分离的线程在C++中完成?
我不关心退出状态,我只是想知道线程是否已经完成.
我正在尝试围绕异步的第三方工具提供同步包装器.问题是涉及回调的奇怪的竞争状态崩溃.进展如下:
我想在一个提供阻塞调用的机制中包装它.到目前为止,我有:
class Wait {
public:
void callback() {
pthread_mutex_lock(&m_mutex);
m_done = true;
pthread_cond_broadcast(&m_cond);
pthread_mutex_unlock(&m_mutex);
}
void wait() {
pthread_mutex_lock(&m_mutex);
while (!m_done) {
pthread_cond_wait(&m_cond, &m_mutex);
}
pthread_mutex_unlock(&m_mutex);
}
private:
pthread_mutex_t m_mutex;
pthread_cond_t m_cond;
bool m_done;
};
// elsewhere...
Wait waiter;
thirdparty_utility(&waiter);
waiter.wait();
Run Code Online (Sandbox Code Playgroud)
据我所知,这应该有效,而且通常会有效,但有时它会崩溃.至于我可以从corefile中确定,我对这个问题的猜测是这样的:
我尝试了很多不同的机制来尝试解决这个问题,但没有一个能解决问题.我仍然偶尔看到崩溃.
编辑:更多细节:
这是大规模多线程应用程序的一部分,因此创建静态等待是不切实际的.
我运行了一个测试,在堆上创建Wait,并故意泄漏内存(即Wait对象永远不会被释放),这导致没有崩溃.所以我确定这是等待太快解除分配的问题.
我也尝试过sleep(5)在解锁后进行测试wait,并且也没有发生崩溃.我讨厌依靠这样的kludge.
编辑:ThirdParty详细信息:
我一开始并不认为这是相关的,但我想的越多,我认为这就是真正的问题:
我提到的第三方的东西,以及为什么我无法控制线程:这是使用CORBA.
因此,CORBA可能会比我预期的更长时间地保持对对象的引用.
我正在学习决赛,并且有一些关于RMI和CORBA的问题.这些是从学习指南中获取的讨论问题,因此没有真正的应用背景.
到目前为止我所想到的是TCP将比UDP更可靠,而在RMI/CORBA中,我们需要网络可靠性.我还读到了TCP深深嵌入本机Java网络类的地方.我对此声明没有信心,因为CORBA可以用任何语言实现.
我对这个问题有点困惑,因为我到目前为止所读到的是RMI和CORBA是融合技术,RMI可以访问CORBA对象.我现在如何理解,名称服务似乎非常相似,任何差异都不值得注意.
我没想出任何东西.
我意识到我问了三个不同的问题,但它们似乎都有关系.
我使用的是原生Java附带的CORBA(ORB),没有使用第三方库.
我需要CORBA客户端属性超时,以便在客户端设置超时并限制连接保持打开的时间; 应该为所有场景设置,以限制最大请求时间:
初始化连接
重新绑定连接
总请求时间
我正在测试通过在服务器上休眠(在服务器方法逻辑内),并且客户端根本没有超时.
在网上找到适当的文件非常困难; 我试图使用以下所有属性,但无济于事:
aProperties.put("com.sun.CORBA.transport.ORBTCPReadTimeouts","100:300:3000:20"); aProperties.put("com.sun.corba.eetransport.ORBTCPTimeouts","500:2000:50:1000"); aProperties.put("com.sun.corba.ee.transport.ORBWaitForResponseTimeout",10);
为了更清楚,在这些属性(上面)旁边使用属性org.omg.CORBA.ORBInitialHost和org.omg.CORBA.ORBInitialPort设置主机和端口.
任何帮助表示赞赏:)
我在开发SOAP和REST Web服务(在java平台中)方面有着丰富的经验.我试图理解gRPC和CORBA在各个方面的区别,除了它们都能在分布式环境中实现平台中立的通信方式.无论如何,这两个概念的目标/目的在哪里以及如何不同?
提前致谢.