Activemq点对点模式

首先下载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&amp;wireFormat.maxFrameSize=104857600"/>
    <transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
    <transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
    <transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
    <transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
</transportConnectors>

修改name=”openwrite”端口号61616。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值