TomEE
Apache TomEE 是一个包含完全集成的 ActiveMQ Classic 的 Tomcat 发行版,它为普通的 war 文件、Servlet 等提供完整的 JMS 支持。无需任何设置,以下代码就可以开箱即用。
import javax.annotation.Resource; import javax.servlet.http.HttpServlet; import javax.jms.Topic; import javax.jms.Queue; import javax.jms.ConnectionFactory;
public class MyServet extends HttpServlet {
@Resource(name = "foo")
private Topic fooTopic;
@Resource(name = "bar")
private Queue barQueue;
@Resource
private ConnectionFactory connectionFactory;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//...
Connection connection = connectionFactory.createConnection();
connection.start();
// Create a Session
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// Create a MessageProducer from the Session to the Topic or Queue
MessageProducer producer = session.createProducer(fooTopic);
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
// Create a message
TextMessage message = session.createTextMessage("Hello World!");
// Tell the producer to send the message
producer.send(message);
//...
} }
所有主题和队列都在代码中正确声明后自动创建。例如,以下代码中的引用
@Resource(name = "foo")
private Topic fooTopic;
与以下在
<Resource id="foo" type="javax.jms.Topic" />
在这两种情况下,主题名称都是 ‘foo’。
配置嵌入式代理
如果未配置代理并且 web 应用程序中使用了 JMS,TomEE 将创建一个与以下声明等效的代理
这将创建一个在 TomEE 内部运行的 ActiveMQ Classic 代理,并绑定到地址 someHostName:61616。此代理将在 TomEE 启动时启动,并在 TomEE 关闭时关闭。TomEE 内部发生的任何 JMS 通信都将通过嵌入式 ActiveMQ Classic 代理使用 ActiveMQ Classic “vm” 传输,该传输针对在与代理相同的 JVM 中发送和接收消息进行了优化。
连接到外部代理
可以连接到外部运行的 ActiveMQ Classic 代理。设置与上述设置类似,只有两个变化。
这里 BrokerXmlConfig 属性为空,因为我们没有配置要嵌入 TomEE 中运行的代理。 ServerUrl 现在指向一个明确的远程主机和端口 someHostName:61616,ActiveMQ Classic 代理必须在该主机和端口运行。此代理可以是简单的 ActiveMQ Classic 安装,也可以是嵌入在 TomEE 安装中的 ActiveMQ Classic 代理。
