Jakarta ee ActiveMQ独立服务器部署或嵌入到SpringWebApp中

Jakarta ee ActiveMQ独立服务器部署或嵌入到SpringWebApp中,jakarta-ee,jms,activemq,setup-deployment,Jakarta Ee,Jms,Activemq,Setup Deployment,我需要设计一个应用程序来通知/发布其子系统以发送电子邮件。 我计划使用jms发布/订阅(主题)消息来实现这一点 就目前的可视性而言,将有20至30个订户,每天发布的消息数量将在30000至50000条之间 我计划使用ActiveMQJMS+Spring3+Tomcat6实现 问题 我对JMS相当陌生,我想知道上面的负载是否很高 我们真的需要在服务器上部署一个单独的ActiveMQ吗?或者在Webapp中使用嵌入式ActiveMQ就足够了吗 单独的ActiveMQ服务器/嵌入式服务器有哪些优点/缺

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

就目前的可视性而言,将有20至30个订户,每天发布的消息数量将在30000至50000条之间

我计划使用ActiveMQJMS+Spring3+Tomcat6实现 问题

  • 我对JMS相当陌生,我想知道上面的负载是否很高

  • 我们真的需要在服务器上部署一个单独的ActiveMQ吗?或者在Webapp中使用嵌入式ActiveMQ就足够了吗

  • 单独的ActiveMQ服务器/嵌入式服务器有哪些优点/缺点


  • 负载是否高很难判断。这实际上取决于消息的大小以及是否使用持久消息和事务。假设它们大约只有10KB,那么使用一台服务器应该就可以了

    嵌入与独立的问题是一个很好的问题。让我提出一些我正在考虑的赞成/反对意见

    独立的: Pro单机版: -如果您的spring应用程序之外还有其他应用程序将起诉ActiveMQ,那么重新启动应用程序也会影响ActiveMQ。不过,这里的情况似乎并非如此

    • 另一方面,如果正常运行时间很关键,您可以在不关闭spring应用程序的情况下升级ActiveMQ安装
    反对意见: -更多地考虑(另一种安装)来监控、操作等

    我喜欢嵌入式解决方案,如果这是一个应用程序内部的话。ActiveMQ非常适合嵌入。如果您的应用程序需要扩展,您可以轻松地使用spring应用程序启动另一台服务器。然后用一行XML对ActiveMQ实例进行集群,就可以了


    嵌入式解决方案的另一个优点是Spring和ActiveMQ之间的传输可以是JVM内部的,因此消息不会通过TCP/IP堆栈传输,而是作为内存拷贝。这将加快您的应用程序的速度。

    首先要注意的是,您的消息量非常小。你真的可以使用其中任何一个,任何最容易维护的东西都可能决定你的选择

    < Petter >关于重新开始评论的一件事是要连接到经纪人的其他机器的数量。 客户 如果有100台机器连接到代理,那么每次重新启动Tomcat w/embedded ActiveMQ都会中断100个需要重新连接的连接。ActiveMQ支持重新连接,因此可以很好地工作,但它会在每个人都重新连接时给消息流添加一些不必要的延迟,有时一些客户端将无法重新连接,您必须手动启动它们

    有了一个独立的代理和100个客户端,您可以随时重启Tomcat服务器,并且只中断从代理到Tomcat的一个连接。那太好了

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

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

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

    供参考 <>如果Tomcat和ActuMeq是你的主要目标,你应该考虑哪一个是已经被集成的ActuMeq的Tomcat。

    所有的JAR都在那里,所有东西都默认使用Petter提到的本地传输通过嵌入式ActiveMQ代理进行设置。您可以轻松地将其配置为使用。它还内置了听起来可能对您有用的功能

    因此,您可以跳过安装部分,直接开始编写应用程序。例如,如果您要创建一个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中进行设置