我记得J2EE (1.3和1.4)的过去,使用JMS启动项目非常困难。 您需要安装JMS 代理 ,创建主题队列 ,最后使用服务器配置文件和JNDI开始自己的战斗。

感谢JavaEE 6及其它,使用JMS确实非常简单。 但是使用Apache TomEE则更容易上手。 在本文中,我们将了解如何创建和测试一个简单的应用程序,该应用程序使用Apache TomEEJMS队列发送消息或从JMS队列接收消息。

Apache TomEE使用Apache Active MQ作为JMS提供程序。 在此示例中,您不需要下载或安装任何东西,因为所有元素都将作为Maven依赖项提供,但是如果您计划(并且应该)使用Apache TomEE服务器,则需要下载Apache TomEE plus或Apache TomEE plume。 您可以在http://tomee.apache.org/comparison.html中了解有关Apache TomEE风味的更多信息。

依存关系

首先要做的是将javaee-api添加为提供的依赖项,并将junitopenejb-core添加测试依赖项。 请注意,添加了openejb-core依赖项以使其具有运行时来执行测试,我们将在测试部分中对其进行深入了解。

<dependencies><dependency><groupId>org.apache.openejb</groupId><artifactId>javaee-api</artifactId><version>6.0-6</version><scope>provided</scope></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency><dependency><groupId>org.apache.openejb</groupId><artifactId>openejb-core</artifactId><version>4.7.1</version><scope>test</scope></dependency>
</dependencies>

商业代码

下一步是创建负责发送消息和从JMS 队列接收消息的业务代码。 它还包含一种从队列接收消息的方法。 对于此示例,我们将使用无状态 EJB

import javax.annotation.Resource;
import javax.ejb.Stateless;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.DeliveryMode;
import javax.jms.JMSException;
import javax.jms.MessageConsumer;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;@Stateless
public class Messages {//Standard @Resource annotation is used to inject the ConnectionFactory. //If no name is provided using lookup or name attribute, //the fully qualified name of the class with an slash (/) and the name of the attribute is used. //In this example: java:comp/env/org.superbiz.jms.Messages/connectionFactory.@Resource private ConnectionFactory connectionFactory;//Standard @Resource annotation is used to inject the Queue. //If no name is provided using lookup or name attribute, //the fully qualified name of the class with an slash (/) and the name of the attribute is used. //In this example: java:comp/env/org.superbiz.injection.jms.Messages/chatQueue.@Resource private Queue chatQueue;public void sendMessage(String text) throws JMSException {Connection connection = null;Session session = null;try {connection = connectionFactory.createConnection();//Connection is get from ConnectionFactory instance and it is started.connection.start(); //Creates a session to created connection.session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); //Creates a MessageProducer from Session to the Queue.MessageProducer producer = session.createProducer(chatQueue);producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT); TextMessage message = session.createTextMessage(text);//Tells the producer to send the messageproducer.send(message); } finally {if (session != null) session.close(); if (connection != null) connection.close();}}public String receiveMessage() throws JMSException {Connection connection = null;Session session = null;MessageConsumer consumer = null;try {connection = connectionFactory.createConnection();connection.start();session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);consumer = session.createConsumer(chatQueue); //Waits for a message with timeout. Note that because a TextMessage is sent, the receive method expects a TextMessage too.TextMessage message = (TextMessage) consumer.receive(1000); return message.getText(); } finally {if (consumer != null) consumer.close();if (session != null) session.close();if (connection != null) connection.close();}}
}

Messages类的最重要部分是注意注入ConnectionFactory
在代码内将实例排队 。 您只需要使用@Resource批注,容器将为您完成其余工作。 最后请注意,由于我们尚未使用namelookup属性来设置名称,因此将字段名称用作资源名称。

测试

最后,我们可以编写一个测试来断言使用JMS队列发送和接收消息。 例如,我们可以使用Arquilian编写测试,但是由于这种情况,由于简单起见,我们将使用嵌入式OpenEJB实例来部署JMS示例并运行测试。

