Adobe Experience Manager (AEM) 与 ActiveMQ 的集成可实现系统间的解耦和异步通信,以下是详细的集成步骤与代码实现:一、环境准备
- AEM 环境:AEM 6.5+ 或 AEM as a Cloud Service
- ActiveMQ:版本 5.15+(推荐 5.17.x)
- Maven 项目:用于开发 AEM 组件和配置
二、ActiveMQ 配置
1. 启用 JMS 连接
修改 ActiveMQ 的 conf/activemq.xml,确保支持 OpenWire 协议:- <transportConnectors>
- <persistenceAdapter>
- <kahaDB directory="${activemq.data}/kahadb"/>
- </persistenceAdapter><transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
- </transportConnectors>
复制代码 2. 创建 JMS 用户(可选)
修改 conf/users.properties 添加专用用户:- jmsuser=jms password,users
复制代码 三、AEM 集成步骤
1. 添加 ActiveMQ 依赖
在 AEM 项目的 pom.xml 中添加依赖:- <transportConnectors>
- <persistenceAdapter>
- <kahaDB directory="${activemq.data}/kahadb"/>
- </persistenceAdapter><transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
- </transportConnectors>org.apache.activemq<transportConnectors>
- <persistenceAdapter>
- <kahaDB directory="${activemq.data}/kahadb"/>
- </persistenceAdapter><transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
- </transportConnectors>activemq-client<transportConnectors>
- <persistenceAdapter>
- <kahaDB directory="${activemq.data}/kahadb"/>
- </persistenceAdapter><transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
- </transportConnectors>5.17.10<transportConnectors>
- <persistenceAdapter>
- <kahaDB directory="${activemq.data}/kahadb"/>
- </persistenceAdapter><transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
- </transportConnectors>org.slf4j<transportConnectors>
- <persistenceAdapter>
- <kahaDB directory="${activemq.data}/kahadb"/>
- </persistenceAdapter><transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
- </transportConnectors>slf4j-api<transportConnectors>
- <persistenceAdapter>
- <kahaDB directory="${activemq.data}/kahadb"/>
- </persistenceAdapter><transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
- </transportConnectors>1.7.36
复制代码 2. 创建 OSGi 配置
定义 ActiveMQ 连接工厂配置:- import org.osgi.service.metatype.annotations.AttributeDefinition;import org.osgi.service.metatype.annotations.ObjectClassDefinition;@ObjectClassDefinition(name = "ActiveMQ Connection Factory Configuration")public @interface ActiveMQConfig {<transportConnectors>
- <persistenceAdapter>
- <kahaDB directory="${activemq.data}/kahadb"/>
- </persistenceAdapter><transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
- </transportConnectors>@AttributeDefinition(name = "Broker URL", description = "ActiveMQ Broker URL")<transportConnectors>
- <persistenceAdapter>
- <kahaDB directory="${activemq.data}/kahadb"/>
- </persistenceAdapter><transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
- </transportConnectors>String brokerUrl() default "tcp://localhost:61616";<transportConnectors>
- <persistenceAdapter>
- <kahaDB directory="${activemq.data}/kahadb"/>
- </persistenceAdapter><transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
- </transportConnectors><transportConnectors>
- <persistenceAdapter>
- <kahaDB directory="${activemq.data}/kahadb"/>
- </persistenceAdapter><transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
- </transportConnectors>@AttributeDefinition(name = "Username", description = "ActiveMQ Username")<transportConnectors>
- <persistenceAdapter>
- <kahaDB directory="${activemq.data}/kahadb"/>
- </persistenceAdapter><transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
- </transportConnectors>String username() default "admin";<transportConnectors>
- <persistenceAdapter>
- <kahaDB directory="${activemq.data}/kahadb"/>
- </persistenceAdapter><transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
- </transportConnectors><transportConnectors>
- <persistenceAdapter>
- <kahaDB directory="${activemq.data}/kahadb"/>
- </persistenceAdapter><transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
- </transportConnectors>@AttributeDefinition(name = "Password", description = "ActiveMQ Password")<transportConnectors>
- <persistenceAdapter>
- <kahaDB directory="${activemq.data}/kahadb"/>
- </persistenceAdapter><transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
- </transportConnectors>String password() default "admin";}
复制代码 3. 实现 JMS 连接工厂服务
4. 实现 JMS 消息生产者
5. 实现 JMS 消息消费者(Sling Model)
四、AEM 组件集成示例
1. 创建 Sling Model 调用生产者
- import org.apache.sling.api.SlingHttpServletRequest;import org.apache.sling.models.annotations.Model;import org.osgi.service.component.annotations.Reference;@Model(adaptables = SlingHttpServletRequest.class)public class AemMessageSender {<transportConnectors>
- <persistenceAdapter>
- <kahaDB directory="${activemq.data}/kahadb"/>
- </persistenceAdapter><transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
- </transportConnectors>@Reference<transportConnectors>
- <persistenceAdapter>
- <kahaDB directory="${activemq.data}/kahadb"/>
- </persistenceAdapter><transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
- </transportConnectors>private JmsMessageProducer messageProducer;<transportConnectors>
- <persistenceAdapter>
- <kahaDB directory="${activemq.data}/kahadb"/>
- </persistenceAdapter><transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
- </transportConnectors>public void sendAemContent(String content) {<transportConnectors>
- <persistenceAdapter>
- <kahaDB directory="${activemq.data}/kahadb"/>
- </persistenceAdapter><transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
- </transportConnectors><transportConnectors>
- <persistenceAdapter>
- <kahaDB directory="${activemq.data}/kahadb"/>
- </persistenceAdapter><transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
- </transportConnectors>messageProducer.sendMessage("aem.content.queue", content);<transportConnectors>
- <persistenceAdapter>
- <kahaDB directory="${activemq.data}/kahadb"/>
- </persistenceAdapter><transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
- </transportConnectors>}}
复制代码 2. 创建 HTL 模板触发消息发送
- <transportConnectors>
- <persistenceAdapter>
- <kahaDB directory="${activemq.data}/kahadb"/>
- </persistenceAdapter><transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
- </transportConnectors>Send Content to ActiveMQ<transportConnectors>
- <persistenceAdapter>
- <kahaDB directory="${activemq.data}/kahadb"/>
- </persistenceAdapter><transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
- </transportConnectors>
复制代码 3. 创建 Sling Servlet 处理消息发送请求
- import org.apache.sling.api.SlingHttpServletRequest;import org.apache.sling.api.SlingHttpServletResponse;import org.apache.sling.api.servlets.SlingAllMethodsServlet;import org.osgi.service.component.annotations.Component;import org.osgi.service.component.annotations.Reference;import javax.servlet.Servlet;import java.io.IOException;@Component(service = Servlet.class,<transportConnectors>
- <persistenceAdapter>
- <kahaDB directory="${activemq.data}/kahadb"/>
- </persistenceAdapter><transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
- </transportConnectors>property = {<transportConnectors>
- <persistenceAdapter>
- <kahaDB directory="${activemq.data}/kahadb"/>
- </persistenceAdapter><transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
- </transportConnectors><transportConnectors>
- <persistenceAdapter>
- <kahaDB directory="${activemq.data}/kahadb"/>
- </persistenceAdapter><transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
- </transportConnectors>"sling.servlet.paths=/bin/sendMessage",<transportConnectors>
- <persistenceAdapter>
- <kahaDB directory="${activemq.data}/kahadb"/>
- </persistenceAdapter><transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
- </transportConnectors><transportConnectors>
- <persistenceAdapter>
- <kahaDB directory="${activemq.data}/kahadb"/>
- </persistenceAdapter><transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
- </transportConnectors>"sling.servlet.methods=POST"<transportConnectors>
- <persistenceAdapter>
- <kahaDB directory="${activemq.data}/kahadb"/>
- </persistenceAdapter><transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
- </transportConnectors>})public class MessageSendServlet extends SlingAllMethodsServlet {<transportConnectors>
- <persistenceAdapter>
- <kahaDB directory="${activemq.data}/kahadb"/>
- </persistenceAdapter><transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
- </transportConnectors>@Reference<transportConnectors>
- <persistenceAdapter>
- <kahaDB directory="${activemq.data}/kahadb"/>
- </persistenceAdapter><transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
- </transportConnectors>private AemMessageSender messageSender;<transportConnectors>
- <persistenceAdapter>
- <kahaDB directory="${activemq.data}/kahadb"/>
- </persistenceAdapter><transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
- </transportConnectors>@Override<transportConnectors>
- <persistenceAdapter>
- <kahaDB directory="${activemq.data}/kahadb"/>
- </persistenceAdapter><transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
- </transportConnectors>protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response) throws IOException {<transportConnectors>
- <persistenceAdapter>
- <kahaDB directory="${activemq.data}/kahadb"/>
- </persistenceAdapter><transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
- </transportConnectors><transportConnectors>
- <persistenceAdapter>
- <kahaDB directory="${activemq.data}/kahadb"/>
- </persistenceAdapter><transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
- </transportConnectors>String content = request.getParameter("content");<transportConnectors>
- <persistenceAdapter>
- <kahaDB directory="${activemq.data}/kahadb"/>
- </persistenceAdapter><transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
- </transportConnectors><transportConnectors>
- <persistenceAdapter>
- <kahaDB directory="${activemq.data}/kahadb"/>
- </persistenceAdapter><transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
- </transportConnectors>messageSender.sendAemContent(content);<transportConnectors>
- <persistenceAdapter>
- <kahaDB directory="${activemq.data}/kahadb"/>
- </persistenceAdapter><transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
- </transportConnectors><transportConnectors>
- <persistenceAdapter>
- <kahaDB directory="${activemq.data}/kahadb"/>
- </persistenceAdapter><transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
- </transportConnectors>response.getWriter().write("Message sent successfully");<transportConnectors>
- <persistenceAdapter>
- <kahaDB directory="${activemq.data}/kahadb"/>
- </persistenceAdapter><transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
- </transportConnectors>}}
复制代码 五、高级配置(可选)
1. 配置 JMS 持久化
修改 activemq.xml 启用持久化:- <transportConnectors>
- <persistenceAdapter>
- <kahaDB directory="${activemq.data}/kahadb"/>
- </persistenceAdapter><transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
- </transportConnectors>
复制代码 2. 配置消息监听器(异步消费)
六、验证集成效果
- 部署 AEM 包:将开发的 OSGi 组件打包部署到 AEM。
- 测试消息发送:
- 通过 AEM 页面触发消息发送
- 查看 ActiveMQ 控制台(http://localhost:8161/admin/queues.jsp)确认消息入队
- 测试消息接收:
七、常见问题与解决方案
- 连接失败
- 检查 ActiveMQ 地址和端口
- 确认防火墙未阻止通信(默认 61616 端口)
- 消息丢失
- 确保使用 DeliveryMode.PERSISTENT
- 检查 ActiveMQ 持久化配置
- AEM 组件无法访问 JMS 服务
- 检查 OSGi 配置是否正确
- 确认依赖包已正确导入
通过以上步骤,你可以实现 AEM 与 ActiveMQ 的完整集成,实现系统间的异步通信和解耦。根据实际需求,你还可以进一步优化配置,如使用 JNDI 管理连接工厂、配置集群模式提高可用性等。
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |