activemq为生产者、消费者设置连接密码以及消费者消息的签收方式

    技术2022-07-10  126

    使用java连接activemq的时候,我们默认的使用的都是默认用户密码和链接地址:

     ConnectionFactory factory=new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER,                 ActiveMQConnection.DEFAULT_PASSWORD, ActiveMQConnection.DEFAULT_BROKER_URL);

    这样是不安全的,如何为activemq的生产者、消费者设置连接用户名和密码呢?

    修改activemq.xml配置,需要新增一个插件,在<broker>节点里面添加如下内容:

    <plugins> <simpleAuthenticationPlugin> <users> <authenticationUser username="XXXXX" password="XXXXX" groups="users,admins"/> </users> </simpleAuthenticationPlugin> </plugins>

    连接的时候使用下面的方式就行了:

    ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("XXXXX","XXXXX",BROKER_URL); //第一个参数为用户名,第二个参数为密码

    在activemq的生产者一端有下面的代码,是我们最常使用的:

     Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);

    这里的两个参数,第一个代表的是是否使用事务,如果设置为true,则我们需要在最后设置session.commit()方法,不然你的消息并不会发送到队列里面去。另外一个Session.AUTO_ACKNOWLEDGE表示消费者收到了消息后自动的给activemq发送收到消息的回执,ac即accept,knowledge这里译为消息的意思,这两个参数都是针对生产者来设置的,对于消费者的代码没有强制的要求,设置了也不起作用,但是为了代码的同一,还是建议保持一致。

    另外,还有Session.CLIENT_ACKNOWLEDGE,这里就表示需要消费者一端的代码主动/手工去调用签收消息的方法来确认消息的签收了,假设原先使用Session.AUTO_ACKNOWLEDGE时你是这样接受消息的:

     while(true){                 TextMessage message = (TextMessage)consumer.receive();//receive(100000)每100s接受一次              System.out.println("接收到了消息:"+message.getText()+"第"+count+"次");              count++;     }

    此时就需要改为:

     while(true){                 TextMessage message = (TextMessage)consumer.receive();//receive(100000)每100s接受一次              System.out.println("接收到了消息:"+message.getText()+"第"+count+"次");              count++;              message.acknowledeg();     }

    即需要调用message.acknowledeg();来确认消息的签收,不然,activemq并不会记录该消息被消费了。

    Processed: 0.012, SQL: 9