我之前写过一个 JCA 开发入门的文章,是一个 Outbound Resource Adapter 的开发。文章放在蓝点上了, 大家可以参考下。这次我想分析一个现有的 Inbound Resource Adapter 的实现。有关 Inbound 的架构, 请参考文章 JCA Oerview。
本次要分析的 Inbound Resouce Adapter 的目的是定期检查某个邮件服务器里某个目录下的邮件, 如果有新邮件就会通知相应的 MessageEndPoint。 该 RA 由 IronJacamar team 开发, 现在 trunk 下不再维护, 目前只存在 IronJacamar code branch 1.0 下。 我把该 rar 的代码完全移到了 github 下, 加上了 Maven 的支持。
https://github.com/gaol/mail-ra.git
我们先看下这个 RA 的 metadata:
<resourceadapter> <resourceadapter-class>org.jboss.jca.adapters.mail.MailResourceAdapter</resourceadapter-class> <config-property> <config-property-name>QueueSize</config-property-name> <config-property-type>java.lang.Integer</config-property-type> <config-property-value>1024</config-property-value> </config-property> <inbound-resourceadapter> <messageadapter> <messagelistener> <messagelistener-type>org.jboss.jca.adapters.mail.inflow.MailListener</messagelistener-type> <activationspec> <activationspec-class>org.jboss.jca.adapters.mail.inflow.MailActivationSpec</activationspec-class> <required-config-property> <config-property-name>mailServer</config-property-name> </required-config-property> <required-config-property> <config-property-name>mailFolder</config-property-name> </required-config-property> <required-config-property> <config-property-name>storeProtocol</config-property-name> </required-config-property> </activationspec> </messagelistener> </messageadapter> </inbound-resourceadapter> </resourceadapter>
这里定义了 resourceadapter-class 为: org.jboss.jca.adapters.mail.MailResourceAdapter, 它实现了
javax.resource.spi.ResourceAdapter 接口。 该接口定义了 RA 的生命周期方法和 MessageEndpoint 的 active 和
deactive 方法。除此以外,它还是个 Java Bean。
注意,在 Inbound Resource Adapter 里, resourceadapter-class 是必须有的, 而在 Outbound Resource Adapter 里,resourceadapter-class 可以没有, 原因是为了和 JCA 1.0 兼容, 因为在 JCA 1.0 里, 没有 Inbound 的概念。
还定义了 messagelistener-type 为: org.jboss.jca.adapters.mail.inflow.MailListener。这个是 MessageEndPoint 需要实现的接口。 当 RA 满足一定条件的时候, 调用 MailListener 里的方法。
另外还定义了 activationspec-class 为: org.jboss.jca.adapters.mail.inflow.MailActivationSpec, 这个是一个
JavaBean, 定义了 EIS 相关的配置信息。这些配置信息对应着 MDB 里的 activation-config-property. 从该配置文件可以看到: mailServer, mailFolder, storeProtocol 是必须配置的。
我们接下来写一个 MDB 来接收该 RA 的调用, 通过演示来摸清 Inbound RA 的调用流程:
package org.jboss.test.mdb; import javax.ejb.ActivationConfigProperty; import javax.ejb.MessageDriven; import javax.mail.Message; import javax.mail.MessagingException; import org.jboss.jca.adapters.mail.inflow.MailListener; @MessageDriven( name = "MailBean", messageListenerInterface = MailListener.class, activationConfig = { @ActivationConfigProperty(propertyName="mailServer", propertyValue = "pop.163.com"), @ActivationConfigProperty(propertyName="mailFolder", propertyValue = "INBOX"), @ActivationConfigProperty(propertyName="storeProtocol", propertyValue = "pop3"), @ActivationConfigProperty(propertyName="debug", propertyValue = "true"), @ActivationConfigProperty(propertyName="port", propertyValue = "110"), @ActivationConfigProperty(propertyName="userName", propertyValue = "XXXXXX"), @ActivationConfigProperty(propertyName="password", propertyValue = "XXXXXX") } ) @org.jboss.ejb3.annotation.ResourceAdapter(value = "mail-ra.rar") public class MailBean implements MailListener { public MailBean(){;} public void onMessage(Message msg) { StringBuilder sb = new StringBuilder(); try { String subject = msg.getSubject(); sb.append("Subject is: \n" + subject + "\n"); } catch (MessagingException e) { e.printStackTrace(); } System.out.println(sb.toString()); } }
其中, @ResourceAdapter(value = "mail-ra.rar") 用来指定该 MDB 与哪个 RA 相匹配。 这个 annotation 是由 jboss-ejb3 组件提供, 如果是部署到其他 App Server 下, 请参考其他 Server 的文档。 如果不使用 annotation, 那么需要在 MDB 这个 jar 里加入 jboss.xml 文件, 并配置 resource adapter 。
JBoss AS 7 使用 OSGI 的概念, 我们已经部署过 mail-ra.rar, MailListener 已经加载过, 那么我们这个 MDB 只需要是个简单的 jar 就可以了, 我们只需要在 MDB 的 jar 的的 META-INF/MANIFEST.MF 里加入:
Dependencies: deployment.mail-ra.rar
即可。 大家一定要注意 MANIFEST.MF 的格式, 最好能测试一下, 确定该条目已经起作用了(java.util.Manifest)。
注意, 目前只有 MDB 才能接收 Inbound Resource Adapter 调用。 因为每个 App Server 都支持 JMS, 每个 App Server 下都已经有了默认的 JMS 的一个 RA。因此, 如果你的 MDB 是基于 JMS 的, 就不需要再编写 RA 了。
首先我们 build mail-ra.rar 文件,
mvn package
之后部署 mail-ra.rar 到 JBoss AS 7,
bin/jboss-cli.sh --connect [localhost /] deploy ~/jca/mail-ra.rar
部署的时候 App Server 会调用 MailResourceAdapter 的 start 方法, 该方法会启动一个 NewMsgsWorker,
该 work 运行在 App Server 的线程下,并维持一个 Queue, 在 MailResourceAdapter.stop() 方法被调用之前, 该 work 会一直循环。 之后我们部署 MDB,
[localhost /] deploy ~/jca/maibean.jar
MDB 被部署的时候, App Server 会调用 MailResourceAdapter.endpointActivation(MessageEndpointFactory, ActivationSpec) 方法, 参数 MessageEndpointFactory 由 App Server 实现并创建, ActivationSpec 也是由 App Server 创建, 这里创建的 ActivationSpec 会包含 MDB 里定义的配置信息。 这个方法会创建一个 MailActivation 实例,并把它加入到 NewMsgsWorker 的 Queue 里, MailActivation 也是一个 Work, 该 Work 会调用 Java Mail 相关方法遍历邮件服务器某个目录下的邮件, 并调用 MailListener.onMessage(Message message) 方法。
FYI: Source of Mail-rar: https://github.com/gaol/mail-ra
相关推荐
在数据同步场景中,我们通常会使用JDBC Inbound Channel Adapter(jdbc-inbound)来监听数据库的变化,一旦数据库中有新的数据插入或更新,该适配器就会将这些变化转换为消息并推送到消息通道,从而触发后续的业务...
CIP(Customer Interaction Platform)Inbound Queue 是一种关键的IT系统组件,主要处理客户交互过程中的数据流动。本文将深入探讨CIP Inbound Queue的问题发现、监控和处理策略。 首先,我们关注的是“LI-CRM ...
标题与描述中的“Spring Integration adapter for Splunk”指的是Spring Integration框架与Splunk日志管理和分析平台之间的一个适配器。这个适配器旨在简化在Spring应用程序中集成Splunk的过程,以便于事件数据的推...
使用分析工具监控Inbound活动的效果,如网站流量、页面停留时间、转化率等,根据数据反馈不断优化策略。持续改进是Inbound营销成功的关键。 综上所述,Inbound for Schools战略要求学校团队在内容创作、SEO、潜在...
inbound-agent-latest.tar jenkins inbound
6. **Inbound LLB维护手段**:可能涵盖监控工具、日志分析、故障排查步骤、性能优化方法等,确保Inbound LLB系统的稳定运行。 7. **注意事项及FAQ**:列出实施和运维过程中可能遇到的问题及其解答,帮助用户避免...
在SAP PI(Process Integration)系统中,配置和开发涉及一系列步骤,确保数据和服务在不同系统间顺畅交互。本文将详细解析从SLD到测试代理类的整个过程,并解决sxi_monitor不记录错误消息的问题。...
NetworkDiagnostics_5_Inbound
**Laravel 开发与 Postmark Inbound Laravel** 在 Laravel 框架中,开发者经常会遇到处理邮件接收和解析的问题。Postmark 是一个流行的电子邮件服务,它提供了强大的发送和跟踪功能。而 `postmark-inbound-laravel`...
《Oracle Advanced Inbound Telephony Implementation Guide Release 1》是Oracle公司发布的一份详细指南,旨在帮助用户实施和配置Oracle Advanced Inbound Telephony系统在Release 11i版本中的应用。这份文档是...
成功的Inbound营销需要不断的数据分析和优化。跟踪网站流量、转化率、潜在客户来源和内容表现等指标,以便调整策略,确保资源投入带来最大的回报。 总结来说,Inbound营销为学校提供了一种更有效的方式,通过理解...
标题"Inbound6226036079035001163_tools_"似乎是一个由数字和单词组合而成的标识符,可能是某种内部版本号或追踪编号,但具体含义没有直接的IT行业标准。描述"New tools tools new new"表明这可能是一个包含新工具的...
只需点击一下鼠标,即可从Chrome插件提交当前页面到InBound.org 提交任何页面到Inbound.org 1点击。...无论如何,都不与Inbound.org或HubSpot相关联。该插件没有保修。 随意编辑它,使其更好。 支持语言:English
"PyPI 官网下载 | django-inbound-email-0.1.1.tar.gz" 这个标题表明我们讨论的是一个在Python Package Index(PyPI)上发布的软件包,名为“django-inbound-email”。PyPI是Python开发者发布和分享他们编写的开源...
【Sendgrid-Inbound-Parse-for-Discord】项目是一个整合Sendgrid的入站解析功能与Discord Webhook的解决方案,旨在实现将通过Sendgrid接收的邮件自动转发至Discord频道,以便于团队成员实时获取邮件通知。...
【标题】"inbound2468248872728883601_Tutorialhtml_" 指向的是一份关于HTML教程的资源,旨在帮助学习者提升技能并获取相关知识。HTML(HyperText Markup Language)是创建网页的标准标记语言,它是互联网上所有网页...
docker-inbound-agent:Jenkins代理的Docker映像,可以使用TCP或Websocket协议连接到Jenkins
标题 "inbound-jdk17.tar.gz" 指示我们正在处理一个与Java Development Kit (JDK) 版本17相关的压缩文件,而这个版本通常用于开发和运行Java应用程序。"jenkins" 标签表明这个JDK是与Jenkins CI/CD工具相关的,...