1、对于参数配置
可以在web-info目录下新建一个properties文件,可以自行配置jms的相关参数
下面配置中指定了多个队列的名称
activemq.url=tcp://192.168.4.123:61616
activemq.queueName=queue_2
activemq.queueStateName=queue_1
jms.username=***
jms.password=***
2、java代码读取文件
在java类上使用注解读取路径下的文件
//import org.springframework.context.annotation.PropertySource;
@PropertySource("WEB-INF/xxx.properties")
3、读取文件内部的参数
使用注解读取参数
//import org.springframework.beans.factory.annotation.Value;
@Value("${jms.username}")
4、完整实例。(我主要写的jms消费者的代码)
配置类
import org.apache.activemq.ActiveMQConnectionFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.jms.annotation.EnableJms;
import org.springframework.jms.config.DefaultJmsListenerContainerFactory;
@Configuration
@EnableJms
@PropertySource("WEB-INF/xxx.properties")
public class BjhzZCBReceiverConfig {
@Value("${activemq.url}")
private String brokerUrl;
@Value("${jms.username}")
private String username;
@Value("${jms.password}")
private String password;
@Bean
public ActiveMQConnectionFactory receiverActiveMQConnectionFactory() {
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory();
activeMQConnectionFactory.setTrustAllPackages(true);//一般是接收一个实体bean对象作为消息的时候要设置这个值
activeMQConnectionFactory.setBrokerURL(brokerUrl);
activeMQConnectionFactory.setUserName(username);
activeMQConnectionFactory.setPassword(password);
return activeMQConnectionFactory;
}
@Bean
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(receiverActiveMQConnectionFactory());
factory.setSessionTransacted(true);//开启事务
return factory;
}
@Bean
public BjhzZCBReceiver receiver() {
return new BjhzZCBReceiver();
}
}
处理类
import org.apache.activemq.command.ActiveMQMapMessage;
import org.apache.commons.lang.StringUtils;
import org.springframework.context.annotation.PropertySource;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.transaction.annotation.Transactional;
import javax.jms.Message;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
@Transactional
@PropertySource("WEB-INF/xxx.properties")
public class BjhzZCBReceiver {
@JmsListener(destination = "${activemq.queueName}")
public void receive(Message message) {
messageHandler(message, "queueName1");
}
@JmsListener(destination = "${activemq.queueStateName}")
public void receiveState(Message message) {
messageHandler(message, "queueName2");
}
/**
* 处理队列的数据
*
* @param message
*/
public void messageHandler(Message message, String str) {
try {
if (message == null) {
return;
}
if (message instanceof ActiveMQMapMessage) {
//消息类型是map类型,其他类型不一一列举
Map<String, Object> contentMap = ((ActiveMQMapMessage) message).getContentMap();
}
} catch (Exception e) {
Log.error("Activemq接收信息出现错误!");
e.printStackTrace();
}
}
}
---------------------------------------------------------------
更新:2021年9月18日
当activemq消息队列部署机器时,连接地址形式如下
failover:(tcp://localhost:61616,tcp://remotehost:61616)?initialReconnectDelay=100
根据文档:
默认重连次数无限次,并且当程序启动时不能连接到消息队列服务时候,会阻塞无限次重连,导致系统其他业务功能也无法使用。故而有以下解决方式
设置startupMaxReconnectAttempts 参数为一个较小的值,在启动时只连接有限次。之后程序依然后重连服务,但是不会影响业务功能使用。
另, 为 ActiveMQConnectionFactory,设置监听 TransportListener。可输出日志
即,配置如下
failover:(tcp://localhost:61616,tcp://remotehost:61616)?Randomize=false&startupMaxReconnectAttempts=3
监听代码如下:使用方式是jmsTemplate
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.transport.TransportListener;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.jms.annotation.EnableJms;
import org.springframework.jms.config.DefaultJmsListenerContainerFactory;
import org.springframework.jms.connection.SingleConnectionFactory;
import org.springframework.jms.core.JmsTemplate;
import java.io.IOException;
@Configuration
@EnableJms
@PropertySource("xxx.properties")
public class SthxJmsConfig {
@Value(value = "${activemq.url}")
private String mqUrl;
@Value(value = "${jms.username}")
private String username;
@Value(value = "${jms.password}")
private String password;
@Bean
public ActiveMQConnectionFactory connectionFactory() {
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory();
activeMQConnectionFactory.setTrustAllPackages(true);
activeMQConnectionFactory.setBrokerURL(mqUrl);
activeMQConnectionFactory.setUserName(username);
activeMQConnectionFactory.setPassword(password);
activeMQConnectionFactory.setTransportListener(new TransportListener() {
@Override
public void onCommand(Object command) {
}
@Override
public void onException(IOException error) {
Log.error("消息队列服务器连接失败..." + error);
}
@Override
public void transportInterupted() {
Log.warn("transportInterupted -> 消息队列服务器连接发生中断...");
}
@Override
public void transportResumed() {
Log.info("transportResumed -> 消息服务器连接已恢复...");
}
});
return activeMQConnectionFactory;
}
@Bean
public SingleConnectionFactory singleConnectionFactory(ActiveMQConnectionFactory activeMQconnectionFactory) {
SingleConnectionFactory connectionFactory = new SingleConnectionFactory();
//设置目标工厂
connectionFactory.setTargetConnectionFactory(activeMQconnectionFactory);
return connectionFactory;
}
@Bean
public JmsTemplate jmsTemplate(){
JmsTemplate template = new JmsTemplate();
template.setConnectionFactory(connectionFactory());
return template;
}
@Bean
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory());
factory.setConcurrency("1-1");
return factory;
}
}
jsmtemplate 消费者示例如下
@Autowired
private JmsTemplate jmsTemplate;
@JmsListener(destination = "${activemq.queue1}")
public void receiveYwjgYdhc(Message message) {
messageHandler(message);
}
jmsTemplate 发送消息示例如下
jmsTemplate.send(queue_xxzx, new MessageCreator() {
@Override
public Message createMessage(Session session) throws JMSException {
MapMessage mapMessage = session.createMapMessage();
mapMessage.setString("queue", "ddd");
mapMessage.setString("type", "task");
return mapMessage;
}
});