Session Bean 同步調用導致客戶端等待,耗時操作需異步化。MDB 基於 JMS:客戶端(生產者)發送訊息至 Queue,MDB(消費者)讀取處理。本文完整示例:客戶端發送實體 Bean 實例,MDB 持久化該實體。
標準 JPA 實體,@Entity、@Table、@Id、@GeneratedValue、@Column,含 id 與 myDate 屬性。
MessageListener,覆寫 onMessage(Message)。@MessageDriven 指定 activationConfig:destinationType=javax.jms.Queue、destination=queue/MDBQueue。EntityManager(@PersistenceContext)。onMessage 中判斷 ObjectMessage,提取實體並 em.persist()。JBoss 不自動建 Queue,需在 server/default/deploy 建 xxx-service.xml(如 mdb-service.xml):
<?xml version="1.0" encoding="UTF-8"?>
<server>
<mbean code="org.jboss.mq.server.jmx.Queue"
name="jboss.mq.destination:service=Queue,name=MDBQueue">
<depends optional-attribute-name="DestinationManager">
jboss.mq:service=DestinationManager
</depends>
</mbean>
</server>
name 屬性中的 name=MDBQueue 必須與 queue/MDBQueue 尾部一致。未配置拋 NameNotFoundException: MDBQueue not bound;未設 destination 屬性拋部署異常。
@Resource(mappedName="ConnectionFactory") 注入連線工廠。@Resource(mappedName="queue/MDBQueue") 注入 Queue。DateBean、獲取 JMS 連線/Session/Producer、包裝 ObjectMessage 發送、關閉連線。獨立 Java 客戶端:InitialContext 查找 ConnectionFactory 與 queue/MDBQueue,建立 QueueConnection/QueueSession/MessageProducer,發送 ObjectMessage 封裝的實體。無需部署於應用伺服器。