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 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)