欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

jboss下spring的jms配置 博客分类: java  

程序员文章站 2024-02-24 20:28:46
...

1。首先配置jboss的jbossmq,启动jboss(启动jboss时会同时启动mq,使用其他mq时类似,需要配置启动mq)


2。在spring中进行消息发送接收者的相关配置(封装了jms发送与接收的模版)

    <!--  jndi配置 -->
    <bean id="jndiTemplate"
        class="org.springframework.jndi.JndiTemplate">
        <property name="environment">
            <props>
                <prop key="java.naming.factory.initial">
                    org.jnp.interfaces.NamingContextFactory
                </prop>
                <prop key="java.naming.provider.url">172.16.13.79</prop>
                <prop key="java.naming.factory.url.pkgs">
                    org.jnp.interfaces:org.jboss.naming
                </prop>
            </props>
        </property>
    </bean>
    <!-- jms连接工厂配置 -->
    <bean id="jmsConnectionFactory"
        class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiTemplate">
            <ref bean="jndiTemplate" />
        </property>
        <property name="jndiName">
            <value>ConnectionFactory</value>
        </property>
    </bean>
    <!-- 目标队列配置 -->
    <bean id="destination"
        class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiTemplate">
            <ref bean="jndiTemplate" />
        </property>
        <property name="jndiName">
            <value>queue/A</value>
        </property>
    </bean>

    <!-- 生产者配置 -->
    <bean id="messageProducer"
        class="com.xhb.test.jms.MessageProducer">
        <property name="template" ref="jmsQueueTemplate" />
        <property name="destination" ref="destination" />
    </bean>

<!-- jms模版 -->
    <bean id="jmsQueueTemplate"
        class="org.springframework.jms.core.JmsTemplate102">
        <property name="connectionFactory">
            <ref bean="jmsConnectionFactory" />
        </property>
        <property name="defaultDestination" ref="destination" />
        <property name="pubSubDomain">
            <value>false</value>
        </property>
        <property name="receiveTimeout">
            <value>20000</value>
        </property>
    </bean>

    <!-- 监听器 -->
    <bean id="messageListener"
        class="com.xhb.test.jms.MessageConsumer">
    </bean>

    <!-- 监听器容器 -->
    <bean id="listenerContainer"
        class="org.springframework.jms.listener.DefaultMessageListenerContainer">
        <property name="connectionFactory" ref="jmsConnectionFactory" />
        <property name="destination" ref="destination" />
        <property name="messageListener" ref="messageListener" />
    </bean>

 

 

3。原生使用的jms方式如下

(1) 得到一个JNDI初始化上下文(Context);

例子对应代码:

Properties props = new Properties();
props.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
props.setProperty("java.naming.provider.url", "localhost:1099");
props.setProperty("java.naming.factory.url.pkgs", "org.jboss.naming");
InitialContext ctx = new InitialContext(props);

注意:可以写在代码中,也可以写在jndi.properties文件中.

(2) 根据上下文来查找一个连接工厂TopicConnectFactory/ QueueConnectionFactory (有两种连接工厂,根据是topic/queue来使用相应的类型);

例子对应代码:

QueueConnectionFactory qcf =(QueueConnectionFactory) ctx.lookup("ConnectionFactory");

(3) 从连接工厂得到一个连接(Connect 有两种[TopicConnection/ QueueConnection]);

例子对应代码:conn = qcf.createQueueConnection();

(4) 通过连接来建立一个会话(Session);

例子对应代码:session= conn.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);

这句代码意思是:建立不需要事务的并且能自动接收Java消息服务收条的会话,在非事务Session 中,JMS消息传递的方式有三种:
Session.AUTO_ACKNOWLEDGE :当客户机调用的receive方法成功返回,或当MessageListenser 成功处理了消息,session将会自动接收消息的收条。

Session.CLIENT_ACKNOWLEDGE :客户机通过调用消息的acknowledge方法来接收消息。接收发生在session层。接收到一个被消费的消息时,将自动接收该session已经 消费的所有消息。例如:如果消息的消费者消费了10条消息,然后接收15 个被传递的消息,则前面的10 个消息的收据都会在这15 个消息中被接收。

Session.DUPS_ACKNOWLEDGE :指示session缓慢接收消息。

session是一个非常核心的概念,在一次session(会话中)可以发送消息,也可以消费消息,消费消息时既可以主动去消费也可以设置针对消息队列的监听,被动触发处理,设置监听示例如下。

            QueueReceiver reciver = session.createReceiver(queue);
            reciver.setMessageListener(listener);

(5) 查找目的地(Topic/ Queue);

例子对应代码:queue =(Queue) ctx.lookup("queue/jms");

(6) 根据会话以及目的地来建立消息制造者(TopicPublisher/QueueSender)和消费者(TopicSubscriber/QueueReceiver).
例子对应代码:

msg = session.createTextMessage("你好,好久不见!");
sender = session.createSender(queue);
sender.send(msg);