ActiveMQ独立服务器部署或嵌入在Spring Webapp中

Sud*_*kar 8 activemq-classic jms setup-deployment java-ee

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

现在的可见性,将有20到30个订阅者,并且将要发布的消息数量将在每天30000到50000个消息的范围内.

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

  1. 我是JMS的新手,我想知道上面的负载是否很高?

  2. 我们真的需要在服务器上部署单独的ActiveMQ,还是我们在Webapp中使用嵌入式ActiveMQ就足够了?

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

Dav*_*ins 7

首先请注意,随着时间的推移,您的消息量非常小.你可以真正使用其中任何最容易维护的东西可能会决定你的选择.

扩展Petter对重启的评论要考虑的一件事是将连接到代理的其他机器的数量.

客户端

如果你有100台机器连接到代理,那么每次重启Tomcat w/embedded ActiveMQ都会破坏所有需要重新连接的100个连接.ActiveMQ支持重新连接,因此可以很好地工作,但它可以为每个人重新连接时添加一些不必要的消息流延迟,有时一些客户端将无法重新连接,您必须手动将它们付诸行动.

使用独立代理并说100个客户端,您可以根据需要随时重新启动Tomcat服务器,并且只能断开从代理到Tomcat的一个连接.这可能非常好.

如果您只有一个客户端 - Tomcat服务器本身 - 那么请放下嵌入式并使用in-vm传输.

记忆

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

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

FYI

如果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);

        //...
    }

}
Run Code Online (Sandbox Code Playgroud)

这里还有一个入门视频,它显示了通过Tomcat适配器在Eclipse中进行设置.