C# 跨语言消息传递

C# 跨语言消息传递,c#,java,jms,messaging,C#,Java,Jms,Messaging,我们使用一个以java为中心的工具,该工具在内部和与外部java软件通信时都使用JMS。我们现在必须为C#应用程序设置一个新接口。我们的JMS提供程序提供了一个C#实现,应该可以工作,但我不完全确定JMS在这种情况下是否可行。它将在C#应用程序中引入一个新的特定于供应商的依赖项,用于实现细节和客户支持 通过谷歌搜索,我找到了STOMP,这似乎是一个由多个支持JMS的消息代理(hornetq、activemq等)支持的有线协议,但在C#(以及某种程度上的java)中似乎明显缺乏实际的客户端。没有深

我们使用一个以java为中心的工具,该工具在内部和与外部java软件通信时都使用JMS。我们现在必须为C#应用程序设置一个新接口。我们的JMS提供程序提供了一个C#实现,应该可以工作,但我不完全确定JMS在这种情况下是否可行。它将在C#应用程序中引入一个新的特定于供应商的依赖项,用于实现细节和客户支持

通过谷歌搜索,我找到了STOMP,这似乎是一个由多个支持JMS的消息代理(hornetq、activemq等)支持的有线协议,但在C#(以及某种程度上的java)中似乎明显缺乏实际的客户端。没有深入研究,我也不完全确定强调“文本”在哪里起作用?它不支持二进制对象吗

另一个解决方案可能是AMQP,它是另一个有线级协议,但1.0规范尚未发布,我们对实施4年前的0.9.1规范感到厌倦,因为1.0中似乎发生了很多变化

考虑到安全性、支持性、事务性、标准遵从性、可移植性等,哪种解决方案最适合跨语言异步消息传递,。。。请注意,具有适当WS-*的soap不是此特定接口的选项

EDIT1
我见过这样的问题,但它们似乎集中在一个在多种语言中工作的特定工具上。实际上,我正在寻找一种兼容标准的协议,它可以由多个供应商实现。

一种选择是从底层特定的通知协议中抽象出C#client,并让它在in-ports和out-ports级别工作,其中in-ports和out-ports是使用通用互操作适配器实现的-a关系数据库、web服务、特定文件夹中的xml文件


您有责任在适配器和消息传递子系统之间提供适配器和桥梁,但有明显的好处:企业环境之间的相互义务是在非常普通的级别定义的。您甚至可以在某一天更换消息传递子系统,并保留所有的输入和输出端口。换句话说,C#客户端甚至不会注意到您用另一个消息传递基础结构替换了JMS,因为它仍然从同一组适配器发送/接收数据。

我不知道是否正确理解了您的问题,但是 是一个AMQP实现,具有C#和Java的绑定


为了防止“在C#应用程序中出现新的特定于供应商的依赖关系”,您可能需要查看应用程序及其项目。这允许您将POCO和业务逻辑与消息中间件和基础架构分离。

无论您做什么,您都将引入一些特定于供应商或消息平台的功能。您可以使用电子邮件,因为这是跨平台的,但它是特定于SMTP的。只要协议是一个公认的标准,特定于协议就不是问题。如果SMTP只能从一个特定的供应商获得,或者不同的供应商之间存在差异,那么这将是一个问题JMS是一个建立接口,它要求您为正在使用的服务器加载适当的驱动程序。您应该能够编写核心代码,以便在不更改代码的情况下配置所用服务器的选择。在java中,是的,但不是从.NET中,我们需要一个跨语言解决方案。您可以包装驱动程序吗使用您自己的通用接口,因此只需更换此组件?我们的软件团队没有C#知识,因此我们将被迫支持我们自己的适配器。抽象实际的消息传递后端将始终是解决方案的一部分,尽管抽象必须由C#应用程序团队管理。这就是为什么我推荐一组通用适配器,您确信C#没有问题。我们维护一个类似的解决方案,唯一的区别是我们使用MSMQ作为消息传递子系统,shell是用C#编写的。通用适配器的想法非常有效,PHP和Java在编写关系数据库和基于WSDL规范提供自己的web服务方面没有问题。这就是为什么我相信类似的方法会对您有效。是的,但必须有人维护C#java桥,这意味着我们必须要么读取MSMQ,要么写入JMS,要么我们必须找到另一个协议来实现这一点(不是Web服务,当然不是数据库/文件系统)。我们的方法中没有互操作桥。例如,Java人员使用一个存储的进程在in端口(数据库)中创建通知,我们提供了系统的核心,它读取数据库并向MSMQ发送通知。因此,所有外部系统都不知道通知引擎的内部结构。数据库/webservices/filesystem是您正在寻找的协议。就像:他们->输入(数据库/Web服务)->你->JMS->你->输出(数据库/Web服务)->他们。他们只知道通用适配器,您提供了基础结构的内部详细信息。由于AMQP 1.0尚未最终确定,我不确定这是否是目前的最佳选择?Spring.Net的链接消息组件还具有其他MQs(例如TIBCO EMS、Apache ActiveMQ/NMS)。这可能超出了原始问题的范围,但spring在.NET中的依赖性是否与java中的依赖性一样大?您可以简单地使用消息传递组件,就像在不使用整个JavaEE堆栈的情况下使用JMS api一样吗?免责声明:我没有C#或spring方面的背景。我在Java方面的背景有限,但.Net spring.Net通常不具有侵入性。此外,spring只有很少的外部依赖项(除了.Net framework之外),并且只在需要该功能时才需要这些依赖项(例如,只有使用spring.Data.nhibernate时才需要nhibernate)。