最近在尝试使用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
分享到:
相关推荐
RetailSystem包含消息生产者Producer,BankSystem包含消息接收者Consumer和Java调用C++的中间类DLL,dll3为Java方法在C++下的实现.
activeMQ的java简单实例.zipactiveMQ的java简单实例.zip
java操作activeMQ(java项目代码及jar包可运行,队列和订阅模式)
使用ActiveMQ由C++控制台程序发送消息,C#控制台程序接收消息。
ActiveMQ 5 java 源码 直接从svn checkout 下来的代码。
activeMQ是jms的一种,是java是实现两个系统之间交互的方式,MQ分为队列模式和订阅模式,对这两种模式分别进行了测试通过。
本示例中,使用maven管理,完美解决各种依赖问题,不需要自行配置,导入项目等待eclipse自行下载jar包后即可; 请将本maven项目引入你自己的maven项目中(在你自己的pom.xml文件中配置这个项目的gourp和id以及版本号)...
ActiveMQ基于Java和JavaScript的应用实例 改造ActiveMQ官方例子,用Java和JavaScript实现实时监听,收发消息
消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。排队指的是应用程序通过队列来通信。队列的使用除去了接收和发送应用程序同时执行...
对ActiveMQ的两种消息模式用java进行了一个简单实现。
ActiveMQ 是Apache出品,最流行的,能力...本压缩包是是实现ActiveMQ中点对点与发布订阅模式的java项目,下载后可配合运行好的ActiveMQ服务直接运行。 没有ActiveMQ服务的可下载本人的ActiveMQ消息中间件,运行即可。
memcached 和 activeMQ 的入门级示例代码,JAVA eclipse工程
activeMQ 服务端客户端 java代码 activeMQ 服务端客户端 java代码
ActiveMQ 是由 Apache 出品的一款开源消息中间件,旨在为应用程序提供高效、可扩展、稳定、安全的企业级消息通信。它的设计目标是提供标准的、面向消息的、多语言的应用集成消息通信中间件。ActiveMQ 实现了 JMS 1.1...
利用activeMq实现的消息数据转发服务器端实现
包括ActiveMQ、CPPUnit、APR、APR-iconv、APR-util四个编译ActiveMQ必须的包,省得一个一个去下载了。 开发具体例子参考下面的链接 http://blog.sina.com.cn/s/blog_a459dcf501017ooh.html 配置和简单的例子参考下面...
ActiveMQ_in_Action_中文ActiveMQ_in_Action_中文ActiveMQ_in_Action_中文ActiveMQ_in_Action_中文
发布/订阅消息传递域的特点如下:(1)生产者将消息发布到topic中,每个消息可以有多个消费者,属于1:N关系(2)生产者和消费者之间有时间上的相关性,订阅某一个主题的消费者只能消费自它订阅之后发布的消息(3)...
ActiveMQ与Spring线程池整合的一个实例。 lib库没有上传。 对于实例的讲解,在竹子的论坛有我对这个实例的帖子(http://www.java2000.net/viewthread.jsp?tid=1167) lib中包含: apache-activemq-4.1.1.jar ...
ActiveMQ的安装与使用ActiveMQ的安装与使用ActiveMQ的安装与使用