ActiveMQ结合spring的JmsTemplate发送消息问题

JacketLiao 2016-08-07 01:28:06
最近在学习ActiveMQ,我使用了spring整合ActiveMQ。在测试过程中发现一个问题:如果ActiveMQ服务器没有启动,这个时候消息生产者使用JmsTemplate 向ActiveMQ服务器送消息,程序没有报连接异常,而是一直处于等待中。

spring xml配置
 <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<!-- 这个connectionFactory对应的是我们定义的Spring提供的那个ConnectionFactory对象 -->
<property name="connectionFactory" ref="connectionFactory"/>
<property name="receiveTimeout" value="100"/>
</bean>
<!-- 真正可以产生Connection的ConnectionFactory,由对应的 JMS服务厂商提供-->
<bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="failover:(tcp://localhost:61616)"/>
</bean>
<!-- Spring用于管理真正的ConnectionFactory的ConnectionFactory -->
<bean id="connectionFactory" class="org.springframework.jms.connection.SingleConnectionFactory">
<!-- 目标ConnectionFactory对应真实的可以产生JMS Connection的ConnectionFactory -->
<property name="targetConnectionFactory" ref="targetConnectionFactory"/>
</bean>

生产者代码如下:
import javax.annotation.Resource;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;

import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.stereotype.Component;

@Component(value="MessageSender")
public class MessageSender {
@Resource(name="jmsTemplate")
private JmsTemplate jmsTemplate;

public void sendMessage(Destination destination, final String message) {
System.out.println("---------------生产者发送消息-----------------");
jmsTemplate.send(destination, new MessageCreator() {
public Message createMessage(Session session) throws JMSException {
return session.createTextMessage(message);
}
});
}
}

而如果使用ActiveMQ 的jms发送模式就没有这样的问题,会直接报连接异常:
javax.jms.JMSException: Could not connect to broker URL: tcp://localhost:61616. Reason: java.net.ConnectException: Connection refused: connect
at org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:36)
at org.apache.activemq.ActiveMQConnectionFactory.createActiveMQConnection(ActiveMQConnectionFactory.java:358)
at org.apache.activemq.ActiveMQConnectionFactory.createActiveMQConnection(ActiveMQConnectionFactory.java:303)
at org.apache.activemq.ActiveMQConnectionFactory.createConnection(ActiveMQConnectionFactory.java:243)
at com.douples.client.JMSProducer.main(JMSProducer.java:37)
Caused by: java.net.ConnectException: Connection refused: connect
jms发送模式 代码如下:
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.MessageProducer;
import javax.jms.Session;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;

public class JMSProducer {

//默认连接用户名
private static final String USERNAME = ActiveMQConnection.DEFAULT_USER;
//默连接密码
private static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;
// 连接地址
private static final String BROKEURL = "tcp://localhost:61616";

public static void main(String[] args) throws JMSException {
//连接工厂
ConnectionFactory connectionFactory;
//连接
Connection connection = null;
//会话 接受或者发送消息的线程
Session session = null;
//消息的目的地
Destination destination;
//消息生产者
MessageProducer messageProducer;
//实例化连接工厂
connectionFactory = new ActiveMQConnectionFactory(JMSProducer.USERNAME, JMSProducer.PASSWORD, JMSProducer.BROKEURL);
try {
// 获取连接
connection = connectionFactory.createConnection();
// 启动连接
connection.start();
// 创建session
session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
// 创建一个名称为fire.queue的消息队列
destination = session.createQueue("fire.queue");
// 创建消息生产者
messageProducer = session.createProducer(destination);
// 发送消息
sendMessage(session, messageProducer);
// 提交会话
session.commit();

} catch (Exception e) {
e.printStackTrace();
}finally{
if (null != session) {
session.close();
}
if(connection != null){
try {
connection.close();
} catch (JMSException e) {
e.printStackTrace();
}
}
}

}
/**
* 发送消息
* @param session
* @param messageProducer 消息生产者
* @throws Exception
*/
public static void sendMessage(Session session,MessageProducer messageProducer) throws Exception{
for (int i = 0; i < 2; i++) {
// 创建MapMessage消息
MapMessage mapMessage = session.createMapMessage();
mapMessage.setString("dst", "invest");
mapMessage.setString("isFirst", "1");
// json 格式数据
mapMessage.setString("data", "");
// 通过消息生产者发出消息
messageProducer.send(mapMessage);
}

}
}

请问各位大神使用spring的JmsTemplate 怎么设置连接超时?
...全文
504 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_35058425 2016-09-05
  • 打赏
  • 举报
回复
<property name="brokerURL" value="failover:(tcp://localhost:61616)"/> private static final String BROKEURL = "tcp://localhost:61616"; 配置不一样造成的 failover:默认会不停重试连接 ,如果没有集群的话改成 "tcp://localhost:61616"; 就可以了 。 使用failover方式的还没有解决,我遇见的也是这个问题

50,535

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