首先请注意,随着事情的发展,您的消息量非常小。您可以真正使用其中任何一种,并且最容易维护的东西可能会决定您的选择。
扩展 Petter 关于重启的评论需要考虑的一件事是将连接到代理的其他机器的数量。
客户
如果您有 100 台机器连接到代理,那么每次重新启动带有嵌入式 ActiveMQ 的 Tomcat 都会中断 100 个需要重新连接的连接。ActiveMQ 支持重新连接,因此可以正常工作,但是当每个人都重新连接时,它会给消息流增加一些不必要的延迟,有时几个客户端将无法重新连接,您必须手动将它们启动。
使用独立代理和 100 个客户端,您可以根据需要随时重启 Tomcat 服务器,并且只断开从代理到 Tomcat 的一个连接。这可能非常好。
如果您只有一个客户端(Tomcat 服务器本身),那么请直接嵌入并使用 in-vm 传输。
记忆
另一个因素是内存。我们在 t1.micro 上使用 Amazon EC2 中的 ActiveMQ,它只有 613MB 的内存,非常小。运行两个 t1.micros(一个用于 ActiveMQ,一个用于 Tomcat)比一个同时具有两者的 m1.small 便宜。
但同样,客户数量也是一个因素。如果除了 Tomcat 之外没有其他客户端,运行一个 m1.small 并将所有内容保存在同一个 vm 中可能会更好。
供参考
如果 Tomcat 和 ActiveMQ 是您的主要目标,您应该考虑Apache TomEE Plus,它是已经集成了 ActiveMQ 的 Tomcat。
所有的罐子都在那里,默认情况下,一切都是使用 Petter 谈到的本地传输使用嵌入式 ActiveMQ 代理设置的。您也可以轻松地将其配置为使用独立的 ActiveMQ 代理。它还内置了JavaMail,听起来它可能对您有用。
因此,您可以跳过设置部分,直接开始编写您的应用程序。例如,如果您要创建这个单一的 Servlet 并将其置于没有其他 jar 或类的战争中,它会起作用:
@WebServlet("/hello-world")
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);
//...
}
}
这里还有一个入门视频,展示了通过 Tomcat 适配器在 Eclipse 中进行设置。