如何获取消息?使用 JMS 技术作为数据复制的解决方案
2009-11-06 00:00:00 来源:WEB开发网跨平台和交叉供应商
对我们客户机来说尽量减少对某家供应商的依赖,这意味着,我们所设计的代码应该使由于更改了 JMS 供应商而带来的影响降至最低,这是十分重要的。JMS 的一个主要优点是它以广泛的业界支持和开放标准为基础,因此有了正确设计的代码,我们就可以让系统使用任何 JMS 系统。(可以对现有系统进行直接改进,专门设计来使系统在某套硬件上运行并能与特定于供应商的解决方案相匹配。)
通过将所有特定于供应商的调用封装在称为 JMSProvider 的类中,就可以轻松实现平台独立性。这些 Provider 类处理特定于供应商的问题,例如工厂查询、错误处理、连接创建和消息特性设置等。请参阅下面清单 1 中的示例代码。
清单 1. 在类 ar.jms.JmsProvider 中public QueueConnection createConnection() throws JMSException {
return getConnectionFactory().createQueueConnection(getUserName(),
getPassword());
}
通过利用“Java 命名和目录接口(JNDI)”,我们将特定于供应商的设置存储在一个资源库(例如,LDAP 库)中,这样实际代码就几乎不需要特定于供应商的引用。只需要少量特定于供应商的代码来处理一些特性,但是可以将这样的代码限定于一些“适配器”类,并将它保存在应用程序代码之外。请参阅下面清单 2 中的示例代码。因为 JMS 被设计用来方便地使用 JNDI,所以与其它解决方案相比,这是另一个直接优点 ― 配置信息的集中存储不仅可以保存基于文本的信息,而且还可以存储已配置的对象。
清单 2. 在类 ar.jms.JmsProvider 中public final static String
CONNECTION_FACTORY_LOOKUP_NAME_KEY = "CONNECTION_FACTORY_LOOKUP_NAME";
public final static
String FILE_TRANSFER_QUEUE_LOOKUP_NAME_KEY =
"FILE_TRANSFER_QUEUE_LOOKUP_NAME";
public final static String
JMS_PROVIDER_CLASS_KEY = "JMS_PROVIDER_CLASS";
public void init() throws NamingException {
InitialContext jndi = createInitialContext();
initConnectionFactory(jndi);
initFileTransferQueue(jndi);
}
public QueueConnection createConnection() throws JMSException {return
getConnectionFactory().createQueueConnection(getUserName(),
getPassword());
}
public void initConnectionFactory(InitialContext jndi) throws
NamingException {
setConnectionFactory((QueueConnectionFactory)jndi.lookup
(getProperties().getProperty(CONNECTION_FACTORY_LOOKUP_NAME_KEY)));
}
public void initFileTransferQueue(InitialContext jndi) throws
NamingException {
setFileTransferQueue((Queue) jndi.lookup
(getProperties().getProperty(FILE_TRANSFER_QUEUE_LOOKUP_NAME_KEY)));
}
更多精彩
赞助商链接