2017-03-08 10 views
2

STH으로 구성된 Fiware Cygnus를 사용하고 있습니다. Cygnus가 어떤 엔티티에서 두 개 이상의 변경 사항에 대한 알림을 받으면 새로운 값을 STH으로 보낼 수 없습니다. collection already exists 오류가 기록되고 변경 내용이 저장되지 않습니다. 첫 번째 알림에서 모든 것이 잘됩니다.Fiware Cygnus - 오류 : Cygnus가 알림을 두 번 이상 수신하면 컬렉션이 이미 존재합니다.

나는 다음과 같은 단계를 수행 한 :

  • 이 실체를
  • 변경이 처음에 엔티티 속성

에 오리온에 알림 만들기를의 너 때문에 잘 작동 속성을 다시 변경하고 Cygnus가 오류를 표시합니다.

이 문제를 해결하는 방법은 무엇입니까?

전체 메시지는 다음과 같습니다 문서에 설명 된대로

것은 내가 용기 고정 표시기에서 니를 사용하고 있습니다 *.

* 여기에 실제 ip 대신 mongodb-ip:27017을 사용했습니다.

time=2017-03-08T11:51:05.164Z | lvl=ERROR | 
corr=53d86140-03f5-11e7-a70e-080027f6529d | 
trans=236416c2-776e-4cc0-91dc-29bca203ea2a | srv=red | subsrv=/red/red | 
comp=cygnus-ngsi | op=processRollbackedBatches |msg=com.telefonica.iot.cygnus.sinks.NGSISink[394] : 
Persistence error. Message: -, Command failed with error -1: 
'collection already exists' on server <mongodb-ip>:27017. The full response is 
{ "ok" : 0.0, "errmsg" : "collection already exists" }, Stack trace: 
[com.telefonica.iot.cygnus.sinks.NGSISTHSink.persistOne(NGSISTHSink.java:158), 
com.telefonica.iot.cygnus.sinks.NGSISTHSink.persistBatch(NGSISTHSink.java:93), 
com.telefonica.iot.cygnus.sinks.NGSISink.processRollbackedBatches(NGSISink.java:387), 
com.telefonica.iot.cygnus.sinks.NGSISink.process(NGSISink.java:370), 
org.apache.flume.sink.DefaultSinkProcessor.process(DefaultSinkProcessor.java:68), 
org.apache.flume.SinkRunner$PollingRunner.run(SinkRunner.java:147), 
java.lang.Thread.run(Thread.java:745)] 
time=2017-03-08T11:51:05.164Z | lvl=INFO | corr=53d86140-03f5-11e7-a70e-080027f6529d | trans=236416c2-776e-4cc0-91dc-29bca203ea2a | srv=red | subsrv=/red/red | comp=cygnus-ngsi | op=doRollbackAgain | msg=com.telefonica.iot.cygnus.sinks.NGSISink[464] : Finishing internal transaction (53d86140-03f5-11e7-a70e-080027f6529d), this was retry #10 

내 agent.conf (너)에 사용하고 구성은 다음과 같습니다

나는 다음의 conf있는 STH 측면에서
cygnus-ngsi.sources = http-source 
cygnus-ngsi.sinks = sth-sink 
cygnus-ngsi.channels = sth-channel 

cygnus-ngsi.sources.http-source.type = org.apache.flume.source.http.HTTPSource 
cygnus-ngsi.sources.http-source.channels = sth-channel 
cygnus-ngsi.sources.http-source.port = 5050 
cygnus-ngsi.sources.http-source.handler = com.telefonica.iot.cygnus.handlers.NGSIRestHandler 
cygnus-ngsi.sources.http-source.handler.notification_target = /notify 
cygnus-ngsi.sources.http-source.handler.default_service = default 
cygnus-ngsi.sources.http-source.handler.default_service_path =/
cygnus-ngsi.sources.http-source.interceptors = ts gi 
cygnus-ngsi.sources.http-source.interceptors.ts.type = timestamp 
cygnus-ngsi.sources.http-source.interceptors.gi.type = com.telefonica.iot.cygnus.interceptors.NGSIGroupingInterceptor$Builder 
cygnus-ngsi.sources.http-source.interceptors.gi.grouping_rules_conf_file = /opt/apache-flume/conf/grouping_rules.conf 

