Jakarta ee ActiveMQ独立服务器部署或嵌入到SpringWebApp中
我需要设计一个应用程序来通知/发布其子系统以发送电子邮件。 我计划使用jms发布/订阅(主题)消息来实现这一点 就目前的可视性而言,将有20至30个订户,每天发布的消息数量将在30000至50000条之间 我计划使用ActiveMQJMS+Spring3+Tomcat6实现 问题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服务器/嵌入式服务器有哪些优点/缺
负载是否高很难判断。这实际上取决于消息的大小以及是否使用持久消息和事务。假设它们大约只有10KB,那么使用一台服务器应该就可以了 嵌入与独立的问题是一个很好的问题。让我提出一些我正在考虑的赞成/反对意见 独立的: Pro单机版: -如果您的spring应用程序之外还有其他应用程序将起诉ActiveMQ,那么重新启动应用程序也会影响ActiveMQ。不过,这里的情况似乎并非如此
- 另一方面,如果正常运行时间很关键,您可以在不关闭spring应用程序的情况下升级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中进行设置