Tôi đang nghiên cứu các giải pháp xếp hàng cho một trong các ứng dụng của nhóm của tôi. Lý tưởng nhất là chúng tôi muốn một cái gì đó có thể được cấu hình cả hai như là một nhà môi giới nhẹ, trong quá trình (cho nhắn tin thông lượng thấp giữa các chủ đề) và như một nhà môi giới bên ngoài. Có một máy chủ MQ ngoài kia có thể làm điều này không? Hầu hết dường như yêu cầu thiết lập như một thực thể bên ngoài. ZeroMQ dường như đến gần nhất với một giải pháp trong quá trình, nhưng nó có vẻ là nhiều hơn một "UDP socket on steroid", và chúng tôi cần giao hàng đáng tin cậy.Có bất kỳ máy chủ MQ nào có thể chạy được nhúng trong một quy trình Java không?
Trả lời
Giống như chúng tôi đã nói ActiveMQ
hơi nặng hơn ZeroMQ
nhưng nó hoạt động thực sự tốt như một quy trình được nhúng. Đây là một ví dụ đơn giản với Spring
và ActiveMQ
.
Các người nghe thông điệp rằng sẽ được sử dụng để kiểm tra hàng đợi: Cấu hình
public class TestMessageListener implements MessageListener {
private static final Logger logger = LoggerFactory.getLogger(TestMessageListener.class);
@Override
public void onMessage(Message message) {
/* Receive the text message */
if (message instanceof TextMessage) {
try {
String text = ((TextMessage) message).getText();
System.out.println("Message reception from the JMS queue : " + text);
} catch (JMSException e) {
logger.error("Error : " + e.getMessage());
}
} else {
/* Handle non text message */
}
}
}
ActiveMQ
bối cảnh:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="jmsQueueConnectionFactory" class="org.apache.activemq.spring.ActiveMQConnectionFactory">
<property name="brokerURL">
<value>tcp://localhost:61617</value>
</property>
</bean>
<bean id="pooledJmsQueueConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop">
<constructor-arg ref="jmsQueueConnectionFactory" />
</bean>
<bean id="queueDestination" class="org.apache.activemq.command.ActiveMQQueue">
<constructor-arg value="messageQueue" />
</bean>
<bean id="jmsQueueTemplate" class="org.springframework.jms.core.JmsTemplate">
<constructor-arg ref="pooledJmsQueueConnectionFactory" />
<property name="pubSubDomain" value="false"/>
</bean>
<bean id="testMessageListener" class="com.example.jms.TestMessageListener" />
<bean id="messageQueuelistenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="pooledJmsQueueConnectionFactory" />
<property name="destination" ref="QueueDestination" />
<property name="messageListener" ref="testMessageListener" />
<property name="concurrentConsumers" value="5" />
<property name="acceptMessagesWhileStopping" value="false" />
<property name="recoveryInterval" value="10000" />
<property name="cacheLevelName" value="CACHE_CONSUMER" />
</bean>
</beans>
Các thử nghiệm JUnit
:
@ContextConfiguration(locations = {"classpath:/activeMQ-context.xml"})
public class SpringActiveMQTest extends AbstractJUnit4SpringContextTests {
@Autowired
private JmsTemplate template;
@Autowired
private ActiveMQDestination destination;
@Test
public void testJMSFactory() {
/* sending a message */
template.convertAndSend(destination, "Hi");
/* receiving a message */
Object msg = template.receive(destination);
if (msg instanceof TextMessage) {
try {
System.out.println(((TextMessage) msg).getText());
} catch (JMSException e) {
System.out.println("Error : " + e.getMessage());
}
}
}
}
Các Dependencies để thêm vào số pom.xml
:
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- ActiveMQ -->
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
<version>5.6.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-pool</artifactId>
<version>5.6.0</version>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-core</artifactId>
<version>5.6.0</version>
</dependency>
Điều này làm việc rất tốt, cảm ơn bạn. –
Các vấn đề chúng ta đã thấy với ActiveMQ (và tại sao tôi hiện đang tìm kiếm nhanh các lựa chọn thay thế): (a) khi bạn tắt nó, nó không dừng tất cả các chủ đề của nó. (b) nhiều API tự động bắt đầu dịch vụ của mình khi xây dựng trong khi cũng có các phương thức start() - làm cho API không rõ ràng và có thể đóng góp cho (a). (C) vô số các vấn đề với đa luồng, mà cho đến nay đã được "cố định" bởi họ thêm khối đồng bộ hơn. (d) bảo mật đáng ngờ, đặc biệt khi được sử dụng trong chế độ khám phá. (Pro-tip: thiết lập một máy chủ xếp hàng tin nhắn rogue cho thời gian vui vẻ xung quanh văn phòng!) – Trejkaz
Máy khách WebSphere MQ có khả năng thực hiện multicast pub/sub. Điều này cung cấp khả năng từ máy khách đến máy khách bỏ qua trình quản lý hàng đợi, mặc dù người quản lý hàng đợi được yêu cầu thiết lập kết nối.
- 1. Eclipse: Lựa chọn không chứa bất kỳ tài nguyên nào có thể chạy trên máy chủ
- 2. Tệp chiến dịch có thể được triển khai trên bất kỳ máy chủ nào không?
- 3. Java, MySQL: Có cách nào để nhúng một máy chủ MySQL với một chương trình Java không?
- 4. Bất kỳ máy chủ OpenID trăn nào có sẵn?
- 5. Có bất kỳ tác hại nào khi chạy PHP và Ruby trên cùng một máy chủ không?
- 6. Node.js có thể chạy trong máy chủ Tomcat không?
- 7. gwt beginner- error "không thể tìm thấy bất kỳ trang máy chủ nào trong dự án '
- 8. PreparedStatement.addBatch trong java có bất kỳ hạn chế nào không?
- 9. Máy chủ Kerberos nhúng Java được viết Java để kiểm tra
- 10. Có thể chạy một máy chủ socket và máy khách socket trên cùng một máy không?
- 11. Chương trình Java chấm dứt bất ngờ mà không có bất kỳ thông báo lỗi nào
- 12. Tomcat6 không thể kết nối với MySql (Trình điều khiển chưa nhận được bất kỳ gói nào từ máy chủ)
- 13. Có bất kỳ tương tự nhẹ nào với CORBA/RPC cho các chương trình nhúng không?
- 14. Có bất kỳ biến trừu tượng nào trong java không?
- 15. Có thể chạy jQuery ở phía máy chủ không?
- 16. Có bất kỳ công cụ quy tắc nào được triển khai trên NodeJS/trong Javascript không?
- 17. Có thẻ HTML nào có thể được sử dụng ở bất kỳ đâu trong DOM không?
- 18. Có bất kỳ máy chủ hình ảnh độc lập mã nguồn mở nào tồn tại không?
- 19. Có cách nào để nhúng bất kỳ biểu đồ nào từ Github trong HTML không?
- 20. Có bất kỳ "trình gỡ rối trực quan" nào cho Java không?
- 21. Biến C có thể bị xóa hoặc xóa bất kỳ lúc nào trong khi chạy chương trình không?
- 22. Có bất kỳ máy chủ web nguồn mở nào trên iphone không?
- 23. Chủ đề không chặn chạy một quy trình bên ngoài
- 24. Có bất kỳ ESB .NET nào không?
- 25. Có thể gọi startServce() từ bất kỳ chuỗi nào không?
- 26. Có thư viện Java FTP Server đơn giản nào có thể nhúng được không?
- 27. Khi nhiều chương trình java chạy trên cùng một máy
- 28. SMLNJ có bất kỳ loại trình gỡ lỗi nào không?
- 29. Có thể tạo một thể hiện của một lớp mà không cần chạy bất kỳ mã nào từ lớp không? (không có ctor, không có khởi tạo trường)
- 30. Không thể sử dụng đặt vải - Có bất kỳ cấu hình máy chủ nào cần thiết không?
Tôi nghĩ rằng câu trả lời cho http://stackoverflow.com/questions/2507536/lightweight-jms-broker chứa thông tin thú vị (ví dụ: [ffmq] (http://ffmq.sourceforge.net/index .html) gợi ý). ActiveMQ là một ứng viên khác nặng hơn, nhưng nó cũng có thể nhúng được. – fvu
Giống như @fvu cho biết, ActiveMQ hơi nặng hơn ZeroMQ nhưng nó hoạt động thực sự tốt như một quá trình nhúng. Và nếu bạn đang sử dụng Spring, thật dễ dàng để thiết lập. –
ZeroMQ chạy trong số những thứ khác trên đầu trang của TCP (không UDP) cung cấp một giao thông đáng tin cậy. Tuy nhiên, bạn đang đề cập đến một hàng đợi liên tục? I E. được sao lưu vào đĩa? –