代码之家  ›  专栏  ›  技术社区  ›  Shreya Agarwal

如何使用apache camel浏览队列中的消息?

  •  0
  • Shreya Agarwal  · 技术社区  · 8 年前

    我需要使用camel路由浏览来自活动mq的消息,而不需要使用这些消息。

    jms队列中的消息将被读取(只浏览而不使用)并移动到数据库中,同时确保原始队列保持完整。

    public class CamelStarter {
    
       private static CamelContext camelContext;
    
                public static void main(String[] args) throws Exception {
                                camelContext = new DefaultCamelContext();
                                ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(ActiveMQConnectionFactory.DEFAULT_BROKER_URL);
    
                                camelContext.addComponent("jms",  JmsComponent.jmsComponent(connectionFactory));
    
                                camelContext.addRoutes(new RouteBuilder() {
    
                                                @Override
                                                public void configure() throws Exception {
                                                    from("jms:queue:testQueue").to("browse:orderReceived") .to("jms:queue:testQueue1");
                                                }
    
                                                }
                                );
    
                                camelContext.start();
    
                                Thread.sleep(1000);
    
                                 inspectReceivedOrders();
    
                                camelContext.stop();
    
                }
    

    公共静态void inspectReceivedOrders(){

    BrowsableEndpoint browse = camelContext.getEndpoint("browse:orderReceived", BrowsableEndpoint.class);
    List<Exchange> exchanges = browse.getExchanges();
    System.out.println("Browsing queue: "+ browse.getEndpointUri() + " size: " + exchanges.size());
    for (Exchange exchange : exchanges) {
      String payload = exchange.getIn().getBody(String.class);
      String msgId = exchange.getIn().getHeader("JMSMessageID", String.class);
      System.out.println(msgId + "=" +payload);
    

    }

    2 回复  |  直到 8 年前
        1
  •  0
  •   pvpkiran    8 年前

    apache camel浏览器组件正是为此而设计的。检查 here 为了文件。

    因为你没有提供任何其他信息,所以不能多说了。

    假设你有这样的路线

    from("activemq:somequeue).to("bean:someBean")  
    

    或

    from("activemq:somequeue).process(exchange -> {})  
    

    你所要做的就是在这两者之间放置一个浏览端点

    from("activemq:somequeue).to("browse:someHandler").to("bean:someBean")   
    

    然后写一个这样的类

    @Component
    public class BrowseQueue {
    
      @Autowired
      CamelContext camelContext;
    
      public void inspect() {
        BrowsableEndpoint browse = camelContext.getEndpoint("browse:someHandler", BrowsableEndpoint.class);
        List<Exchange> exchanges = browse.getExchanges();
    
    
        for (Exchange exchange : exchanges) {
          ...... 
        }
      }
    
    }
    
        2
  •  0
  •   TacheDeChoco    8 年前

    据我所知,骆驼不可能阅读(不消耗!)jms消息:-( 我找到的唯一解决方法(在jee应用程序中)是定义一个带有计时器的启动ejb,持有一个queuebrowser,并将msg处理委托给一个camel路由:

    @Singleton
    @Startup
    public class MyQueueBrowser  {
    
        private TimerService timerService;
    
        @Resource(mappedName="java:/jms/queue/com.company.myqueue")
        private Queue sourceQueue;
    
        @Inject
        @JMSConnectionFactory("java:/ConnectionFactory")
        private JMSContext jmsContext;  
    
        @Inject
        @Uri("direct:readMessage")
        private ProducerTemplate camelEndpoint;
    
    
        @PostConstruct
        private void init() {       
            TimerConfig timerConfig = new TimerConfig(null, false);
            ScheduleExpression se = new ScheduleExpression().hour("*").minute("*/"+frequencyInMin);
            timerService.createCalendarTimer(se, timerConfig);
        }
    
    
        @Timeout
        public void scheduledExecution(Timer timer) throws Exception {      
            QueueBrowser browser = null;
            try {                       
                browser = jmsContext.createBrowser(sourceQueue);                                           
                Enumeration<Message> msgs = browser.getEnumeration();
                while ( msgs.hasMoreElements() ) { 
                    Message jmsMsg = msgs.nextElement(); 
                    // + here: read body and/or properties of jmsMsg                                            
                    camelEndpoint.sendBodyAndHeader(body, myHeaderName, myHeaderValue);
                }                                                                               
            } catch (JMSRuntimeException jmsException) {
                ...
            } finally {        
                browser.close();
            }
        }
    
    
    }