2013-10-01 2 views
1

У меня есть маршрут верблюд, который выглядит следующим образом:Camel JPA Компонент - форсирование фиксации

<routeContext id="rollover-route" xmlns="http://camel.apache.org/schema/spring"> 
    <route id="pickUpEntries"> 
     <from uri="jpa://cameltest.model.CamelTest?consumer.namedQuery=unconsumedEntries&amp;?consumeDelete=false&amp;persistenceUnit=persistenceProvider&amp;consumeLockEntity=true"/> 
     <split executorServiceRef="rolloverProfile"> 
      <simple>${body}</simple> 
      <setProperty propertyName="taskId"> 
       <simple>${body.taskId}</simple> 
      </setProperty> 
      <setProperty propertyName="providerId"> 
       <simple>${body.providerId}</simple> 
      </setProperty> 
      <setProperty propertyName="intakeId"> 
       <simple>${body.intakeId}</simple> 
      </setProperty> 
      <setProperty propertyName="consumed"> 
       <simple>${body.consumed}</simple> 
      </setProperty> 
      <to uri="jpa://cameltest.model.CamelTest?persistenceUnit=persistenceProvider"/> 
      <process ref="JPAToMCS"/> 
      <process ref="MCSRequest"/> 
      <process ref="MCSToJPA"/> 
      <to uri="jpa://cameltest.model.CamelTest?persistenceUnit=persistenceProvider"/> 
     </split> 
    </route> 
</routeContext> 

CamelTest JPA Entity является:

package cameltest.model; 

import java.io.Serializable; 

import javax.persistence.Entity; 
import javax.persistence.Id; 
import javax.persistence.NamedQuery; 
import javax.persistence.Table; 

import org.apache.camel.component.jpa.Consumed; 
import org.springframework.transaction.annotation.Transactional; 

@Entity 
@Table(name="CamelTestTable") 
@NamedQuery(name = "unconsumedEntries", query = "select c from CamelTest c where c.consumed = 0") 
public class CamelTest implements Serializable { 


    private static final long serialVersionUID = 5608716486854758950L; 
    @Id 
    private Integer taskId; 
    private Integer providerId; 
    private Integer intakeId; 
    private Integer consumed; 
    private Integer complete; 


    public CamelTest() 
    {} 

    public CamelTest(Integer taskId, Integer providerId, Integer intakeId, 
      Integer consumed, Integer complete) { 
     super(); 
     this.taskId = taskId; 
     this.providerId = providerId; 
     this.intakeId = intakeId; 
     this.consumed = consumed; 
     this.complete = complete; 
    } 

    public Integer getComplete() { 
     return complete; 
    } 

    public void setComplete(Integer complete) { 
     this.complete = complete; 
    } 

    public Integer getConsumed() { 
     return consumed; 
    } 

    public void setConsumed(Integer consumed) { 
     this.consumed = consumed; 
    } 

    public Integer getTaskId() { 
     return taskId; 
    } 

    public void setTaskId(Integer taskId) { 
     this.taskId = taskId; 
    } 

    public Integer getProviderId() { 
     return providerId; 
    } 

    public void setProviderId(Integer providerId) { 
     this.providerId = providerId; 
    } 

    public Integer getIntakeId() { 
     return intakeId; 
    } 

    public void setIntakeId(Integer intakeId) { 
     this.intakeId = intakeId; 
    } 

    @Override 
    public String toString() { 
     return "CamelTest [taskId=" + taskId + ", providerId=" + providerId 
       + ", intakeId=" + intakeId + "]"; 
    } 

    @Consumed 
    public void markAsConsumed() 
    { 
     setConsumed(getConsumed() + 1); 
    } 

} 

Как я могу заставить маршрут верблюда предание статус столбца потребления до конца? Средний процессор занимает много времени, и я хочу, чтобы он был использован для базы данных до того, как он был завершен (и отмечен).

ответ

1

Один из способов я нашел делать это маршрутизировать объект JPA в отдельном потоке, чтобы сохраниться его, в то время как другой поток делает обработку:

 <route id="pickUpEntries"> 
     <from 
      uri="jpa:/batchprocessor.model.BatchProcess?consumer.namedQuery=unconsumedEntries&amp;?consumeDelete=false&amp;persistenceUnit=persistenceProvider&amp;consumeLockEntity=true" /> 
     <process ref="Consume" /> 
     <multicast parallelProcessing="true"> 
      <to 
       uri="jpa://batchprocessor.model.BatchProcess?persistenceUnit=persistenceProvider" /> 
      <to uri="direct:process" /> 
     </multicast> 
    </route> 

не является полностью удовлетворительным, но делает работу в этом дело. Мне также пришлось удалить @Consumed. Смутно он обрабатывается ПОСЛЕ завершения маршрутов, а не по мере обработки элемента.

+0

@Consumed не смущает. Прочтите документацию по адресу: http://camel.apache.org/jpa –

Смежные вопросы