JBossにおける非同期メッセージの送信と受信
ejbを使用しない場合、どうやってjbossにおいて、非同期メッセージの送信と受信を簡単に行うことができますか?
spring対jmsのパッケージにより実現できます.
まず、jbossにConnection Factoryを配置します.Queue
jms-ds.xml
以上の配置が完了すると、キューに非同期のメッセージを受信し、送信することができます.
springを利用してメッセージの非同期受信を行う.
springでの配置は以下のbeanです.
Object Message Listenerの実現
いくつかの疑問:
1、皆さんはObject Message ListenerというListenerの書き方に変なものがあるかもしれませんが、普通のListenerはjmsのMessage Listenerを継承しなければならないのに、ここにはないです.なぜですか?
これはspringのMessage ListenerAdapterのおかげです.私たちの業務コードとjmsの結合を実現しました.興味があるのはソースコードを見続けてもいいです.
2、Message ListenerContinerは3つの実装があります.ここではなぜDefault Message ListenerContinerを使用していますか?Simplession Message ListenerContinerではなく、Simplessage Continerを使用していますか?
SimpleMessage ListenerContinerでは、connection.set Exception Listenerを呼び出していますので、jbossが提供するjmsはサポートされていません.
3、Default Message ListenerContinerはマルチスレッドを同時に消費する機能を提供していますが、デフォルトのconcurrentConsmers=1は、それを大きく設定してもいいですか?
jbossでは、一つのconnectionは一つのセッションしか生成できないので、これはconcurrentConsermersを1に設定することができます.
springを利用してメッセージの非同期送信を行う.
これは多くの文章が紹介されています.ここでは多く述べません.
spring対jmsのパッケージにより実現できます.
まず、jbossにConnection Factoryを配置します.Queue
jms-ds.xml
<connection-factories>
<tx-connection-factory>
<jndi-name>TestConnectionFactory</jndi-name>
<use-java-context>false</use-java-context>
<xa-transaction/>
<rar-name>jms-ra.rar</rar-name>
<connection-definition>org.jboss.resource.adapter.jms.JmsConnectionFactory</connection-definition>
<config-property name="SessionDefaultType" type="java.lang.String">javax.jms.Queue</config-property>
<config-property name="JmsProviderAdapterJNDI" type="java.lang.String">java:/DefaultJMSProvider</config-property>
<max-pool-size>20</max-pool-size>
<security-domain-and-application>JmsXARealm</security-domain-and-application>
</tx-connection-factory>
</connection-factories>
jms-destination.xml<mbean code="org.jboss.mq.server.jmx.Queue" name="jboss.mq.destination:service=Queue,name=TestQueue">
<depends optional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager</depends>
</mbean>
以上の配置が完了すると、キューに非同期のメッセージを受信し、送信することができます.
springを利用してメッセージの非同期受信を行う.
springでの配置は以下のbeanです.
<bean class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory">
<bean class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>TestConnectionFactory</value>
</property>
</bean>
</property>
<property name="destination">
<bean class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>queue/TestQueue</value>
</property>
</bean>
</property>
<property name="messageListener">
<bean class="org.springframework.jms.listener.adapter.MessageListenerAdapter">
<property name="delegate">
<bean class="com.test.message.ObjectMessageListener"/>
</property>
</bean>
</property>
</bean>
Object Message Listenerの実現
public class ObjectMessageListener {
public void handleMessage(Object obj) {
// obj
}
}
これで、メッセージの非同期消費が実現できる.いくつかの疑問:
1、皆さんはObject Message ListenerというListenerの書き方に変なものがあるかもしれませんが、普通のListenerはjmsのMessage Listenerを継承しなければならないのに、ここにはないです.なぜですか?
これはspringのMessage ListenerAdapterのおかげです.私たちの業務コードとjmsの結合を実現しました.興味があるのはソースコードを見続けてもいいです.
2、Message ListenerContinerは3つの実装があります.ここではなぜDefault Message ListenerContinerを使用していますか?Simplession Message ListenerContinerではなく、Simplessage Continerを使用していますか?
SimpleMessage ListenerContinerでは、connection.set Exception Listenerを呼び出していますので、jbossが提供するjmsはサポートされていません.
3、Default Message ListenerContinerはマルチスレッドを同時に消費する機能を提供していますが、デフォルトのconcurrentConsmers=1は、それを大きく設定してもいいですか?
jbossでは、一つのconnectionは一つのセッションしか生成できないので、これはconcurrentConsermersを1に設定することができます.
springを利用してメッセージの非同期送信を行う.
これは多くの文章が紹介されています.ここでは多く述べません.