使用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并不会记录该消息被消费了。