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 代理。