如何获取消息?使用 JMS 技术作为数据复制的解决方案
2009-11-06 00:00:00 来源:WEB开发网以回调的方式编写消息处理代码,回调是当将消息传递给 FileListener 时,JMS 自动调用的方法。这个消息的代码显示在下面的清单 5 中。
清单 5. 来自类 ar.jms.file.receive.FileListenerpublic void onMessage(Message message) {
BytesMessage byteMessage = ((BytesMessage) message);
OutputStream stream =
new BufferedOutputStream(
new FileOutputStream(getFilenameFor(message)));
byte[] buffer = new byte[getFileBufferSize()];
int length = 0;
try {
while ((length = byteMessage.readBytes(buffer)) != -1) {
stream.write(buffer, 0, length);
}
stream.close();
} catch (JMSException exception) {
// Handle the JMSException
} catch (IOException exception) {
// Handle the IOException
}
}
在设置接收器时要记住一条诀窍:在所有 FileListener 启动后,确保启动这些 FileListener 的原始线程继续运行。这是必要的,因为某些 JMS 实现在守护程序的线程中启动 QueueListener。所以,如果正在运行的唯一线程是守护程序的线程,那么 Java 虚拟机(JVM)可能会过早地意外退出。下面的清单 6 显示了一些防止这种情况发生的简单代码。
清单 6. 至少使一个非守护程序的线程保持运行
public static void main(String[] args) {
ReceiverClient newReceiverClient = new ReceiverClient();
newReceiverClient.init();
setSoleInstance(newReceiverClient);
while(!finished) { // This prevents the VM from exiting early
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {
}
}
}
结束语
在该项目的最初实现之后,我们添加了一些功能,象消息压缩、当位置无法到达时的自动恢复、联合消息代理、安全性、健壮的日志记录、管理等等。添加这些功能很容易,因为 JMS 提供了开放模型,而且我们的体系结构也很健壮。构建整个系统花了六个星期的时间,并且还很快地替换了客户一直使用的现有的、劳动密集型的系统。在这些天里,系统已经超出了所有的基准测试程序的标准并且已更正了原来系统遗留下来的错误。这个项目不单超出了客户的期望,还证明了 JMS 是一个可行的解决方案,不仅适用于小型、面向消息的应用程序,而且还适用于大规模的、重要任务的数据传送操作。
更多精彩
赞助商链接