最近在尝试使用ActiveMQ做系统间的继承,当然少不了Java和C++客户端的交互问题。由于Java与C++在字符串上采用了不同方式的编码(Java-Unicode, C++ - ascii)造成了文本数据传输过程中的编码问题, 下面记录一下解决方
环境:
C++ 端:
操作系统: Win7
JMS客户端: CMS 3.1.2 (新版本的CMS需要VS2008编译)
开发环境: VS2005
Java端:
操作系统: WinXp
JMS客户端: ActiveMQ5.4.1-Core
开发环境: JDK1.6.22
ActiveMQ:
ActiveMQ 5.4.1
解决方法:
根据JMS API对Message类别的定义,最适合多语言见交互的Message类型应该是BytesMessage和TextMessage。由于BytesMessage的readUTF方法在CMS3.1.2中,接收Java端发出的UTF字符时会抛出异常,导致BytesMessage不好使用;
TextMessage中,无论C++端以哪种格式的数据setText()
, Java端接收到的数据都是以ISO-8859-1
格式编码的字符。所以统一在发送和接收时都采用 ISO-8859-1
的方式进行数据传输
发送时的代码:
private void writeTextMessage(String txt) {
try {
String msg = txt;
String iso = new String(txt.getBytes("GBK"), "ISO-8859-1");
TextMessage message = pubSession.createTextMessage();
message.setStringProperty("language", "java");
message.setText(iso);
pub.publish(message);
} catch (JMSException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
接收时的代码:
private void onTextMessage(TextMessage message) throws JMSException {
String txt = message.getText();
try {
String gbk = new String(txt.getBytes("ISO-8859-1"), "GBK");
System.out.println(gbk);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
Update1: 2011-07-26 10:00
CMS版本不是1.0版,应该是3.1.2
分享到:
相关推荐
标题中的“在Java与C++间应用Activemq”指的是使用Apache ActiveMQ这一开源消息代理在Java和C++编程语言之间构建通信桥梁。ActiveMQ是Java Message Service (JMS) 的实现,允许分布式系统中的组件通过消息传递进行...
2. **JMS接口**:Java应用程序通过JMS接口与ActiveMQ交互。主要接口包括`ConnectionFactory`(创建连接)、`Connection`(建立到消息代理的连接)、`Session`(创建消息消费者和生产者)、`MessageProducer`(发送...
在C++中,我们通常使用Apache ActiveMQ的C++ API(libactivemq-cpp)来与消息队列交互。首先,需要安装libactivemq-cpp库,并通过创建`cpp::Connection`对象连接到ActiveMQ服务器。然后,创建`cpp::Session`对象来...
通过深入研究ActiveMQ 5的Java源码,开发者可以更好地理解消息中间件的工作机制,这对于定制化开发、性能调优和问题排查都非常有帮助。同时,这也是学习和掌握分布式系统设计原则、并发编程以及网络通信的好途径。
ActiveMQ,作为Java消息服务(JMS)的一个实现,是Apache软件基金会开发的一款开源消息中间件。...通过持续的测试和实践,开发者可以更好地利用ActiveMQ解决实际问题,提升系统的稳定性和可维护性。
总结来说,这个压缩包的内容很可能是关于如何使用Java和ActiveMQ实现消息转发的教程或示例代码,涉及到ActiveMQ的基础知识、JMS API的使用、消息转发的配置与编程实现,以及在实际应用中的价值。对于想要学习和掌握...
C++调用ActiveMQ编译所需要的类库,需要用到的类库都已打包! apr-1.lib activemq-cpp.lib activemq-cpp.dll apriconv-1.lib aprutil-1.lib cppunit.lib libapr-1.lib libapriconv-1.lib libaprutil-1.lib xml.lib ...
ActiveMQ是Apache软件基金会开发的一款开源消息中间件,它遵循JMS(Java消息服务)规范,用于在分布式系统中提供高效、可靠的消息传递。在这个Java项目中,包含了使用Java操作ActiveMQ的代码示例和所需的jar包,可以...
2. **Java客户端**:在Java中,可以使用libmemcached或spymemcached库来与memcached进行交互,实现对象的缓存和获取。 3. **基本操作**:包括设置键值对、获取键值对、删除键值对等,这些操作在示例代码中会有所展示...
通过运行这些代码,你可以理解ActiveMQ如何与Java应用程序交互,以及如何在实际项目中应用消息中间件来解耦系统组件,提高系统的可扩展性和可靠性。 总结来说,ActiveMQ作为一款强大的消息中间件,提供了丰富的API...
Java中间件领域的ActiveMQ是一款由Apache开发的开源消息中间件,它为企业级应用提供高效、可扩展、稳定且安全的消息通信服务。ActiveMQ的核心目标是实现标准的、面向消息的集成,支持多语言环境,确保不同平台之间的...
描述中提到的“java 和C、C++ 通信ActiveMQ中间件的C支持库”表明我们要关注的是ActiveMQ的C/C++客户端库,它允许C或C++应用程序与Java平台上的ActiveMQ服务器进行交互。这个库通常包含了发送和接收消息所需的接口和...
即使这些应用程序可能运行在不同的操作系统或编程语言环境下,如这里的C++与ActiveMQ的Java背景。通过ActiveMQ,C++开发者可以利用MFC库来创建客户端,实现与ActiveMQ服务器的通信。 首先,我们需要理解ActiveMQ的...
下面将详细探讨如何使用Java和JavaScript与ActiveMQ交互,并实现应用实例。 首先,我们要理解ActiveMQ的基本概念。消息队列(Message Queue)是一种设计模式,用于解耦生产者(发送消息)和消费者(接收消息)。...
消息队列:ActiveMQ:ActiveMQ与Java消息服务(JMS)API教程.docx
消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。排队指的是应用程序通过队列来通信。队列的使用除去了接收和发送应用程序同时执行...
在本文中,我们将深入探讨ActiveMQ 5.10版本的下载与交互示例,以及如何通过`Publisher.java`和`Customer.java`这两个文件进行消息的发送和接收。 首先,你需要从官方网站或可靠的源下载ActiveMQ 5.10.1的安装包。...
这篇博客"ActiveMQ问题解决记录"可能涵盖了作者在使用ActiveMQ过程中遇到的问题以及解决这些问题的经验分享。 首先,让我们了解一下ActiveMQ的基本概念。ActiveMQ作为消息中间件,它充当应用程序之间的桥梁,负责...
本示例通过使用Apache ActiveMQ,演示了如何实现C++应用程序与C#应用程序之间的消息传递。ActiveMQ是一款开源的消息中间件,它遵循开放消息中间件接口(Open Message Broker Interface, OMBI)标准,并支持多种协议...
ActiveMQ 是Apache出品,最流行的,能力...本压缩包是是实现ActiveMQ中点对点与发布订阅模式的java项目,下载后可配合运行好的ActiveMQ服务直接运行。 没有ActiveMQ服务的可下载本人的ActiveMQ消息中间件,运行即可。