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




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ActiveMQ安装 : 1.下载:http://activemq.apache.org/download.html 最新Windows版本 2.配置jdk环境,解压ActiveMQ到本地 3.启动ActiveMQ服务器: 32位机 : 直接运行\bin\win32\activemq.bat 64位机 : 直接运行\bin\win64\activemq.bat 4.打开ActiveMQ消息管理后台系统 http://localhost:8161/admin/ 参考文章为 : HelloWorld : http://blog.csdn.net/baggio7095586/article/details/5708519 进阶 :http://haohaoxuexi.iteye.com/blog/1893038 helloworld阶段 : 一个发送消息的程序,一个接收消息的程序..实现最简单的JMS交流... 监听器阶段 : ⑴MessageListener,最简单的监听器..只是拿来监听接收信息的 ⑵SessionAwareMessageListener,有个session的参数..可以拿来对接收到的信息再做响应.. ⑶MessageListenerAdapter,将消息委托交给一个普通的java类来处理.. 转化器阶段 : 实现MessageConverter接口来转换JMS对象与java对象.. 其实在使用MessageListenerAdapter时,Spring默认为我们提供了SimpleMessageConverter转换器.. 事务(无代码): 在Spring整合JMS的应用中,如果我们要进行本地的事务管理的话非常简单,只需要在定义对应的消息监听容器时指定其sessionTransacted属性为true,如: <bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> <property name="connectionFactory" ref="connectionFactory" /> <property name="destination" ref="queueDestination" /> <property name="messageListener" ref="consumerMessageListener" /> <property name="sessionTransacted" value="true"/> </bean> 该属性值默认为false,这样JMS在进行消息监听的时候就会进行事务控制,当在接收消息时监听器执行失败时JMS就会对接收到的消息进行回滚, 对于SessionAwareMessageListener在接收到消息后发送一个返回消息时也处于同一事务下,但是对于其他操作如数据库访问等将不属于该事务控制。 数据库跟JMS挂钩的事务先别理..

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值