IBM WebSphere MQ 的消息队列使用代码样例

关键模块

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(); // 回滚事务
    }
}

使用到的设计模式

  1. 单例模式 (Singleton Pattern): 在连接工厂和队列管理器的实现中,确保在应用程序中只存在一个连接实例,减少资源消耗,提高性能。

  2. 工厂模式 (Factory Pattern): 在 WMQConnectionFactory 和 WMQQueueFactory 中,封装对象的创建逻辑,使代码更加灵活,便于扩展和维护。

  3. 观察者模式 (Observer Pattern): 在 DefaultJMSExceptionListener 中,通过实现 ExceptionListener 接口,类能够接收 JMS 事件并进行处理,增强了系统的解耦性。

  4. 命令模式 (Command Pattern): 在消息发送和接收的实现中,将消息发送和接收的操作封装成命令,便于管理和扩展。

  5. 模板方法模式 (Template Method Pattern): 在 WMQTransactionManager 中,定义了事务的提交和回滚逻辑,允许子类实现具体的事务管理。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值