public class MessagesTest {//Messages EJB is injected.@EJBprivate Messages messages;@Beforepublic void setUp() throws Exception {Properties p = new Properties();//Embedded OpenEJB container is started.//And current test added inside created container//So we can use javaee annotations insideEJBContainer.createEJBContainer(p).getContext().bind("inject", this); }@Testpublic void shouldSendAndReceiveMessages() throws Exception {//Three messages are sent.messages.sendMessage("Hello World!"); messages.sendMessage("How are you?");messages.sendMessage("Still spinning?");//Three messages are received.assertThat(messages.receiveMessage(), is("Hello World!")); assertThat(messages.receiveMessage(), is("How are you?"));assertThat(messages.receiveMessage(), is("Still spinning?"));}}

请注意,该测试非常简单明了,您只需要以编程方式启动EJB容器并在其中绑定当前测试,这样我们就可以在测试中使用JavaEE批注。 其余的是一个简单的JUnit测试。

而且,如果您运行测试,您将收到绿色的子弹。 但是,等等,您可能想知道JMS 代理及其配置在哪里? ConnectionFactoryJMS 队列的定义在哪里? 这就是OpenEJB (和Apache TomEE )发挥作用的地方。

在这种情况下, OpenEJB (和Apache TomEE )将以嵌入式模式使用Apache Active MQ ,因此您无需在计算机上安装Apache Active MQ即可运行测试。 此外, Apache TomEE将为您创建所有必需的资源。 例如,它会创建一个连接工厂和一个队列为你使用默认参数和预期的名称(org.superbiz.Messages / connectionFactory的用于连接工厂org.superbiz.Messages / chatQueue队列 ),所以你不必担心到在测试阶段配置JMSApache TomEE足够聪明,可以为您创建和配置它们。

您可以通过阅读下一条日志消息来检查控制台输出,以了解资源是自动创建的: INFO:自动创建资源

Jan 10, 2015 10:32:48 AM org.apache.openejb.config.AutoConfig processResourceRef
INFO: Auto-linking resource-ref 'java:comp/env/org.superbiz.Messages/connectionFactory' in bean Messages to Resource(id=Default JMS Connection Factory)
Jan 10, 2015 10:32:48 AM org.apache.openejb.config.ConfigurationFactory configureService
INFO: Configuring Service(id=org.superbiz.Messages/chatQueue, type=Resource, provider-id=Default Queue)
Jan 10, 2015 10:32:48 AM org.apache.openejb.config.AutoConfig logAutoCreateResource
INFO: Auto-creating a Resource with id 'org.superbiz.Messages/chatQueue' of type 'javax.jms.Queue for 'Messages'.
Jan 10, 2015 10:32:48 AM org.apache.openejb.assembler.classic.Assembler createRecipe
INFO: Creating Resource(id=org.superbiz.Messages/chatQueue)
Jan 10, 2015 10:32:48 AM org.apache.openejb.config.AutoConfig processResourceEnvRef
INFO: Auto-linking resource-env-ref 'java:comp/env/org.superbiz.Messages/chatQueue' in bean Messages to Resource(id=org.superbiz.Messages/chatQueue)
Jan 10, 2015 10:32:48 AM org.apache.openejb.config.ConfigurationFactory configureService
INFO: Configuring Service(id=Default Managed Container, type=Container, provider-id=Default Managed Container)
Jan 10, 2015 10:32:48 AM org.apache.openejb.config.AutoConfig createContainer
INFO: Auto-creating a container for bean javaee.MessagesTest: Container(type=MANAGED, id=Default Managed Container)

如此,借助Java EETomEEJMS真的非常容易上手 。 在下一篇文章中,我们将看到如何使用消息驱动Bean (MDB)进行相同的操作。

翻译自: https://www.javacodegeeks.com/2015/01/apache-tomee-jms-it-has-never-been-so-easy.html

Apache TomEE + JMS。 这从未如此简单。相关推荐

  1. tomee_Apache TomEE + JMS。 从未如此简单。

    tomee 我记得J2EE (1.3和1.4)的过去,使用JMS启动项目非常困难. 您需要安装JMS 代理 ,创建主题或队列 ,最后使用服务器配置文件和JNDI开始自己的战斗. 感谢JavaEE 6及 ...

  2. tomee_一罐将其全部统治:Apache TomEE + Shrinkwrap == JavaEE引导

    tomee 警告:我不是Spring Boot的专家. 我发现很多事情对此非常有趣,并且当然可以真正改善您的日常工作. 而且,我对Spring Boot没有任何反对,也没有开发或使用它的人. 但是我认 ...

  3. 一个罐子统治一切:Apache TomEE + Shrinkwrap == JavaEE引导

