首先下载ActiveMQ,下载地址:
http://activemq.apache.org/
解压后双击对应操作系统文件夹下activemq.bat启动ActiveMQ服务,打开浏览器地址栏输入http://localhost:8161/登录服务主页,默认登录名/密码为admin/admin,可查看服务运行详细情况。
修改管理界面端口号:默认端口号为8161,打开根目录下conf文件夹jetty.xml,修改port属性值可修改端口号。
<bean id="jettyPort" class="org.apache.activemq.web.WebConsolePort" init-method="start">
<!-- the default port number for the web console -->
<property name="host" value="0.0.0.0"/>
<property name="port" value="8161"/>
</bean>
点击Queues查看点对点消息队列,点击Topics查看广播消息队列。
本篇先做点对点方式的demo。
项目依赖jar包:
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-spring</artifactId>
<version>5.14.4</version>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-pool</artifactId>
<version>5.14.4</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
<version>${spring.version}</version>
</dependency>
测试类:
public class MessageSender {
private final JmsTemplate jmsTemplate;
private final Destination destination;
public MessageSender(final JmsTemplate jmsTemplate, final Destination destination) {
this.jmsTemplate = jmsTemplate;
this.destination = destination;
}
@Scheduled(cron = "0 * * * * ?")
public void send() {
try {
jmsTemplate.setDefaultDestination(destination);
jmsTemplate.convertAndSend("message");
System.out.println("发送消息 : " + "message");
} catch (Exception e) {
e.printStackTrace();
}
}
}
public class JmsMessageListener implements MessageListener {
public void onMessage(Message message) {
if (message instanceof TextMessage) {
TextMessage textMessage = (TextMessage) message;
try {
String text = textMessage.getText();
System.out.println("接收到消息: " + text);
} catch (JMSException e) {
e.printStackTrace();
}
}
}
}
spring-jms.xml配置文件:
<bean id="jmsFactory" class="org.apache.activemq.pool.PooledConnectionFactory"
destroy-method="stop">
<property name="connectionFactory">
<bean class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="failover:(tcp://192.168.2.24:61616)?timeout=5000"/>
<property name="userName" value="admin" />
<property name="password" value="admin" />
<!-- 是否异步发送 -->
<property name="useAsyncSend" value="true" />
</bean>
</property>
</bean>
<!--这个是队列目的地,点对点的-->
<bean id="queueDestination" class="org.apache.activemq.command.ActiveMQQueue">
<constructor-arg value="COMMON_QUEUE_CHANNEL"/>
</bean>
<!-- Spring topicJmsTemplate -->
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="jmsFactory" />
<property name="sessionTransacted" value="true" />
<property name="explicitQosEnabled" value="true" />
<property name="receiveTimeout" value="30000" />
<property name="defaultDestination" ref="queueDestination" />
<!--区别它采用的模式为false是p2p;true是订阅 -->
<property name="pubSubDomain" value="false" />
</bean>
<!-- 消息监听器 -->
<bean id="jmsMessageListener" class="activemq.publisher.JmsMessageListener">
</bean>
<!-- Message Sender Definition -->
<bean id="messageSender" class="activemq.publisher.MessageSender">
<constructor-arg index="0" ref="jmsTemplate" />
<constructor-arg index="1" ref="queueDestination" />
</bean>
<!-- 消息监听容器 -->
<bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="jmsFactory" />
<property name="destination" ref="queueDestination" />
<property name="messageListener" ref="jmsMessageListener" />
</bean>
启动服务器。
在实际项目中,读取中间件中消息后可能会有返回消息,可增加manager:
public class JmsManager {
@Autowired
private JmsTemplate jmsTemplate;
public void sendMessageToQueue(Destination destination, final String sendMessage) throws JMSException {
jmsTemplate.send(destination, new MessageCreator() {
@Override
public Message createMessage(Session session) throws JMSException {
Message message = session.createTextMessage(sendMessage);
return message;
}
});
}
}
通过jmsTemplate即时返回消息,在listener中增加调用:
jmsManager.sendMessageToQueue(destination,sendMessage);
向指定队列发送返回消息。
TCP默认端口号61616,可打开安装目录conf文件夹,打开activemq.xml文件,找到:
<transportConnectors>
<!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
<transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
</transportConnectors>
修改name=”openwrite”端口号61616。