实战:用 Claude Code 重构 Jakarta EE 消息队列生产者代码
在实际项目中,客户的消息中间件往往只支持 Queue,不支持 Topic。为了适配这种环境,我们需要对原有的 Jakarta EE JMS 生产者示例进行裁剪。这次我尝试在本地终端直接使用 Claude Code 来完成这项修改工作。
任务背景
原项目是一个标准的 Jakarta EE JMS 生产者示例,同时支持 Queue 和 Topic 两种模式。通过命令行参数指定目标类型。但在当前生产环境中,只需要处理 Queue 即可。
交互过程
启动 claude 命令后,直接下达了指令:'将代码改为只处理 Queue,提高代码的可读性'。
模型迅速分析了项目结构,识别出这是一个基于 jakarta.jms.* 包的示例代码。它执行了以下关键操作:
- 移除 Topic 依赖:删除了
Topic类的导入以及对应的资源注入注解。 - 简化参数解析:原代码需要传入
<dest_type> [<number-of-messages>],现在只需传入消息数量。 - 清理注释:更新了类和方法的 JavaDoc,使其与实际功能保持一致。
整个过程非常流畅,模型不仅修改了代码逻辑,还顺手修复了部分变量命名规范(如将 NUM_MSGS 的定义方式调整为更符合现代 Java 习惯)。
最终代码
经过修改后的 QueueProducer.java 更加简洁,不再包含任何关于 Topic 的判断分支。核心逻辑集中在创建 JMSContext 和发送消息上。
/*
* Copyright (c), Eclipse Foundation, Inc. and its licensors.
*
* All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Distribution License v1.0, which is available at
* https://www.eclipse.org/org/documents/edl-v10.php
*
* SPDX-License-Identifier: BSD-3-Clause
*/
package jakarta.tutorial.producer;
import jakarta.annotation.Resource;
import jakarta.jms.ConnectionFactory;
import jakarta.jms.Destination;
import jakarta.jms.JMSContext;
import jakarta.jms.JMSRuntimeException;
import jakarta.jms.Queue;
/**
* The QueueProducer class consists only of a main method, which sends several
* messages to a queue.
*
* Run this program in conjunction with SynchConsumer or AsynchConsumer. By default,
* the program sends one message. Specify a number as command line argument to
* send that number of messages.
*/
public class QueueProducer {
@Resource(lookup = "java:comp/DefaultJMSConnectionFactory")
private static ConnectionFactory connectionFactory;
Queue queue;
{
(args.length > ) {
System.err.println(
);
System.exit();
}
;
(args.length == ) {
{
numMsgs = Integer.parseInt(args[]);
(numMsgs <= ) {
System.err.println( + numMsgs);
System.exit();
}
} (NumberFormatException e) {
System.err.println( + args[]);
System.exit();
}
}
numMsgs;
queue;
( connectionFactory.createContext();) {
;
( ; i < NUM_MSGS; i++) {
+ (i + )
+ ;
System.out.println( + message);
context.createProducer().send(dest, message);
count += ;
}
System.out.println( + count);
context.createProducer().send(dest, context.createMessage());
} (JMSRuntimeException e) {
System.err.println( + e.toString());
System.exit();
}
System.exit();
}
}

