关键模块
1. 消息异常处理
- 类:
DefaultJMSExceptionListener
- 设计模式: 观察者模式 (Observer Pattern)
- 功能: 该类实现了
ExceptionListener
接口,用于监听 JMS 异常。当发生异常时,onException
方法会被调用,触发异常处理逻辑。
java
public class DefaultJMSExceptionListener implements ExceptionListener, ErrorHandler {
protected static Logger logger = LoggerFactory.getLogger(DefaultJMSExceptionListener.class);
// 处理 JMS 异常
public void onException(JMSException exception) {
handleError(exception);
}
// 记录异常信息
public void handleError(Throwable t) {
logger.error(ExceptionUtils.getStackTrace(t)); // 记录异常堆栈信息
}
}
2. JMS 连接工厂
- 类:
WMQConnectionFactory
- 设计模式: 工厂模式 (Factory Pattern)
- 功能: 该类负责创建 JMS 连接。通过
createConnectionFactory
方法封装了连接工厂的创建逻辑,简化了连接的生成过程。
java
public class WMQConnectionFactory implements ConnectionFactory {
private String hostname;
private int port;
private String channel;
private String queueManagerName;
private String clientId;
private Connection connection = null;
// 创建连接
public Connection createConnection() throws JMSException {
return createConnection(null, null); // 默认无用户名和密码
}
// 创建带有用户名和密码的连接
public Connection createConnection(String userName, String password) throws JMSException {
JmsConnectionFactory cf = connectionFactory(); // 获取连接工厂
if (userName == null)
connection = cf.createConnection(); // 创建连接
else
connection = cf.createConnection(userName, password); // 创建带凭证的连接
connection.start(); // 启动连接
return connection;
}
// 配置连接工厂
private JmsConnectionFactory connectionFactory() throws JMSException {
JmsFactoryFactory ff = JmsFactoryFactory.getInstance(WMQConstants.WMQ_PROVIDER);
JmsConnectionFactory cf = ff.createConnectionFactory();
// 设置连接属性
cf.setStringProperty(WMQConstants.WMQ_HOST_NAME, hostname);
cf.setIntProperty(WMQConstants.WMQ_PORT, port);
cf.setStringProperty(WMQConstants.WMQ_CHANNEL, channel);
cf.setIntProperty(WMQConstants.WMQ_CONNECTION_MODE, WMQConstants.WMQ_CM_CLIENT);
cf.setStringProperty(WMQConstants.WMQ_QUEUE_MANAGER, queueManagerName);
// 处理 clientId 的设置
if (clientId != null && !clientId.trim().isEmpty()) {
cf.setStringProperty(WMQConstants.CLIENT_ID, clientId);
}
return cf;
}
}
3. 消息发送与接收
- 类:
WMQMessageSender
和WMQMessageReader
- 功能: 这两个类负责消息的发送和接收。
WMQMessageSender
提供了发送消息的方法,而WMQMessageReader
则负责从队列中接收消息。
java
public class WMQMessageSender {
public void sendMessage(String message, Map<String, ? extends Object> headers, String queueName) throws Exception {
MQQueue queue = queueFactory.getMQQueue(queueName, openOptions); // 获取队列
MQMessage msg = new MQMessage(); // 创建消息对象
msg.format = MQConstants.MQFMT_STRING; // 设置消息格式
msg.write(message.getBytes("UTF-8")); // 写入消息内容
// 设置消息头信息
for (Map.Entry<String, ? extends Object> entry : headers.entrySet()) {
msg.setStringProperty(entry.getKey(), entry.getValue().toString());
}
queue.put(msg, pmo); // 发送消息
}
}
public class WMQMessageReader {
public MQMessage receiveRawMessage() throws Exception {
MQMessage message = new MQMessage(); // 创建消息对象
queue.get(message, gmo); // 从队列获取消息
return message; // 返回消息
}
}
4. 批量消息处理
- 类:
MessageBatchSender
- 功能: 该类负责批量发送消息。通过遍历指定目录中的文件,将每个文件的内容作为消息进行发送。
java
public class MessageBatchSender {
public void send(String path) {
File file = new File(path);
if (file.exists() && file.isDirectory()) {
sendDirectory(file); // 发送目录中的文件
} else {
error(path + " 不存在或者不是一个目录。");
}
}
private void sendDirectory(File dir) throws Exception {
File[] files = dir.listFiles(); // 列出目录中的文件
Arrays.sort(files); // 排序文件
for (File file : files) {
if (file.isFile()) {
sendFile(file); // 发送文件
}
}
}
private void sendFile(File file) throws Exception {
String message = readFile(file); // 读取文件内容
sendMessage(file.getName(), message); // 发送消息
}
}
5. 异常工具类
- 类:
ExceptionUtils
- 功能: 提供静态方法以获取异常的堆栈信息,方便日志记录和调试。
java
public class ExceptionUtils {
public static String getStackTrace(Throwable e) {
StringWriter sw = new StringWriter(); // 用于获取异常堆栈信息
PrintWriter pw = new PrintWriter(sw);
e.printStackTrace(pw); // 打印异常信息
pw.close();
return sw.toString(); // 返回堆栈信息字符串
}
}
6. 队列工厂
- 类:
WMQQueueFactory
- 设计模式: 工厂模式 (Factory Pattern)
- 功能: 该类封装了队列和队列管理器的创建及访问逻辑,简化了用户对队列的操作。
java
public class WMQQueueFactory {
public MQQueueManager getQueueManager() throws MQException {
if (this.reconnect || this.queueManager == null) {
createQueueManager(); // 创建或重新连接队列管理器
}
return queueManager; // 返回队列管理器
}
public MQQueue getMQQueue(String queueName, int openOptions) throws MQException {
MQQueue queue = queueManager.accessQueue(queueName, openOptions); // 访问指定队列
return queue; // 返回队列对象
}
}
7. 事务管理
- 类:
WMQTransactionManager
- 设计模式: 模板方法模式 (Template Method Pattern)
- 功能: 该类定义了事务的提交和回滚逻辑,通过继承
AbstractPlatformTransactionManager
来实现具体的事务管理。
java
public class WMQTransactionManager extends AbstractPlatformTransactionManager {
@Override
protected void doCommit(DefaultTransactionStatus status) throws TransactionException {
WMQTransactionObject txObject = (WMQTransactionObject) status.getTransaction();
MQQueueManager queueManager = txObject.getQueueManager();
queueManager.commit(); // 提交事务
}
@Override
protected void doRollback(DefaultTransactionStatus status) throws TransactionException {
WMQTransactionObject txObject = (WMQTransactionObject) status.getTransaction();
MQQueueManager queueManager = txObject.getQueueManager();
queueManager.backout(); // 回滚事务
}
}
使用到的设计模式
-
单例模式 (Singleton Pattern): 在连接工厂和队列管理器的实现中,确保在应用程序中只存在一个连接实例,减少资源消耗,提高性能。
-
工厂模式 (Factory Pattern): 在
WMQConnectionFactory
和WMQQueueFactory
中,封装对象的创建逻辑,使代码更加灵活,便于扩展和维护。 -
观察者模式 (Observer Pattern): 在
DefaultJMSExceptionListener
中,通过实现ExceptionListener
接口,类能够接收 JMS 事件并进行处理,增强了系统的解耦性。 -
命令模式 (Command Pattern): 在消息发送和接收的实现中,将消息发送和接收的操作封装成命令,便于管理和扩展。
-
模板方法模式 (Template Method Pattern): 在
WMQTransactionManager
中,定义了事务的提交和回滚逻辑,允许子类实现具体的事务管理。