如何获取消息?使用 JMS 技术作为数据复制的解决方案
2009-11-06 00:00:00 来源:WEB开发网在独立线程中,轮询程序接着从连接池中获取 JMSConnection,用它来创建一个 BytesMessage,并将这个文件的二进制内容放入那个消息中。最后这个消息查找到接收器,并发送到 JMS 服务器,接着将 JMSConnection 返回给 ConnectionPool。这个发送过程的部分步骤显示在下面的图 2 中。
图 2. 发送器过程
图片看不清楚?请点击这里查看原图(大图)。
接收器是一个较简单的组件;它启动一些 FileListener 来等待将要放置在接收器队列中的消息。下面的清单 4 中的代码显示了 FileListener 设置处理过程。图 6 中的类实际上负责从队列中检索消息并对它们进行存档。JMS 保证队列发送每个消息的次数仅一次,所以我们可以安全启动许多不同的 FileListener 线程并且知道每个消息(因此每个文件)只处理一次。这个保证是使用基于 JMS 解决方案的另一个重要优点。在自己设计的解决方案中开发这样的功能(比如基于 FTP 的功能),花销很大且易出错。
清单 4:来自类 ar.jms.file.receive.FileListenerpublic void startOn(Queue queue) {
setQueue(queue);
createConnection();
try {
createSession();
createReceiver();
getConnection().start(); // this starts
the queue listener
} catch (JMSException exception) {
// Handle the exception
}
}
public void createReceiver() throws javax.jms.JMSException {
try {
QueueReceiver receiver = getSession().
createReceiver(getQueue());
receiver.setMessageListener(this);
} catch (JMSException exception) {
// Handle the exception
}
}
public void createSession() throws JMSException {
setSession(getConnection().
createQueueSession(false, Session.AUTO_ACKNOWLEDGE));
}
public void createConnection() {
while (!hasConnection()) {
try {
setConnection(getClient().createConnection());
} catch (JMSException exception) {
// Connections drop periodically on the
internet, log and try again.
try {
Thread.sleep(2000);
} catch
(java.lang.InterruptedException ignored) {
}
}
}
}
更多精彩
赞助商链接