jakarta-ee - ActiveMQ 独立服务器部署或嵌入 Spring Webapp

标签 jakarta-ee jms activemq setup-deployment

我需要设计一个应用程序来通知/发布,它的子系统发送电子邮件。
我计划使用 jms 发布/订阅(主题)消息来做到这一点

目前的可见性,将有 20 到 30 个订阅者,每天将发布的消息数量在 30000 到 50000 条消息的范围内。

我已经计划使用ActiveMQ JMS+Spring 3+Tomcat 6 实现
问题

  1. I am fairly new to JMS , i would like to know if the above load is high?

  2. Do we really need a separate ActiveMQ deployed on to a server or is it sufficient that we use an embedded ActiveMQ in the Webapp?

  3. What are the advantages/disadvantages of separate ActiveMQ server / embedded one?

最佳答案

首先请注意,随着事情的发展,您的消息量非常小。你真的可以使用任何一个,最容易维护的可能会决定你的选择。

扩展 Petter 关于重新启动的评论,需要考虑的一件事是将连接到代理的其他机器的数量。

客户

如果您有 100 台机器连接到代理,那么每次重启带有嵌入式 ActiveMQ 的 Tomcat 都会中断 100 个连接,所有连接都需要重新连接。 ActiveMQ 支持重新连接,因此可以正常工作,但是当每个人都重新连接时,它会给消息流增加一些不必要的延迟,有时几个客户端将无法重新连接,您必须手动将它们启动。

使用独立代理并假设有 100 个客户端,您可以随心所欲地重新启动 Tomcat 服务器,并且只中断从代理到 Tomcat 的一个连接。那可以非常好。

如果您只有一个客户端——Tomcat 服务器本身——那么就直接嵌入并使用 in-vm 传输。

内存

另一个因素是内存。我们在 Amazon EC2 中的 t1.micro 上使用 ActiveMQ,它只有 613MB 的内存,非常小。运行两个 t1.micros(一个用于 ActiveMQ,一个用于 Tomcat)比同时运行两个的 m1.small 便宜。

但同样,客户数量也是一个因素。如果除了 Tomcat 之外没有其他客户端,运行一个 m1.small 并将所有内容保存在同一个 vm 中可能会更好。

供引用

如果 Tomcat 和 ActiveMQ 是您的主要目标,您应该考虑 Apache TomEE Plus这是 Tomcat 与 ActiveMQ 已经集成。

所有的 jars 都在那里,默认情况下,一切都使用 Petter 谈到的本地传输使用嵌入式 ActiveMQ 代理设置。您可以轻松地将其配置为使用 standalone ActiveMQ broker以及。它还有JavaMail内置其中听起来可能对您有用。

所以你可以跳过设置部分,直接开始编写你的应用程序。例如,如果您要创建这个单个 Servlet 并将其放入没有其他 jar 或类的 war 中,它将起作用:

@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);

        //...
    }

}

这里还有一个 Getting Started Video它显示了通过 Tomcat 适配器在 Eclipse 中进行设置。

关于jakarta-ee - ActiveMQ 独立服务器部署或嵌入 Spring Webapp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11157190/

相关文章:

java - Camel路由自动将序列化对象转换为xml

java - JMS:可以在一个线程上通过 MessageConsumer.receive() 读取,然后从另一个线程调用 Session.commit() 吗?

当负载放置在队列上时,ActiveMQ 5.4.1 崩溃,数据库损坏

java - 定期从 PostgreSQL 获取数据并发送到 ActiveMQ

java - 在 Java EE 应用程序中同时进行 httpurlconnection 调用的最佳方法是什么

jakarta-ee - 如何实现容器管理事务(CMT)?

java - 在 persistence.xml 中引用具有 JNDI 名称的数据源

java - JMS可以在Java Swing App中使用吗

java - Java 运行时环境检测到 fatal error 。 EXCEPTION_ACCESS_VIOLATION 异常

java - Java EE 中的 Facade 有何意义?