cygnus-ngsi.sinks.sth-sink.type = com.telefonica.iot.cygnus.sinks.NGSISTHSink 
cygnus-ngsi.sinks.sth-sink.channel = sth-channel 
#cygnus-ngsi.sinks.sth-sink.enable_encoding = false 
#cygnus-ngsi.sinks.sth-sink.enable_grouping = false 
#cygnus-ngsi.sinks.sth-sink.enable_name_mappings = false 
#cygnus-ngsi.sinks.sth-sink.enable_lowercase = false 
cygnus-ngsi.sinks.sth-sink.data_model = dm-by-entity 
cygnus-ngsi.sinks.sth-sink.mongo_hosts = <mongodb-ip>:27017 
cygnus-ngsi.sinks.sth-sink.mongo_username = 
cygnus-ngsi.sinks.sth-sink.mongo_password = 
cygnus-ngsi.sinks.sth-sink.db_prefix = sth_ 
cygnus-ngsi.sinks.sth-sink.collection_prefix = sth_ 
cygnus-ngsi.sinks.sth-sink.resolutions = day,hour,minute 
#cygnus-ngsi.sinks.sth-sink.batch_size = 1 
#cygnus-ngsi.sinks.sth-sink.batch_timeout = 30 
#cygnus-ngsi.sinks.sth-sink.batch_ttl = 10 
#cygnus-ngsi.sinks.sth-sink.data_expiration = 0 
#cygnus-ngsi.sinks.sth-sink.ignore_white_spaces = true 


cygnus-ngsi.channels.sth-channel.type = com.telefonica.iot.cygnus.channels.CygnusMemoryChannel 
cygnus-ngsi.channels.sth-channel.capacity = 1000 
cygnus-ngsi.channels.sth-channel.transactionCapacity = 100 

:

var config = {}; 

// STH server configuration 
//-------------------------- 
config.server = { 

    host: '10.0.2.15', 

    port: '8666', 


    defaultService: 'testservice', 


    defaultServicePath: '/testservicepath', 


    filterOutEmpty: 'true', 

    aggregationBy: ['day', 'hour', 'minute'], 

    temporalDir: 'temp' 
}; 

// Database configuration 
//------------------------ 
config.database = { 

    dataModel: 'collection-per-entity', 
user: '', 

    password: '', 

    URI: 'localhost:27017', 

    replicaSet: '', 

    prefix: 'sth_', 


    collectionPrefix: 'sth_', 

    poolSize: '5', 


    shouldStore: 'both', 
    truncation: { 


    expireAfterSeconds: '0', 
    size: '0', 

    max: '0' 
    }, 

    ignoreBlankSpaces: 'true', 
    nameMapping: { 

    enabled: 'false', 

    configFile: './name-mapping.json' 
    }, 

    nameEncoding: 'false' 
}; 

// Logging configuration 
//------------------------ 
config.logging = { 
    level: 'info', 
    NODE_ENV variable is set to 'development'. 

    format: 'pipe', 


    proofOfLifeInterval: '60' 
}; 

module.exports = config; 
+0

어떤 MongoDB 버전을 사용하고 있습니까? – frb

+0

v2.6.12을 사용 중입니다. –

+1

https://github.com/telefonicaid/fiware-cygnus/blob/master/doc/cygnus-ngsi/flume_extensions_catalogue/ngsi_mongo_sink.md#section2.3.4 :) – frb

답변

2

MongoDB의 오류 처리를 버전에 따라 다를 수있는 예외 메시지를 기반으로합니다.

Cygnus가 예외 메시지 내에서 "code" : 48 문자열을 감지하도록 코딩되었으므로 컬렉션이 이미 존재하며 아무 것도 수행되지 않습니다. "아무것도 수행되지 않음"은 콜렉션이 작성되지 않았으며 (이미 있으므로) 콜렉션이 원래 예외가 진행되지 않았 음을 의미합니다.

MongoDB 버전이 "code" : 48 문자열을 포함하지 않는 메시지를 반환 할 때 문제가 발생합니다. 이 경우, 예외는 "이미 존재하는 콜렉션"과 다른 것으로 가정되어 진행됩니다. 이것은 귀하의 경우에 일어난 일입니다.

+0

감사합니다. @frb! 코드에 대한 기고가 환영합니까? –

+0

물론! 당신은 무엇에 대한 생각? – frb

+0

이전 버전을 지원하려고합니다. 그게 좋은 생각이라고 생각하니? –