jms总结

虽然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会根据你的用户来判断该用户拥有什么权限




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值