消息队列与JMS

1、消息队列

当一个应用的数据量小的时候,直接对使用java方法去调用数据库,数据库和虚拟机(jvm)完全是撑得住的,但是当请求变多了之后,同一个数据库需要应付多方不同服务的请求,就会造成数据处理问题和性能问题。这时候就需要拆分了,不同的系统不同的业务请求不同的数据库,系统间有交集的话就使用web服务网络通信而不再使用java方法。一般来说都是同步通信,一个系统请求另一个系统,如果里一个系统一直不响应这个请求就会一直等待,发送请求的另一端耶无法结束,效率很低。这时候就需要异步通信来解决两边工作不统一的情况,使用消息队列(MQ)让双方定义好相同的消息格式(消息发送者需要知道如何构造消息,消息接收者需要知道如何解析消息),这样一方就只要将信息发到消息队列里面,另一方去消息队列里面读取就好了,互不影响工作。

2、JMS(Java Message Service)

用生产-消费者模型来模拟MQ,生产消息的一方提供发送消息方法,消费消息的一方提供接受消息方法,而消息队列就是消息的中间站。那要和中间站通信才能够发送或者接收消息,那么想到发送和接收消息肯定是在一个会话中,而session会话是可以用来创建消息的,所以使用session来创建生产者和消费者并且产生消息,而session又是通过connection来创建。而相关的配置信息就放在web配置文件里面,然后通过JDIN(JNDI可以把java应用程序访问数据库管理和配置交给存放java应用的服务器(tomcat))获取到ConnectionFactory,获取到配置文件产生connection.。

Context cxt = new InitialContext(properties);

ConnectionFactory factory = cxt.lookup("SomeFactory");

Connection conn = faction.creatConnection();

较为常用的有Poin to Poin(点对点模型),point to point模型为一个client对应一个Topic接收者,接收者为一个平台,消费者(clientOther)可以订阅此平台,就可以接收到某一个client的消息,通过Subscrip来获取Destination的配置信息。Destination(Topic/Queue)可以通过配置管理的对象,而MessageCustomer可以为普通的消费者,也可以为订阅者。

//从配置文件获取Factory和Queue(Destination)
Context ctx = new InitialContext(properties);
queueConnection queueConnFactory = ctx.lookup("SomeFactory");
Queue sentQueue = (Queue)cxt.lookup("sentQueue");
Queue receiveQueue = (Queue)cxt.lookup("receiveQueue");

//ConnectionFactory产生Connection
Connection coon = factory.creatConnection();
//Connection 产生 Session
QueueSession  session = con.createQueueSession(false,Session.AUTO_ACKNOWLEDGE);

//用session 创建消息生产者并发送消息
 MessageProduct producter = session.createProducer(SentQueue);
 TextMeassage textMsg = session.createMeassage("SomeMsg");
 producter.send(textMsg);

//用session 创建消息消费者并接收消息消息
MessageConsumer consumer = session.createConsumer(receiveQueue);
TextMessage invMsg = (TextMessage)consumer.receive(); 
String txt = invMsg.getText();

然后我们就会想到消息中间件的组成,又broker来做消息的服务器为server来提供消息,Producter来负责产生业务逻辑的消息并负责发送,Customer负责接收消息,Topic就是发布的消息的统一汇集地,不同的Producter将消息发送于此,然后经过MQ之手发送到订阅消息的用户机上。Queue是特定的生产者像Queue发送消息,然后会由特定的消费者来接收消息。最后还剩Message消息体这个被传输的数据包。

猜你喜欢

转载自blog.csdn.net/LCF_lxf_ldy/article/details/82716349