Domanda

Ho la necessità di inviare/ricevere messaggi verso/da diversi argomenti memorizzati su un singolo server JMS.

Vorrei usare JmsTemplate per inviare e MessageListenerContainer per la registrazione di ascoltatori asincroni.

La mia configurazione sembra così:

<bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate">
    <property name="environment">
        <props>
            <prop key="java.naming.factory.initial">xxx</prop>
            <prop key="java.naming.provider.url">yyy</prop>
        </props>
    </property>
</bean>
<bean id="connectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiTemplate" ref ="jndiTemplate"/>
        <property name="jndiName" value="TopicConnectionFactory"/>
    </bean>

    <bean id="singleConnectionFactory" class="org.springframework.jms.connection.SingleConnectionFactory">
        <constructor-arg ref="connectionFactory"/>
    </bean>

    <bean id="tosJmsTemplate" class="org.springframework.jms.core.JmsTemplate">
        <property name="connectionFactory" ref="singleConnectionFactory"/>
        <property name="destinationResolver" ref="destinationResolver"/>
        <property name="pubSubDomain" value="true"/>
    </bean>

Per quanto ho capito, il singleConnectionFactory, restituendo sempre la stessa istanza di connessione, aiuta a ridurre il sovraccarico di creare e chiudere una connessione ogni volta a jmsTemplate bisogni (ad esempio) per inviare/ricevere un messaggio (come sarebbe quando si utilizza un normale ConnectionFactory).

La mia prima domanda è: se creo più jmsTemplate(s), possono tutti condividere un ref su a singleConnectionFactory? O devono ricevere un'istanza distinta ciascuno (singleConnectionFactory1, singleConnectionFactory2, eccetera)?

Leggendo l'API per SingleConnectionFactory, Ho trovato questo:

Si noti che i contenitori per listener di messaggi di Spring supportano l'uso di un condiviso Connection All'interno di ogni istanza del contenitore dell'ascoltatore. Usando SingleConnectionFactory In combinazione ha solo senso per la condivisione di una singola connessione JMS su più contenitori per ascoltatori.

Questo mi sembra un po 'criptico. Per quanto ne so, è possibile registrare solo 1 ascoltatore per MessageListenerContainer, quindi non capisco fino a che punto è una connessione condivisa.

Supponiamo di voler registrare n ascoltatori: dovrò ripetere e volte qualcosa del genere:

<bean 
    class="org.springframework.jms.listener.SimpleMessageListenerContainer"> 
    <property name="connectionFactory" ref="connectionFactory" /> 
    <property name="destinationName" value="destX" /> 
    <property name="messageListener" ref="listener1outOfN" /> 
</bean> 

Quante connessioni vengono create in tali caso da ConnectionFactory? Uno per ogni ascoltatore o solo un pool di connessioni? E se fornisca il SimpleMessageListenerContainer-S con un ref a singleConnectionFactory?

Qual è l'approccio migliore (dal punto di vista delle esibizioni, ovviamente) in questo caso?

Nessuna soluzione corretta

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top