    警告:我不是Spring Boot的专家. 我发现很多事情对此非常有趣,并且当然可以真正改善您的日常工作. 而且,我对Spring Boot没有任何反对,也没有开发或使用它的人. 但是我认为社区高估了 ...

  4. tomee_微服务系列:MicroProfile和Apache TomEE

    tomee 介绍 MicroProfile是由知名供应商于2016年9月发起的一项计划,目的是基于JEE平台构建微服务架构. 任务是针对微服务架构优化企业Java . 开发人员可以使用这种体系结构,通 ...

  5. mongodb+java_Java EE + MongoDb与Apache TomEE和Jongo Starter项目

    mongodb+java 知道MongoDB和Java EE ,但是您不确切地知道如何将它们集成在一起? 您是否阅读了很多有关该主题的内容,但没有找到适合该目的的解决方案? 这个入门项目适合您: 您将 ...

  6. 微服务系列:MicroProfile和Apache TomEE

    介绍 MicroProfile是一项由知名供应商于2016年9月发起的举措,目的是基于JEE平台构建微服务架构. 任务是针对微服务架构优化Enterprise Java . 开发人员可以利用这种体系结 ...

  7. Java EE + MongoDb与Apache TomEE和Jongo Starter项目

    知道MongoDB和Java EE ,但是您不知道如何将两者集成在一起? 您是否阅读了很多有关该主题的内容,但没有找到适合该目的的解决方案? 这个入门项目适合您: 您将学习如何以一种时尚的方式使用Mo ...

  8. 怎么用python处理excel文件-用python处理excel文件有多轻松?工作从未如此简单

    最近需要频繁读写 excel 文件,想通过程序对 excel 文件进行自动化处理,发现使用 python 的 openpyxl 库进行 excel 文件读写实在太方便了,结构清晰,操作简单.本文对 o ...

  9. Apache TomEE(和Tomcat)的自签名证书

    可能在大多数Java EE项目中,您将拥有具有SSL支持( https )的部分或整个系统,因此浏览器和服务器可以通过安全连接进行通信. 这意味着在处理数据之前,已发送的数据已加密,传输并最终解密. ...

最新文章

  1. 最小化局部边际的合并聚类算法(中篇)
  2. R语言logistic回归、判别分析(LDA)、多元自适应样条回归MARS分析案例:分析乳腺癌数据集明确细针穿刺肿瘤活检结果
  3. python能处理多大的数据-Python 适合大数据量的处理吗?
  4. 使用 FocusScopeNode 在 TextFormFields 之间轻松移动焦点
  5. pytorch随笔-6
  6. 【Linux系统编程】Linux 线程浅析
  7. 阿里一年,聊聊我成长了什么,入职阿里的职业生涯感悟
  8. JEECG参与2017年度最受欢迎开源项目投票,请投上宝贵一票
  9. Centos7 安装 Rabbitmq、Erlang
  10. c语言未初始化的指针下标访问是0,C语言的二数组的指针访问.doc
  11. 如何在无显示器的ubuntu下跑前端测试
  12. Linux XZ压缩格式学习
  13. 学习webpack系列之三 ---- (输出管理)
  14. 计算机主页为什么打不开怎么办,主页被限制,打不开怎么办?
  15. 倍加福二维码测试1-串口助手测试
  16. 读书笔记—产品型社群:互联网思维的本质
  17. 连接摄像头拍照并识别图片中二维码
  18. php ppt如何转换成pdf,ppt转pdf格式转换器 PPT批量转换成PDF 怎样把PPT格式转换成PDF格式...
  19. 搭建在线视频网站,怎么弄?
  20. 服务价值 100 万亿美元的行业,是时候收购市场领导者英伟达了

热门文章

  1. 纯js实现人脸识别眨眨眼张张嘴案例——alive_face.js
  2. 关于文档的基本操作---ElasticSearch
  3. 在dialog中使用EditText键盘弹不起来的解决方法
  4. 面试项目 java-服务端2 18h58
  5. python变量后面加星号_Python基础找茬系列20--python函数的秘密
  6. jvm(7)-虚拟机类加载机制
  7. 基于Apache POI 向xlsx写入数据
  8. servlet 配置 使用_配置HTTPS以与Servlet一起使用
  9. java args_Java命令行界面(第2部分):args4j
  10. jdbc如何插入clob_让我们回顾一下如何通过JDBC插入Clob或Blob