X_newman 2009-09-06 14:32
浏览 444
已采纳

spring+Jms开发topic类型消息时重复接收消息解决

参照javaeyes前辈做的jms配置如下:
tomcat下Context.xml配置:

WEB-INF/web.xml

<Resource name="jms/ConnectionFactory"    
    auth="Container"      
    type="org.apache.activemq.ActiveMQConnectionFactory"    
    description="JMS Connection Factory"  
    factory="org.apache.activemq.jndi.JNDIReferenceFactory"    
    brokerURL="vm://localhost"    
    brokerName="LocalActiveMQBroker"/>  
   <Resource name="jms/Queue" 
        auth="Container" 
        type="org.apache.activemq.command.ActiveMQQueue"  
        description="my Queue"  
        factory="org.apache.activemq.jndi.JNDIReferenceFactory"  
        physicalName="FOO.BAR"/>  
   <Resource name="jms/JMSChat" 
              auth="Container" 
              type="org.apache.activemq.command.ActiveMQTopic" 
              factory="org.apache.activemq.jndi.JNDIReferenceFactory" 
              physicalName="stockQuoteTopic"/>


spring配置:
<!-- JMS整合 -->
class="org.springframework.jndi.JndiObjectFactoryBean">

<bean id="jmsTopic"
    class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="java:comp/env/jms/JMSChat"></property>
</bean>

<bean id="jmsTemplate"
    class="org.springframework.jms.core.JmsTemplate">
    <property name="connectionFactory" ref="jmsConnectionFactory"></property>
    <property name="defaultDestination" ref="jmsTopic"></property>
</bean>

     <!-- 在jmsTemplate中指明发送目的地即jmsTopic队列 -->
<bean id="sender" class="com.xch.websecurity.util.message.Sender">
    <property name="jmsTemplate" ref="jmsTemplate"></property>
</bean>

<bean id="receive" class="com.xch.websecurity.util.message.Receiver"></bean>

 <!-- 指明了jmsQueue队列的接收监听器 -->
<bean id="listenerContainer"
    class="org.springframework.jms.listener.DefaultMessageListenerContainer">
    <property name="connectionFactory" ref="jmsConnectionFactory"></property>
    <property name="destination" ref="jmsTopic"></property>
    <property name="messageListener" ref="receive"></property>
</bean>

com.xch.websecurity.util.message.Sender类代码:
public class Sender {
private JmsTemplate jmsTemplate;
public void setJmsTemplate(JmsTemplate jmsTemplate) {
this.jmsTemplate = jmsTemplate;
}

public void send(final String text){
    System.out.println("---Send:"+text);
    jmsTemplate.send(new MessageCreator(){
        public Message createMessage(Session arg0) throws JMSException {
            return arg0.createTextMessage(text);
        }   
    });
}
 }

com.xch.websecurity.util.message.Receiver代码:
public class Receiver implements MessageListener {
public void onMessage(Message message) {
if (message instanceof TextMessage) {
TextMessage text = (TextMessage) message;
try {
System.out.println("ReceiveJms:" + text.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
}
}

servlet相关代码:
String Text = request.getParameter("text");
sender.send(Text);
System.out.println("asdfasdf");

运行结果:
第一次:
---Send:uhkjlkj
asdfasdf
ReceiveJms:uhkjlkj
ReceiveJms:uhkjlkj
第二次:
---Send:iljlkjkl
ReceiveJms:iljlkjkl
ReceiveJms:iljlkjkl
ReceiveJms:iljlkjkl
asdfasdf
第三次:ReceiveJms:iljlkjkl依次递增打印
而把
java:comp/env/jms/JMSChat换为java:comp/env/jms/Queue
的点对点配置没错 就是topic方式是出现这问题
[b]问题补充:[/b]
我在另一个应用B里配置了同样的代码,都如下:

class="org.springframework.jndi.JndiObjectFactoryBean">

<bean id="jmsTopic"
    class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="java:comp/env/jms/JMSChat"></property>
</bean>

<bean id="jmsTemplate"
    class="org.springframework.jms.core.JmsTemplate">
    <property name="connectionFactory" ref="jmsConnectionFactory"></property>
    <property name="defaultDestination" ref="jmsTopic"></property>
</bean>

<!-- 在jmsTemplate中指明发送目的地即jmsTopic队列 -->


<bean id="receive" class="com.xch.websecurity.util.message.Receiver"></bean>

 <!-- 指明了jmsQueue队列的接收监听器 -->
<bean id="listenerContainer"
    class="org.springframework.jms.listener.DefaultMessageListenerContainer">
    <property name="connectionFactory" ref="jmsConnectionFactory"></property>
    <property name="destination" ref="jmsTopic"></property>
    <property name="messageListener" ref="receive"></property>
</bean>

可是B还是收不到我看了http://www.iteye.com/topic/234101的说连接到同一服务器就ko啦!~~我连接的jndi名都一样的就是收不到

  • 写回答

2条回答 默认 最新

  • wanghaolovezlq 2009-09-06 23:03
    关注
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题