虽然jms的实现有很多,但比较流行和常用的就是activeMQ,所以,以activeMQ(下称mq)为例:
一、架设mq中间件
下载activeMQ:http://activemq.apache.org/
解压后,有个类似tomcat的目录结构,运行bin/activemq.bat即可启动mq服务器端(消息中间件)。
启动消息里,你能找到mq的管理地址和演示地址,一般是
http://0.0.0.0:8161/admin
http://0.0.0.0:8161/demo
0.0.0.0替换成mq所在机器的实际ip地址
ps:我们可以把mq认为是一个基于jetty的,包含连接管理的消息队列容器。mq可以包含多条消息队列:包括点对点的queueu和广播式的topic方式。
二、客户端写法
1、点对点队列
发送
//连接与会话,信息传输不可少的东东,连接创建会话,会话创建出消息,生产者与制造者
ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://Cat-PC:31616");
Connection conn = factory.createConnection();
conn.start();
Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
//queue为消息目标,或者说是通道,类似邮箱服务器一样的东西
Queue queue = new ActiveMQQueue("hxm");
MessageProducer mProducer = session.createProducer(queue);
for(int i = 0;i<10;i++){
String msgsString = "hello,jms" + i;
Message message = session.createTextMessage(msgsString);
mProducer.send(message);
System.out.println("send:"+msgsString);
}
session.close();
conn.stop();
conn.close();
接收
ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:31616");
Connection conn = factory.createConnection();
conn.start();
Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
//queue为消息目标,或者说是通道,类似邮箱服务器一样的东西
Queue queue = new ActiveMQQueue("hxm");
MessageConsumer mConsumer = session.createConsumer(queue);
while(true){
TextMessage msg = (TextMessage) mConsumer.receive();
System.out.println("recive:" + msg.getText());
}
2、topic方式接收(发送和点对点差不多)
public class TopicReciver {
public static void main(String[] args) throws JMSException {
ConnectionFactory connFactory = new ActiveMQConnectionFactory("tcp://localhost:31616");
Connection conn = connFactory.createConnection();
Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
Topic topic = session.createTopic("ActiveMQ.Advisory.Producer.Queue.hxm");
MessageConsumer consumer = session.createConsumer(topic);
consumer.setMessageListener(new MsgListener());
conn.start();
}
}
class MsgListener implements MessageListener{
@Override
public void onMessage(Message msg) {
try {
if(msg instanceof TextMessage){
TextMessage tmsg = (TextMessage) msg;
System.out.println(tmsg.getText());
}else{
System.out.println(msg);
}
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
三、activeMQ安全配置
配置activemq.xml
...
<transportConnectors>
<transportConnector name="openwire" uri="tcp://localhost:61616" discoveryUri="multicast://default"/>
<transportConnector name="ssl" uri="ssl://localhost:61617"/>
<transportConnector name="stomp" uri="stomp://localhost:61613"/>
<transportConnector name="xmpp" uri="xmpp://localhost:61222"/>
</transportConnectors>
<plugins>
<simpleAuthenticationPlugin>
<!--该部分是配置发送或接受的用户名和密码,以及所处的用户组-->
<users>
<authenticationUser username="system" password="manager" groups="users,admins"/>
<authenticationUser username="user" password="password" groups="users"/>
<authenticationUser username="guest" password="password" groups="guests"/>
</users>
</simpleAuthenticationPlugin>
<!-- use JAAS to authenticate using the login.config file on the classpath to configure JAAS -->
<!--以下采用的是JAAS的管理机制来配置各种角色的权限-->
<jaasAuthenticationPlugin configuration="activemq-domain" />
<!-- lets configure a destination based authorization mechanism -->
<authorizationPlugin>
<map>
<authorizationMap>
<authorizationEntries>
<!-->表示通配符,例如USERS.>表示以USERS.开头的主题,>表示所有主题,read表示读的权限,write表示写的权限,admin表示角色组-->
<authorizationEntry queue=">" read="admins"
write="admins" admin="admins" />
<authorizationEntry queue="USERS.>"
read="users" write="users" admin="users" />
<authorizationEntry queue="GUEST.>"
read="guests" write="guests,users" admin="guests,users" />
<authorizationEntry topic=">" read="admins,users"
write="admins" admin="admins" />
<authorizationEntry topic="USERS.>"
read="users" write="users" admin="users" />
<authorizationEntry topic="GUEST.>"
read="guests" write="guests,users" admin="guests,users" />
<authorizationEntry
topic="ActiveMQ.Advisory.>" read="guests,users"
write="guests,users" admin="guests,users" />
</authorizationEntries>
<!-- let's assign roles to temporary destinations. comment this entry if we don't want any roles assigned to temp destinations -->
<tempDestinationAuthorizationEntry>
<tempDestinationAuthorizationEntry
read="tempDestinationAdmins" write="tempDestinationAdmins"
admin="tempDestinationAdmins" />
</tempDestinationAuthorizationEntry>
</authorizationMap>
</map>
</authorizationPlugin>
</plugins>
...
加入plugins中的内容到activemq.xml中
然后你在生产者和发送者连接的地方:
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("guest", "password", url);
该连接表示用户以guest用户登陆
标记你的连接用户名和密码,activemq会根据你的用户来判断该用户拥有什么权限