2017-05-25 122 views
1

我是JavaEE的新手,我嘗試使用jms和mdb構建消息傳遞系統。我要做到以下幾點: - 處理是由一個MDB 實現郵件服務器 - 不同的客戶端誰應該溝通 - 客戶端應該剛剛超過服務器進行通信,而不是直接JavaEE-使用JMS和MDB的消息傳遞系統

所以沒什麼特別的。我在Oracle的文檔和教程中閱讀了很多內容,我仍然對某些事情感到困惑(儘管它正在工作)。

1.Message驅動bean: 在@MessageDriven註解,可以與@ActivationConfigProperty註釋配置豆,如:

@MessageDriven(mappedName = "myBean", activationConfig = { 
     @ActivationConfigProperty(propertyName = "messageSelector", 
       propertyValue = "requestType = 'reqA' OR requestType = 'reqB'"), 
     @ActivationConfigProperty(propertyName = "destinationType", 
       propertyValue = "javax.jms.Queue")}) 

但我怎麼「製造」這個bean的隊列?我想我在這裏想的東西..

2.對於客戶我使用託管的豆。客戶端能夠發送和接收,因此他們需要一個隊列或一個主題。我創建客戶端的隊列

@Resource(name = "clientQueue") 
private Queue clientQueue; 

@Resource(mappedName = "serverBean") 
private Queue serverQueue; 

獲得從MDB隊列在MDB我收到來自客戶端的隊列

@Resource(name = "clientQueue") 
private Queue clientQueue; 

是這樣正確還是有更好的解決方案?

我知道這是非常基本的,但我很困惑,教程表格apache tomcat與我從oracle得到的教程有些不同之處。

我很困惑自己,所以任何澄清將是非常好的!

回答

0

您提到的隊列存在於應用程序之外,由您的服務器提供訪問它們的機制。最簡單的情況是你的隊列是由你的服務器定義的,使得它們可以輕鬆地被運行在那裏的所有應用程序使用。實際的定義是提供者特定的(即在jboss,payara等方面是不同的)。

讓我們看看如何在Wildfly/JBoss上完成它。服務器使用ActiveMQ的傳輸子系統,在這裏我們可以定義連接工廠,隊列,主題等

<subsystem xmlns="urn:jboss:domain:messaging-activemq:1.0"> 
      <server name="default"> 
       <security-setting name="#"> 
        <role name="guest" send="true" consume="true" create-non-durable-queue="true" delete-non-durable-queue="true"/> 
       </security-setting> 
       <address-setting name="#" dead-letter-address="jms.queue.DLQ" expiry-address="jms.queue.ExpiryQueue" max-size-bytes="10485760" page-size-bytes="2097152" message-counter-history-day-limit="10"/> 
       <http-connector name="http-connector" socket-binding="http" endpoint="http-acceptor"/> 
       <http-connector name="http-connector-throughput" socket-binding="http" endpoint="http-acceptor-throughput"> 
        <param name="batch-delay" value="50"/> 
       </http-connector> 
       <in-vm-connector name="in-vm" server-id="0"/> 
       <http-acceptor name="http-acceptor" http-listener="default"/> 
       <http-acceptor name="http-acceptor-throughput" http-listener="default"> 
        <param name="batch-delay" value="50"/> 
        <param name="direct-deliver" value="false"/> 
       </http-acceptor> 
       <in-vm-acceptor name="in-vm" server-id="0"/> 
       <jms-queue name="ExpiryQueue" entries="java:/jms/queue/ExpiryQueue"/> 
       <jms-queue name="DLQ" entries="java:/jms/queue/DLQ"/> 
       <connection-factory name="InVmConnectionFactory" connectors="in-vm" entries="java:/ConnectionFactory"/> 
       <connection-factory name="RemoteConnectionFactory" connectors="http-connector" entries="java:jboss/exported/jms/RemoteConnectionFactory"/> 
       <pooled-connection-factory name="activemq-ra" transaction="xa" connectors="in-vm" entries="java:/JmsXA java:jboss/DefaultJMSConnectionFactory"/> 
      </server> 
     </subsystem> 

這是Wildfly 10默認配置(您必須使用完整的個人資料,或手動添加messaging-activemq子系統您的個人資料)。默認配置已經提供了一個本地連接工廠(InVmConnectionFactory)和兩個隊列 - 死信隊列和到期隊列。讓我們爲您添加新的隊列:
每個隊列都需要一個名稱和至少一個jndi查找條目。

<jms-queue name="ClientQueue" entries="java:/jms/queue/clientQueue"/> 

這個定義你clientQueue隊列,應該通過@Resource(name = "clientQueue")滿足您的查找。

請注意,您的MDB還需要額外的配置來指定從哪個隊列偵聽消息。

@ActivationConfigProperty(propertyName = "destination", propertyValue = "java:/jms/queue/clientQueue") 

我推薦你從服務器供應商提供的一個簡單的例子開始。有一些很好的例子herehere
快樂的黑客攻擊。