快速浏览JMS(Java消息服务)常见问题面试问题和答案。 2020年以来的最新问题已添加到列表中。
1.简介
在本教程中,我们将了解2020年常见的JMS面试问题。作为面试的一部分,如果您有6年以上的经验,就有机会在JMS领域提出一些问题。 但是,即使经验不足,也可以将JMS经验作为参考。 采访者将检查消息传递是企业Java开发的关键方面。
JMS是一种流行的开源Messaging API,许多供应商(例如 Apache Active MQ , Websphere MQ , Sonic MQ提供了Java消息传递API或JMS的实现。
通常,任何面试都是从基础开始的。 如果所有问题都得到正确回答,那么我们将继续研究基于JMS体验项目的问题。
基础知识是什么? 什么是队列? 什么是发布者? 什么是订户? 什么是发布者和订阅者模型? 如何配置MQ?
下一级别意味着对实施JMS概念的项目有疑问吗?
2. JMS面试问题
2.1 WHat是JMS的意思吗?
JMS是Sun Microsystems提供的Java消息服务,可在网络中的计算机之间提供通信。 这是与客户端系统进行交互的标准。 在这里,J2EE应用程序可以使用JMS来创建,发送或接收,阅读消息。
2.2 JMS提供哪些消息传递类型?
JMS附带两种消息。
A)同步
B)异步
2.3同步消息传递类型和异步消息传递类型之间有什么区别?
同步消息:
同步消息传递涉及一个客户端,它等待服务器响应消息。 消息能够双向流动。 从本质上讲,这意味着同步消息传递是双向通信。 即,发件人向接收方发送一条消息,接收方接收到此消息并向发送方回复。 发件人直到收到收件人的答复后才发送其他消息。
异步消息
异步消息传递涉及一个不等待来自服务器的消息的客户端。 事件用于触发来自服务器的消息。 因此,即使客户端关闭,消息传递也将成功完成。 异步消息意味着这是一种单向通信,而通信流只是一种方式。
2.4 JMS提供什么类型的消息传递模型?
它在消息传递世界中主要提供以下两种消息传递模型,并且这两种是常用的。
A)点对点模型
B)发布和订阅模型
点对点模型
P2P消息传递模型由消息发送者,接收者,队列和消息组成。 生成消息的JMS客户端称为发送者。 使用消息的JMS客户端称为接收器。 在P2P模型中,发件人将消息发送到称为队列的目的地。 接收者从同一队列中检索消息
发布和订阅模型
发布/订阅模型由消息发布者,订阅者和主题组成。 消息生产者称为发布者; 消息使用者称为订户。 发布者发送消息而订阅者检索消息的目的地称为主题。 发布/订阅模型基于内容层次结构中节点的概念,其中发布者将消息发布到目的地,并且消息将广播到所有注册的订户。
2.5主题和队列有什么区别?
队列意味着一条消息发给一个,并且只有一个可能的订户。 每个用户都有一个话题。 主题针对发布者-订阅者模型,而队列针对点对点。 所有用户都收到相同的已发布消息。
主题:一种发布机制,用于发布传递到多个订户的消息。
2.6 JMS提供程序的用途是什么?
JMS提供程序是一种消息传递系统,它实现JMS接口并提供管理和控制功能。 Java EE平台的实现包括JMS提供程序。 JMS客户端是用Java编程语言编写的程序或组件,它们产生和使用消息。
它还指定了非JMS客户端的加密级别,消息的安全级别和最佳数据类型。
2.7 JMS体系结构中有哪些组件?
消息生产者
消息消费者
JMS消息 管理的JMS对象 JNDI命名服务
2.8举例说明在JMS中使用点对点模型吗?
2.9支持JMS的应用程序需要哪些核心JMS对象?
2.10什么是JMS管理对象?
JMS管理的对象是由管理员创建的,用于使用JMS客户端的预配置JMS对象,并放置在JNDI名称空间中。
2.11 JMS应用程序的重要部分是什么?
连接
届会
信息 消息生产者 讯息使用者 连接工厂和目的地
2.12什么是JMS会话及其用途?
会话是用于生成(生成)和消费(接收)消息的单线程上下文。 JMS会话可以是本地事务,非事务或分布式事务。
用途:
会话有几个目的:
这是一个为消息生产者和消费者服务的工厂。
它提供了提供程序优化的消息工厂。
它支持一系列的交易,这些交易将其生产者和消费者的工作组合成原子单位。 它为消耗的消息和产生的消息定义序列顺序。 它保留消耗的消息,直到被确认为止。 它序列化向其消息使用者注册的消息侦听器的执行。 一个会话可以创建并服务多个消息生产者和使用者。
2.13持久订阅和非持久订阅有什么区别?
持久订阅使订户可以自由地接收来自某个主题的所有消息并永久存储消息,而非持久订阅不能保证在客户端断开与其他用户的连接时其他用户发送的消息,并且这些不存储任何内容。消息。
注意:我们在两种情况下比较了持久订户和非持久订户的性能:持久性消息和非持久性10k大小的消息。 两种情况都使用AUTO_ACKNOWLEDGE确认模式。 我们仅在持久消息的情况下才发现性能影响,这会使传递给持久订户的消息速度降低了约30%。
2.14什么是字节消息?
BytesMessage对象用于发送包含未解释字节流的消息。 它从Message接口继承,并添加一个字节的消息正文。 消息的接收者提供字节的解释。
BytesMessage方法主要基于java.io.DataInputStream和java.io.DataOutputStream中的方法。
此消息类型用于现有消息格式的客户端编码。 如果可能,应改用其他自定义消息类型之一。
2.15讨论JMS API中可用的不同类型的消息吗?
JMS API中提供了不同类型的消息,这些消息是
TextMessage,BytesMessage,StreamMessage,ObjectMessage和
MapMessage 。
一条短信
TextMessage用于存储任何特定长度的字符串值。 但这仅需要String消息。 此消息类型可用于传输基于文本的消息,包括具有XML内容的消息。
当客户端收到TextMessage时 ,它处于只读模式。 如果客户端此时尝试写入消息,则抛出MessageNotWriteableException 。 如果调用clearBody ,则现在可以读取和写入消息。
//Create a TextMessage TextMessage sampleTextMsg = session.createTextMessage(); //Store values within TextMessage sampleTextMsg.setText(“sample content”); // Retrieve values from TextMessage String storedText = sampleTextMsg.getText();
B.字节消息
//Create BytesMessage BytesMessage sampleBytesMsg = session.createBytesMessage(); //Storing an array of numbers in BytesMessage byte [] byteArray = new byte []{ 66 , 68 , 70 }; sampleBytesMsg.writeBytes(byteArray); // Fetch the stored numbers by doing required casting byte [] msgContent = new byte [ 3 ]; sampleBytesMsg.readBytes(msgContent);
C.StreamMessage
StreamMessage对象用于以Java编程语言发送原始类型的流。 它被填充并顺序读取。 原始类型可以使用每种类型的方法显式读取或写入。
//Create a StreamMessage StreamMessage sampleStreamMsg = session.createStreamMessage(); //Store values within StreamMessage sampleStreamMsg.writeBoolean( false ); sampleStreamMsg.writeBoolean( true ); sampleStreamMsg.writeBoolean( false ); // Retrieve values from StreamMessage System.out.println(sampleStreamMsg.readBoolean()); System.out.println(sampleStreamMsg.readBoolean()); System.out.println(sampleStreamMsg.readBoolean());
D.对象消息
使用ObjectMessage ,可以将对象包装为消息并跨其传输,但是该对象必须可序列化。
//Create an ObjectMessage ObjectMessage sampleObjMsg = session.createObjectMessage(); //Create a ValueObject and initialize it with values ValueObject vObj = new ValueObject('sampleField', 54 ); //Store the ValueObject within ObjectMessage sampleObjMsg.setObject(vObj)); //Retrieve the stored ValueObject from the ObjectMessage vObj = (ValueObject) sampleObjMsg.getObject();
E.MapMessage
MapMessage对象用于发送一组名称/值对。 名称是String对象,值是Java的原始数据类型。 名称不能为空。
//Create a MapMessage MapMessage sampleMapMsg = session.createMapMessage(); //Set Key Value Pair with type String sampleMapMsg.setString( 'SampleKey' , 'SampleValue' ); // Retrieve String value using Key sampleMapMsg.getString( 'SampleKey' ); //Set Key Value Pair without specifying type sampleMapMsg.setObject( 'SampleKey1' , 'SampleValue1' ); // Retrieve Object value using Key sampleMapMsg.getObject(' 'SampleKey1' ); 2.16 Difference between the P2P(Peer to Peer) model and subscribe model?
主要区别在于P2P是高度可靠的,应仅在一对一方案中使用,而订户模型可以在一对多方案中使用。
2.17什么是JMS客户端?
JMS客户端是JMS的核心组件,用于发送或接收消息。 JMS支持两种消息传递样式:点对点以及发布和订阅消息传递样式
JMS是否支持电子邮件作为消息类型?
不能。JMS没有继承它的功能。
2.19 JMS与RPC有何不同?
Java消息服务(JMS)
JMS本质上是异步的。 当必须发送消息时,发件人会将消息发送给接收者。 这样,发件人的工作就完成了,它将继续进行进一步的处理。 接收者将接收到该消息并继续其自身的处理。 接收到消息后,没有从接收方向发送方发送确认。 这是因为JMS是异步的。
在JMS中,消息的发送者和接收者之间没有耦合。 因此,JMS允许动态添加新的发送者和接收者,从而管理一段时间内复杂性的变化。 因此,JMS是松散耦合的。
当发生意外故障时,JMS将存储待发送的消息。 系统启动后,存储的消息将被发送到相应的接收者。
远程过程调用(RPC)
RPC本质上是同步的。 与JMS不同,远程过程调用的调用者将调用该方法,并继续等待直到被调用的方法完成其执行。 一旦调用的方法执行完成,控件就会返回到调用者。 这是因为RPC在行为上是同步的。
RPC在相互交互的系统之间建立了紧密的耦合。 当调用程序调用远程方法时,调用程序将被阻塞,直到响应返回给调用程序为止。
当发生意外故障时,该故障将影响整个系统。 因此,整个系统将崩溃。
2.20如何在JMS中向非Java客户端传递消息?
如果您的Java代码和非Java代码可以就基于字节或文本的消息格式达成一致,则可以在它们之间交换消息。 是的,它可能消耗一条Java消息。
3.结论
在本文中,我们已经看到了JMS上最常见的面试问题 。
我们将添加更多的问题和答案。
如果您除了这些以外还有其他疑问,请在评论部分中发布。 我们将在本文中添加答案。
翻译自: https://www.javacodegeeks.com/2020/04/latest-20-jms-interview-questions-and-answers-2020.html