2012-01-15 38 views
5

Tôi có một hệ thống triển khai Camel và ActiveMQ để liên lạc giữa một số máy chủ. Tôi muốn biết nếu có một cách để tự động hết hạn và xóa các tin nhắn gửi đến một hàng đợi sau khi X thời gian. Kể từ khi máy chủ có nguồn gốc (điền vào hàng đợi) sẽ không biết nếu có ai đang nhận các tin nhắn, tôi không muốn hàng đợi của tôi phát triển cho đến khi nó quá lớn đến mức có gì đó bị treo. Điểm thưởng cho một người có thể giúp và cung cấp cách java dsl để thực hiện tính năng này.Tự động hết hạn tin nhắn trong Camel

Giải pháp

// expire message after 2 minutes 
long ttl = System.currentTimeMillis() + 120000; 
// send our info one-way to the group topic 
camelTemplate.sendBodyAndHeader("jms:queue:stats", ExchangePattern.InOnly, stats, "JMSExpiration", ttl); 

Trả lời

1

Vâng setJMSExpiration (hết hạn dài):

là một cái gì đó bạn phải không gọi khi bạn là khách hàng. Xem bài nói chuyện của tôi về điều này một chút trên diễn đàn ActiveMQ.

http://apache-qpid-developers.2158895.n2.nabble.com/MRG-Java-JMS-Expiration-td7171854.html

+0

Trong tin nhắn của bạn trên diễn đàn, có vẻ như bạn muốn hết hạn 10 phút nhưng thay vào đó đặt 10 giây. ví dụ (10 * (60 * 1000)) so với (10 * 1000) –

+0

@ Rất tiếc, tôi muốn 10 giây. 10 phút là cài đặt mặc định Qpid khi các thư hết hạn được xóa khỏi hàng đợi. Ví dụ: bạn đã gửi một tin nhắn đến hàng đợi có thời gian hết hạn là 10 giây, vì vậy sau 10 giây tin nhắn hết hạn bởi QPid và không người tiêu dùng nào có thể tiêu thụ nó, nhưng thực tế là thông báo sẽ xóa bu QPid khi Chủ đề Chính sách Xoá (s) đá vào, và các thiết lập mặc định là họ đá trong sau 10 phút – Eugene

+0

Ok, tôi hiểu lầm những gì bạn đã đăng ở đó. –

3

Cũng nhớ rằng đồng hồ giữa khách hàng - nhà môi giới cần phải được đồng bộ, cho hết thời hạn hoạt động tốt. Nếu đồng hồ không đồng bộ, thì tập hợp hết hạn từ máy khách, có thể đã hết hạn khi nhận được tin nhắn trên người môi giới. Hoặc thời gian của khách hàng là phía trước của các nhà môi giới, do đó, thời hạn sử dụng dài hơn 10 giây.

Nó kinda beats tôi tại sao hết hạn là dựa trên thời gian của khách hàng. Vì vậy, AMQ cung cấp một plugin, để khắc phục điều này bằng cách sắp xếp lại thời gian, để chỉ dựa trên môi giới. Xem http://activemq.apache.org/timestampplugin.html

1

Về phía chúng tôi, chúng tôi chọn thêm thời gian hết hạn vào các đích cụ thể bằng cách sử dụng tuyến đường lạc đà được triển khai trong dịch vụ ActiveMQ.

Điều duy nhất cần làm là tạo một tệp XML như sau với tên, ví dụ: setJMSExpiration.xml:

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation=" 
    http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd 
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> 

    <camelContext id="camel-set-expiration" xmlns="http://camel.apache.org/schema/spring"> 
    <!-- Copy route for each destination to expire --> 
    <route id="setJMSExpiration.my.queue.dlq"> 
     <from uri="broker:queue:MY.QUEUE.DLQ"/> 
     <setHeader headerName="JMSExpiration"> 
      <!-- Message will expire after 1 day --> 
      <spel>#{T(java.lang.System).currentTimeMillis() + 86400000}</spel> 
     </setHeader> 
     <to uri="broker:queue:MY.QUEUE.DLQ"/> 
    </route> 
    <route id="setJMSExpiration.another.queue"> 
     <from uri="broker:queue:ANOTHER.QUEUE"/> 
     <setHeader headerName="JMSExpiration"> 
      <!-- Message will expire after 5 days --> 
      <spel>#{T(java.lang.System).currentTimeMillis() + 432000000}</spel> 
     </setHeader> 
     <to uri="broker:queue:ANOTHER.QUEUE"/> 
    </route> 
    </camelContext> 
</beans> 

và nhập nó trong activemq.xml cấu hình của bạn với:

<!-- Add default Expiration (file in the same directory) --> 
<import resource="setJMSExpiration.xml"/> 

Hoặc bạn cũng có thể cung cấp cụ thể per destination policies nếu bạn không muốn những thông điệp hết hạn để đạt được hàng đợi ActiveMQ.DLQ.

<policyEntry queue="MY.QUEUE.DLQ"> 
    <deadLetterStrategy> 
     <sharedDeadLetterStrategy processExpired="false" /> 
    </deadLetterStrategy> 
</policyEntry> 
<policyEntry queue="ANOTHER.QUEUE"> 
    <deadLetterStrategy> 
     <sharedDeadLetterStrategy processExpired="false" /> 
    </deadLetterStrategy> 
</policyEntry> 

Hạn chế duy nhất của cách này là bạn không thể dễ dàng sử dụng ký tự đại diện như nó được mã hóa ở đây (bạn có thể, nhưng nó sẽ cần một số thích nghi bằng cách sử dụng tiêu đề điểm đến JMS trong con đường lạc đà).

Chúng tôi cố gắng để các nhà sản xuất xác định timeToLive (và buộc họ càng nhiều càng tốt) nhưng không phải lúc nào cũng có thể buộc họ thay đổi mã của họ, điều này để giảm thiểu số lượng các tuyến đường như vậy.

Các vấn đề liên quan