IBM MQ的最佳实践是 队列等对象的名称全面采用大写,但是我又不想破坏jakarta ee 导入教材的源代码,有什么好的建议处理这个问题?
利用 JNDI 逻辑名与物理队列名的解耦,无需修改源代码。
核心思路
@JMSDestinationDefinition 中的 destinationName = "PhysicalWebappQueue" 和 @Resource(lookup = "java:comp/jms/webappQueue") 都不需要改。代码使用的是 JNDI 逻辑名,而物理队列名在 Liberty
的 server.xml 中映射,两者可以不同:
应用代码 → JNDI 名称(不变) → Liberty server.xml → IBM MQ 物理队列
java:comp/jms/webappQueue → jmsQueue.baseQueueName → PHYSICALWEBAPPQUEUE
具体做法
1. IBM MQ 中创建大写队列名:
runmqsc
DEFINE QLOCAL('PHYSICALWEBAPPQUEUE') DESCR('websimplemessage queue') DEFPSIST(YES) REPLACE
2. Liberty server.xml 中做映射:
jmsConnectionFactory jndiName="java:comp/DefaultJMSConnectionFactory">
properties.mqJms
hostName="10.0.0.x" port="1414" channel="SYSTEM.DEF.SVRCONN"
queueManager="QM1"/>
jmsConnectionFactory>
jmsQueue jndiName="java:comp/jms/webappQueue">
properties.mqJms baseQueueName="PHYSICALWEBAPPQUEUE"/>
jmsQueue>
3. 源代码完全不动:
SenderBean.java 中的 @JMSDestinationDefinition 和 @Resource(lookup = "java:comp/jms/webappQueue")、ReceiverBean.java 中的 @Resource(lookup = "java:comp/jms/webappQueue") 均保持原样。
为什么安全
- Liberty server.xml 中定义的资源优先级高于应用内的 @JMSDestinationDefinition
- @Resource(lookup = "java:comp/jms/webappQueue") 解析时返回的是 server.xml 配置的 JMS Queue 对象,其背后指向 PHYSICALWEBAPPQUEUE
- 这恰好是 Jakarta EE 设计意图:应用用逻辑名,基础设施用物理名,两者通过配置层解耦
全局映射表建议
对所有 JMS 模块统一建立映射表,可以汇总到 docs/ibm-mq-migration-analysis.md 中:
┌──────────────────────────┬────────────────────────────┬─────────────────────────┐
│ 代码中的 destinationName │ JNDI 名称 │ IBM MQ 物理队列(大写) │
├──────────────────────────┼────────────────────────────┼─────────────────────────┤
│ PhysicalWebappQueue │ java:comp/jms/webappQueue │ PHYSICALWEBAPPQUEUE │
├──────────────────────────┼────────────────────────────┼─────────────────────────┤
│ PhysicalQueue │ jms/MyQueue │ PHYSICALQUEUE │
├──────────────────────────┼────────────────────────────┼─────────────────────────┤
│ PhysicalOrderQueue │ java:global/jms/OrderQueue │ PHYSICALORDERQUEUE │
├──────────────────────────┼────────────────────────────┼─────────────────────────┤
│ ... │ ... │ ... │
└──────────────────────────┴────────────────────────────┴─────────────────────────┘
这样既遵循了 IBM MQ 最佳实践,又保持了教程源代码的原样,符合迁移原则。
1402

被折叠的 条评论
为什么被折叠?



