Commit 7926dd47 authored by 宋新宇's avatar 宋新宇

抖音短剧归因

parent 17e05343
[traceId=] 2024-03-14 16:00:33.214 -ERROR http-nio-8081-exec-1:o.a.c.c.C.[.[.[.[dispatcherServlet]:175 - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.jdbc.IncorrectResultSetColumnCountException: Incorrect column count: expected 1, actual 5] with root cause
org.springframework.jdbc.IncorrectResultSetColumnCountException: Incorrect column count: expected 1, actual 5
at org.springframework.jdbc.core.SingleColumnRowMapper.mapRow(SingleColumnRowMapper.java:108)
at org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:94)
at org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:61)
at org.springframework.jdbc.core.JdbcTemplate$1QueryStatementCallback.doInStatement(JdbcTemplate.java:453)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:381)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:465)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:475)
at org.springframework.jdbc.core.JdbcTemplate.queryForList(JdbcTemplate.java:520)
at com.lwby.marketing.controller.AttrController.getCrossPlatformMedia(AttrController.java:182)
at com.lwby.marketing.controller.AttrController.testCross(AttrController.java:171)
at com.lwby.marketing.controller.AttrController$$FastClassBySpringCGLIB$$5028e458.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
at org.springframework.aop.framework.CglibAopProxy.invokeMethod(CglibAopProxy.java:386)
at org.springframework.aop.framework.CglibAopProxy.access$000(CglibAopProxy.java:85)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:704)
at com.lwby.marketing.controller.AttrController$$EnhancerBySpringCGLIB$$bf0173ff.testCross(<generated>)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1071)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:964)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:670)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:779)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:96)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:893)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1789)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
[traceId=] 2024-03-14 16:00:33.264 -ERROR org.springframework.kafka.KafkaListenerEndpointContainer#2-0-C-1:o.a.k.c.c.i.ConsumerCoordinator:1231 - [Consumer clientId=consumer-test_novel_dy_active-1, groupId=test_novel_dy_active] Offset commit failed on partition testNovelActive-0 at offset 0: The coordinator is not aware of this member.
[traceId=] 2024-03-14 16:08:15.695 -ERROR http-nio-8081-exec-2:o.a.c.c.C.[.[.[.[dispatcherServlet]:175 - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.jdbc.IncorrectResultSetColumnCountException: Incorrect column count: expected 1, actual 4] with root cause
org.springframework.jdbc.IncorrectResultSetColumnCountException: Incorrect column count: expected 1, actual 4
at org.springframework.jdbc.core.SingleColumnRowMapper.mapRow(SingleColumnRowMapper.java:108)
at org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:94)
at org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:61)
at org.springframework.jdbc.core.JdbcTemplate$1QueryStatementCallback.doInStatement(JdbcTemplate.java:453)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:381)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:465)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:475)
at org.springframework.jdbc.core.JdbcTemplate.queryForList(JdbcTemplate.java:520)
at com.lwby.marketing.controller.AttrController.getCrossPlatformMedia(AttrController.java:182)
at com.lwby.marketing.controller.AttrController.testCross(AttrController.java:171)
at com.lwby.marketing.controller.AttrController$$FastClassBySpringCGLIB$$5028e458.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
at org.springframework.aop.framework.CglibAopProxy.invokeMethod(CglibAopProxy.java:386)
at org.springframework.aop.framework.CglibAopProxy.access$000(CglibAopProxy.java:85)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:704)
at com.lwby.marketing.controller.AttrController$$EnhancerBySpringCGLIB$$e991faaa.testCross(<generated>)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1071)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:964)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:670)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:779)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:96)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:893)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1789)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
This source diff could not be displayed because it is too large. You can view the blob instead.
[traceId=] 2024-03-07 16:45:12.921 -ERROR org.springframework.kafka.KafkaListenerEndpointContainer#2-0-C-1:c.l.m.a.s.StoryNovelPayConsumer:46 - story.novel.pay.onMessage failed, data={"clientInfo":{"pkv":1,"platformId":601},"createTime":1709800560175,"extraData":{},"id":"17e45093-f226-4ee3-a6c8-c3bf363f61a6","openId":"_0001oR1eBGI2jG-UEcOlP4xI1qhuRLIbuo2","productId":"1","userId":3,"userUploadEvent":2}, costTime=6547 ms
java.lang.NullPointerException: null
at com.lwby.marketing.att.storynovel.handle.ParameterSetupStoryNovelFlow.process(ParameterSetupStoryNovelFlow.java:47)
at com.lwby.marketing.att.storynovel.handle.ParameterSetupStoryNovelFlow.process(ParameterSetupStoryNovelFlow.java:18)
at com.lwby.marketing.flow.FlowExecutor.executeNormalNode(FlowExecutor.java:51)
at com.lwby.marketing.flow.FlowExecutor.execute(FlowExecutor.java:32)
at com.lwby.marketing.att.storynovel.StoryNovelPayConsumer.onMessage(StoryNovelPayConsumer.java:44)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:169)
at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:119)
at org.springframework.kafka.listener.adapter.HandlerAdapter.invoke(HandlerAdapter.java:56)
at org.springframework.kafka.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:347)
at org.springframework.kafka.listener.adapter.RecordMessagingMessageListenerAdapter.onMessage(RecordMessagingMessageListenerAdapter.java:92)
at org.springframework.kafka.listener.adapter.RecordMessagingMessageListenerAdapter.onMessage(RecordMessagingMessageListenerAdapter.java:53)
at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.doInvokeOnMessage(KafkaMessageListenerContainer.java:2588)
at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.invokeOnMessage(KafkaMessageListenerContainer.java:2569)
at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.doInvokeRecordListener(KafkaMessageListenerContainer.java:2483)
at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.doInvokeWithRecords(KafkaMessageListenerContainer.java:2405)
at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.invokeRecordListener(KafkaMessageListenerContainer.java:2284)
at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.invokeListener(KafkaMessageListenerContainer.java:1958)
at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.invokeIfHaveRecords(KafkaMessageListenerContainer.java:1353)
at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.pollAndInvoke(KafkaMessageListenerContainer.java:1344)
at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.run(KafkaMessageListenerContainer.java:1236)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:266)
at java.util.concurrent.FutureTask.run(FutureTask.java)
at java.lang.Thread.run(Thread.java:748)
[traceId=] 2024-03-07 16:44:58.302 - INFO main:c.l.marketing.Main:55 - Starting Main using Java 1.8.0_141 on DESKTOP-7OBDIPT with PID 14056 (D:\lanwan\workspace\20240122\marketing\target\classes started by Lenovo in D:\lanwan\workspace\20240122\marketing)
[traceId=] 2024-03-07 16:44:58.307 - INFO main:c.l.marketing.Main:640 - The following 1 profile is active: "test"
[traceId=] 2024-03-07 16:44:59.734 - INFO main:o.s.d.r.c.RepositoryConfigurationDelegate:262 - Multiple Spring Data modules found, entering strict repository configuration mode
[traceId=] 2024-03-07 16:44:59.737 - INFO main:o.s.d.r.c.RepositoryConfigurationDelegate:132 - Bootstrapping Spring Data Redis repositories in DEFAULT mode.
[traceId=] 2024-03-07 16:44:59.781 - INFO main:o.s.d.r.c.RepositoryConfigurationDelegate:201 - Finished Spring Data repository scanning in 23 ms. Found 0 Redis repository interfaces.
[traceId=] 2024-03-07 16:45:00.100 - INFO main:o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker:376 - Bean 'com.alicp.jetcache.anno.config.JetCacheProxyConfiguration' of type [com.alicp.jetcache.anno.config.JetCacheProxyConfiguration$$EnhancerBySpringCGLIB$$10e98224] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
[traceId=] 2024-03-07 16:45:00.162 - INFO main:o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker:376 - Bean 'com.alicp.jetcache.anno.config.CommonConfiguration' of type [com.alicp.jetcache.anno.config.CommonConfiguration$$EnhancerBySpringCGLIB$$8fefc79c] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
[traceId=] 2024-03-07 16:45:00.524 - INFO main:o.s.b.w.e.t.TomcatWebServer:108 - Tomcat initialized with port(s): 8081 (http)
[traceId=] 2024-03-07 16:45:00.532 - INFO main:o.a.c.h.Http11NioProtocol:173 - Initializing ProtocolHandler ["http-nio-8081"]
[traceId=] 2024-03-07 16:45:00.533 - INFO main:o.a.c.c.StandardService:173 - Starting service [Tomcat]
[traceId=] 2024-03-07 16:45:00.533 - INFO main:o.a.c.c.StandardEngine:173 - Starting Servlet engine: [Apache Tomcat/9.0.68]
[traceId=] 2024-03-07 16:45:00.771 - INFO main:o.a.c.c.C.[.[.[/]:173 - Initializing Spring embedded WebApplicationContext
[traceId=] 2024-03-07 16:45:00.771 - INFO main:o.s.b.w.s.c.ServletWebServerApplicationContext:292 - Root WebApplicationContext: initialization completed in 2330 ms
[traceId=] 2024-03-07 16:45:01.807 - INFO main:c.a.j.a.AbstractCacheAutoInit:65 - init cache area default , type= linkedhashmap
[traceId=] 2024-03-07 16:45:01.830 - INFO main:c.a.j.s.DefaultMetricsManager:84 - cache stat period at 15 MINUTES
[traceId=] 2024-03-07 16:45:02.342 - INFO main:o.s.b.a.e.w.EndpointLinksResolver:58 - Exposing 13 endpoint(s) beneath base path '/actuator'
[traceId=] 2024-03-07 16:45:02.461 - INFO main:o.a.k.c.c.ConsumerConfig:376 - ConsumerConfig values:
allow.auto.create.topics = true
auto.commit.interval.ms = 5000
auto.offset.reset = earliest
bootstrap.servers = [172.17.255.113:9092]
check.crcs = true
client.dns.lookup = use_all_dns_ips
client.id = consumer-test_story_dy_pay-1
client.rack =
connections.max.idle.ms = 540000
default.api.timeout.ms = 60000
enable.auto.commit = true
exclude.internal.topics = true
fetch.max.bytes = 52428800
fetch.max.wait.ms = 500
fetch.min.bytes = 1
group.id = test_story_dy_pay
group.instance.id = null
heartbeat.interval.ms = 3000
interceptor.classes = []
internal.leave.group.on.close = true
internal.throw.on.fetch.stable.offset.unsupported = false
isolation.level = read_uncommitted
key.deserializer = class org.apache.kafka.common.serialization.StringDeserializer
max.partition.fetch.bytes = 1048576
max.poll.interval.ms = 300000
max.poll.records = 500
metadata.max.age.ms = 300000
metric.reporters = []
metrics.num.samples = 2
metrics.recording.level = INFO
metrics.sample.window.ms = 30000
partition.assignment.strategy = [class org.apache.kafka.clients.consumer.RangeAssignor, class org.apache.kafka.clients.consumer.CooperativeStickyAssignor]
receive.buffer.bytes = 65536
reconnect.backoff.max.ms = 1000
reconnect.backoff.ms = 50
request.timeout.ms = 30000
retry.backoff.ms = 100
sasl.client.callback.handler.class = null
sasl.jaas.config = null
sasl.kerberos.kinit.cmd = /usr/bin/kinit
sasl.kerberos.min.time.before.relogin = 60000
sasl.kerberos.service.name = null
sasl.kerberos.ticket.renew.jitter = 0.05
sasl.kerberos.ticket.renew.window.factor = 0.8
sasl.login.callback.handler.class = null
sasl.login.class = null
sasl.login.connect.timeout.ms = null
sasl.login.read.timeout.ms = null
sasl.login.refresh.buffer.seconds = 300
sasl.login.refresh.min.period.seconds = 60
sasl.login.refresh.window.factor = 0.8
sasl.login.refresh.window.jitter = 0.05
sasl.login.retry.backoff.max.ms = 10000
sasl.login.retry.backoff.ms = 100
sasl.mechanism = GSSAPI
sasl.oauthbearer.clock.skew.seconds = 30
sasl.oauthbearer.expected.audience = null
sasl.oauthbearer.expected.issuer = null
sasl.oauthbearer.jwks.endpoint.refresh.ms = 3600000
sasl.oauthbearer.jwks.endpoint.retry.backoff.max.ms = 10000
sasl.oauthbearer.jwks.endpoint.retry.backoff.ms = 100
sasl.oauthbearer.jwks.endpoint.url = null
sasl.oauthbearer.scope.claim.name = scope
sasl.oauthbearer.sub.claim.name = sub
sasl.oauthbearer.token.endpoint.url = null
security.protocol = PLAINTEXT
security.providers = null
send.buffer.bytes = 131072
session.timeout.ms = 45000
socket.connection.setup.timeout.max.ms = 30000
socket.connection.setup.timeout.ms = 10000
ssl.cipher.suites = null
ssl.enabled.protocols = [TLSv1.2]
ssl.endpoint.identification.algorithm = https
ssl.engine.factory.class = null
ssl.key.password = null
ssl.keymanager.algorithm = SunX509
ssl.keystore.certificate.chain = null
ssl.keystore.key = null
ssl.keystore.location = null
ssl.keystore.password = null
ssl.keystore.type = JKS
ssl.protocol = TLSv1.2
ssl.provider = null
ssl.secure.random.implementation = null
ssl.trustmanager.algorithm = PKIX
ssl.truststore.certificates = null
ssl.truststore.location = null
ssl.truststore.password = null
ssl.truststore.type = JKS
value.deserializer = class org.apache.kafka.common.serialization.StringDeserializer
[traceId=] 2024-03-07 16:45:02.555 - INFO main:o.a.k.c.u.AppInfoParser:119 - Kafka version: 3.1.2
[traceId=] 2024-03-07 16:45:02.555 - INFO main:o.a.k.c.u.AppInfoParser:120 - Kafka commitId: f8c67dc3ae0a3265
[traceId=] 2024-03-07 16:45:02.555 - INFO main:o.a.k.c.u.AppInfoParser:121 - Kafka startTimeMs: 1709801102553
[traceId=] 2024-03-07 16:45:02.586 - INFO main:o.a.k.c.c.KafkaConsumer:966 - [Consumer clientId=consumer-test_story_dy_pay-1, groupId=test_story_dy_pay] Subscribed to topic(s): testStoryNovelpay
[traceId=] 2024-03-07 16:45:02.603 - INFO main:o.a.k.c.c.ConsumerConfig:376 - ConsumerConfig values:
allow.auto.create.topics = true
auto.commit.interval.ms = 5000
auto.offset.reset = earliest
bootstrap.servers = [172.17.255.113:9092]
check.crcs = true
client.dns.lookup = use_all_dns_ips
client.id = consumer-test_novel_dy_active-2
client.rack =
connections.max.idle.ms = 540000
default.api.timeout.ms = 60000
enable.auto.commit = true
exclude.internal.topics = true
fetch.max.bytes = 52428800
fetch.max.wait.ms = 500
fetch.min.bytes = 1
group.id = test_novel_dy_active
group.instance.id = null
heartbeat.interval.ms = 3000
interceptor.classes = []
internal.leave.group.on.close = true
internal.throw.on.fetch.stable.offset.unsupported = false
isolation.level = read_uncommitted
key.deserializer = class org.apache.kafka.common.serialization.StringDeserializer
max.partition.fetch.bytes = 1048576
max.poll.interval.ms = 300000
max.poll.records = 500
metadata.max.age.ms = 300000
metric.reporters = []
metrics.num.samples = 2
metrics.recording.level = INFO
metrics.sample.window.ms = 30000
partition.assignment.strategy = [class org.apache.kafka.clients.consumer.RangeAssignor, class org.apache.kafka.clients.consumer.CooperativeStickyAssignor]
receive.buffer.bytes = 65536
reconnect.backoff.max.ms = 1000
reconnect.backoff.ms = 50
request.timeout.ms = 30000
retry.backoff.ms = 100
sasl.client.callback.handler.class = null
sasl.jaas.config = null
sasl.kerberos.kinit.cmd = /usr/bin/kinit
sasl.kerberos.min.time.before.relogin = 60000
sasl.kerberos.service.name = null
sasl.kerberos.ticket.renew.jitter = 0.05
sasl.kerberos.ticket.renew.window.factor = 0.8
sasl.login.callback.handler.class = null
sasl.login.class = null
sasl.login.connect.timeout.ms = null
sasl.login.read.timeout.ms = null
sasl.login.refresh.buffer.seconds = 300
sasl.login.refresh.min.period.seconds = 60
sasl.login.refresh.window.factor = 0.8
sasl.login.refresh.window.jitter = 0.05
sasl.login.retry.backoff.max.ms = 10000
sasl.login.retry.backoff.ms = 100
sasl.mechanism = GSSAPI
sasl.oauthbearer.clock.skew.seconds = 30
sasl.oauthbearer.expected.audience = null
sasl.oauthbearer.expected.issuer = null
sasl.oauthbearer.jwks.endpoint.refresh.ms = 3600000
sasl.oauthbearer.jwks.endpoint.retry.backoff.max.ms = 10000
sasl.oauthbearer.jwks.endpoint.retry.backoff.ms = 100
sasl.oauthbearer.jwks.endpoint.url = null
sasl.oauthbearer.scope.claim.name = scope
sasl.oauthbearer.sub.claim.name = sub
sasl.oauthbearer.token.endpoint.url = null
security.protocol = PLAINTEXT
security.providers = null
send.buffer.bytes = 131072
session.timeout.ms = 45000
socket.connection.setup.timeout.max.ms = 30000
socket.connection.setup.timeout.ms = 10000
ssl.cipher.suites = null
ssl.enabled.protocols = [TLSv1.2]
ssl.endpoint.identification.algorithm = https
ssl.engine.factory.class = null
ssl.key.password = null
ssl.keymanager.algorithm = SunX509
ssl.keystore.certificate.chain = null
ssl.keystore.key = null
ssl.keystore.location = null
ssl.keystore.password = null
ssl.keystore.type = JKS
ssl.protocol = TLSv1.2
ssl.provider = null
ssl.secure.random.implementation = null
ssl.trustmanager.algorithm = PKIX
ssl.truststore.certificates = null
ssl.truststore.location = null
ssl.truststore.password = null
ssl.truststore.type = JKS
value.deserializer = class org.apache.kafka.common.serialization.StringDeserializer
[traceId=] 2024-03-07 16:45:02.616 - INFO main:o.a.k.c.u.AppInfoParser:119 - Kafka version: 3.1.2
[traceId=] 2024-03-07 16:45:02.616 - INFO main:o.a.k.c.u.AppInfoParser:120 - Kafka commitId: f8c67dc3ae0a3265
[traceId=] 2024-03-07 16:45:02.616 - INFO main:o.a.k.c.u.AppInfoParser:121 - Kafka startTimeMs: 1709801102616
[traceId=] 2024-03-07 16:45:02.629 - INFO main:o.a.k.c.c.KafkaConsumer:966 - [Consumer clientId=consumer-test_novel_dy_active-2, groupId=test_novel_dy_active] Subscribed to topic(s): testNovelActive
[traceId=] 2024-03-07 16:45:02.633 - INFO main:o.a.k.c.c.ConsumerConfig:376 - ConsumerConfig values:
allow.auto.create.topics = true
auto.commit.interval.ms = 5000
auto.offset.reset = earliest
bootstrap.servers = [172.17.255.113:9092]
check.crcs = true
client.dns.lookup = use_all_dns_ips
client.id = consumer-test_story_dy_active-3
client.rack =
connections.max.idle.ms = 540000
default.api.timeout.ms = 60000
enable.auto.commit = true
exclude.internal.topics = true
fetch.max.bytes = 52428800
fetch.max.wait.ms = 500
fetch.min.bytes = 1
group.id = test_story_dy_active
group.instance.id = null
heartbeat.interval.ms = 3000
interceptor.classes = []
internal.leave.group.on.close = true
internal.throw.on.fetch.stable.offset.unsupported = false
isolation.level = read_uncommitted
key.deserializer = class org.apache.kafka.common.serialization.StringDeserializer
max.partition.fetch.bytes = 1048576
max.poll.interval.ms = 300000
max.poll.records = 500
metadata.max.age.ms = 300000
metric.reporters = []
metrics.num.samples = 2
metrics.recording.level = INFO
metrics.sample.window.ms = 30000
partition.assignment.strategy = [class org.apache.kafka.clients.consumer.RangeAssignor, class org.apache.kafka.clients.consumer.CooperativeStickyAssignor]
receive.buffer.bytes = 65536
reconnect.backoff.max.ms = 1000
reconnect.backoff.ms = 50
request.timeout.ms = 30000
retry.backoff.ms = 100
sasl.client.callback.handler.class = null
sasl.jaas.config = null
sasl.kerberos.kinit.cmd = /usr/bin/kinit
sasl.kerberos.min.time.before.relogin = 60000
sasl.kerberos.service.name = null
sasl.kerberos.ticket.renew.jitter = 0.05
sasl.kerberos.ticket.renew.window.factor = 0.8
sasl.login.callback.handler.class = null
sasl.login.class = null
sasl.login.connect.timeout.ms = null
sasl.login.read.timeout.ms = null
sasl.login.refresh.buffer.seconds = 300
sasl.login.refresh.min.period.seconds = 60
sasl.login.refresh.window.factor = 0.8
sasl.login.refresh.window.jitter = 0.05
sasl.login.retry.backoff.max.ms = 10000
sasl.login.retry.backoff.ms = 100
sasl.mechanism = GSSAPI
sasl.oauthbearer.clock.skew.seconds = 30
sasl.oauthbearer.expected.audience = null
sasl.oauthbearer.expected.issuer = null
sasl.oauthbearer.jwks.endpoint.refresh.ms = 3600000
sasl.oauthbearer.jwks.endpoint.retry.backoff.max.ms = 10000
sasl.oauthbearer.jwks.endpoint.retry.backoff.ms = 100
sasl.oauthbearer.jwks.endpoint.url = null
sasl.oauthbearer.scope.claim.name = scope
sasl.oauthbearer.sub.claim.name = sub
sasl.oauthbearer.token.endpoint.url = null
security.protocol = PLAINTEXT
security.providers = null
send.buffer.bytes = 131072
session.timeout.ms = 45000
socket.connection.setup.timeout.max.ms = 30000
socket.connection.setup.timeout.ms = 10000
ssl.cipher.suites = null
ssl.enabled.protocols = [TLSv1.2]
ssl.endpoint.identification.algorithm = https
ssl.engine.factory.class = null
ssl.key.password = null
ssl.keymanager.algorithm = SunX509
ssl.keystore.certificate.chain = null
ssl.keystore.key = null
ssl.keystore.location = null
ssl.keystore.password = null
ssl.keystore.type = JKS
ssl.protocol = TLSv1.2
ssl.provider = null
ssl.secure.random.implementation = null
ssl.trustmanager.algorithm = PKIX
ssl.truststore.certificates = null
ssl.truststore.location = null
ssl.truststore.password = null
ssl.truststore.type = JKS
value.deserializer = class org.apache.kafka.common.serialization.StringDeserializer
[traceId=] 2024-03-07 16:45:02.645 - INFO main:o.a.k.c.u.AppInfoParser:119 - Kafka version: 3.1.2
[traceId=] 2024-03-07 16:45:02.646 - INFO main:o.a.k.c.u.AppInfoParser:120 - Kafka commitId: f8c67dc3ae0a3265
[traceId=] 2024-03-07 16:45:02.646 - INFO main:o.a.k.c.u.AppInfoParser:121 - Kafka startTimeMs: 1709801102645
[traceId=] 2024-03-07 16:45:02.658 - INFO main:o.a.k.c.c.KafkaConsumer:966 - [Consumer clientId=consumer-test_story_dy_active-3, groupId=test_story_dy_active] Subscribed to topic(s): testStoryNovelActive
[traceId=] 2024-03-07 16:45:02.660 - INFO main:o.a.c.h.Http11NioProtocol:173 - Starting ProtocolHandler ["http-nio-8081"]
[traceId=] 2024-03-07 16:45:02.679 - INFO main:o.s.b.w.e.t.TomcatWebServer:220 - Tomcat started on port(s): 8081 (http) with context path ''
[traceId=] 2024-03-07 16:45:02.704 - INFO main:c.l.marketing.Main:61 - Started Main in 5.213 seconds (JVM running for 8.565)
[traceId=] 2024-03-07 16:45:03.129 - INFO org.springframework.kafka.KafkaListenerEndpointContainer#2-0-C-1:o.a.k.c.Metadata:287 - [Consumer clientId=consumer-test_story_dy_pay-1, groupId=test_story_dy_pay] Cluster ID: S20Z6oWOQ5-RFjHUZlW-lQ
[traceId=] 2024-03-07 16:45:03.129 - INFO org.springframework.kafka.KafkaListenerEndpointContainer#1-0-C-1:o.a.k.c.Metadata:287 - [Consumer clientId=consumer-test_story_dy_active-3, groupId=test_story_dy_active] Cluster ID: S20Z6oWOQ5-RFjHUZlW-lQ
[traceId=] 2024-03-07 16:45:03.130 - INFO org.springframework.kafka.KafkaListenerEndpointContainer#0-0-C-1:o.a.k.c.Metadata:287 - [Consumer clientId=consumer-test_novel_dy_active-2, groupId=test_novel_dy_active] Cluster ID: S20Z6oWOQ5-RFjHUZlW-lQ
[traceId=] 2024-03-07 16:45:03.132 - INFO org.springframework.kafka.KafkaListenerEndpointContainer#1-0-C-1:o.a.k.c.c.i.ConsumerCoordinator:853 - [Consumer clientId=consumer-test_story_dy_active-3, groupId=test_story_dy_active] Discovered group coordinator 172.17.255.113:9092 (id: 2147482868 rack: null)
[traceId=] 2024-03-07 16:45:03.132 - INFO org.springframework.kafka.KafkaListenerEndpointContainer#0-0-C-1:o.a.k.c.c.i.ConsumerCoordinator:853 - [Consumer clientId=consumer-test_novel_dy_active-2, groupId=test_novel_dy_active] Discovered group coordinator 172.17.255.113:9092 (id: 2147482868 rack: null)
[traceId=] 2024-03-07 16:45:03.132 - INFO org.springframework.kafka.KafkaListenerEndpointContainer#2-0-C-1:o.a.k.c.c.i.ConsumerCoordinator:853 - [Consumer clientId=consumer-test_story_dy_pay-1, groupId=test_story_dy_pay] Discovered group coordinator 172.17.255.113:9092 (id: 2147482868 rack: null)
[traceId=] 2024-03-07 16:45:03.138 - INFO org.springframework.kafka.KafkaListenerEndpointContainer#0-0-C-1:o.a.k.c.c.i.ConsumerCoordinator:535 - [Consumer clientId=consumer-test_novel_dy_active-2, groupId=test_novel_dy_active] (Re-)joining group
[traceId=] 2024-03-07 16:45:03.138 - INFO org.springframework.kafka.KafkaListenerEndpointContainer#1-0-C-1:o.a.k.c.c.i.ConsumerCoordinator:535 - [Consumer clientId=consumer-test_story_dy_active-3, groupId=test_story_dy_active] (Re-)joining group
[traceId=] 2024-03-07 16:45:03.138 - INFO org.springframework.kafka.KafkaListenerEndpointContainer#2-0-C-1:o.a.k.c.c.i.ConsumerCoordinator:535 - [Consumer clientId=consumer-test_story_dy_pay-1, groupId=test_story_dy_pay] (Re-)joining group
[traceId=] 2024-03-07 16:45:03.183 - INFO org.springframework.kafka.KafkaListenerEndpointContainer#0-0-C-1:o.a.k.c.c.i.ConsumerCoordinator:1000 - [Consumer clientId=consumer-test_novel_dy_active-2, groupId=test_novel_dy_active] Request joining group due to: need to re-join with the given member-id
[traceId=] 2024-03-07 16:45:03.183 - INFO org.springframework.kafka.KafkaListenerEndpointContainer#2-0-C-1:o.a.k.c.c.i.ConsumerCoordinator:1000 - [Consumer clientId=consumer-test_story_dy_pay-1, groupId=test_story_dy_pay] Request joining group due to: need to re-join with the given member-id
[traceId=] 2024-03-07 16:45:03.183 - INFO org.springframework.kafka.KafkaListenerEndpointContainer#1-0-C-1:o.a.k.c.c.i.ConsumerCoordinator:1000 - [Consumer clientId=consumer-test_story_dy_active-3, groupId=test_story_dy_active] Request joining group due to: need to re-join with the given member-id
[traceId=] 2024-03-07 16:45:03.183 - INFO org.springframework.kafka.KafkaListenerEndpointContainer#2-0-C-1:o.a.k.c.c.i.ConsumerCoordinator:535 - [Consumer clientId=consumer-test_story_dy_pay-1, groupId=test_story_dy_pay] (Re-)joining group
[traceId=] 2024-03-07 16:45:03.183 - INFO org.springframework.kafka.KafkaListenerEndpointContainer#0-0-C-1:o.a.k.c.c.i.ConsumerCoordinator:535 - [Consumer clientId=consumer-test_novel_dy_active-2, groupId=test_novel_dy_active] (Re-)joining group
[traceId=] 2024-03-07 16:45:03.183 - INFO org.springframework.kafka.KafkaListenerEndpointContainer#1-0-C-1:o.a.k.c.c.i.ConsumerCoordinator:535 - [Consumer clientId=consumer-test_story_dy_active-3, groupId=test_story_dy_active] (Re-)joining group
[traceId=] 2024-03-07 16:45:04.284 - INFO RMI TCP Connection(1)-192.168.215.8:o.a.c.c.C.[.[.[/]:173 - Initializing Spring DispatcherServlet 'dispatcherServlet'
[traceId=] 2024-03-07 16:45:04.284 - INFO RMI TCP Connection(1)-192.168.215.8:o.s.w.s.DispatcherServlet:525 - Initializing Servlet 'dispatcherServlet'
[traceId=] 2024-03-07 16:45:04.286 - INFO RMI TCP Connection(1)-192.168.215.8:o.s.w.s.DispatcherServlet:547 - Completed initialization in 1 ms
[traceId=] 2024-03-07 16:45:06.197 - INFO org.springframework.kafka.KafkaListenerEndpointContainer#0-0-C-1:o.a.k.c.c.i.ConsumerCoordinator:595 - [Consumer clientId=consumer-test_novel_dy_active-2, groupId=test_novel_dy_active] Successfully joined group with generation Generation{generationId=46, memberId='consumer-test_novel_dy_active-2-32b27c7d-6d99-4e79-bd19-51275bc50916', protocol='range'}
[traceId=] 2024-03-07 16:45:06.197 - INFO org.springframework.kafka.KafkaListenerEndpointContainer#2-0-C-1:o.a.k.c.c.i.ConsumerCoordinator:595 - [Consumer clientId=consumer-test_story_dy_pay-1, groupId=test_story_dy_pay] Successfully joined group with generation Generation{generationId=46, memberId='consumer-test_story_dy_pay-1-75482434-1733-4062-82d9-f4b3c998bf2c', protocol='range'}
[traceId=] 2024-03-07 16:45:06.197 - INFO org.springframework.kafka.KafkaListenerEndpointContainer#1-0-C-1:o.a.k.c.c.i.ConsumerCoordinator:595 - [Consumer clientId=consumer-test_story_dy_active-3, groupId=test_story_dy_active] Successfully joined group with generation Generation{generationId=37, memberId='consumer-test_story_dy_active-3-f8be6b17-f994-487c-83ab-9e303d668b7d', protocol='range'}
[traceId=] 2024-03-07 16:45:06.207 - INFO org.springframework.kafka.KafkaListenerEndpointContainer#2-0-C-1:o.a.k.c.c.i.ConsumerCoordinator:659 - [Consumer clientId=consumer-test_story_dy_pay-1, groupId=test_story_dy_pay] Finished assignment for group at generation 46: {consumer-test_story_dy_pay-1-75482434-1733-4062-82d9-f4b3c998bf2c=Assignment(partitions=[testStoryNovelpay-0])}
[traceId=] 2024-03-07 16:45:06.207 - INFO org.springframework.kafka.KafkaListenerEndpointContainer#1-0-C-1:o.a.k.c.c.i.ConsumerCoordinator:659 - [Consumer clientId=consumer-test_story_dy_active-3, groupId=test_story_dy_active] Finished assignment for group at generation 37: {consumer-test_story_dy_active-3-f8be6b17-f994-487c-83ab-9e303d668b7d=Assignment(partitions=[testStoryNovelActive-0])}
[traceId=] 2024-03-07 16:45:06.207 - INFO org.springframework.kafka.KafkaListenerEndpointContainer#0-0-C-1:o.a.k.c.c.i.ConsumerCoordinator:659 - [Consumer clientId=consumer-test_novel_dy_active-2, groupId=test_novel_dy_active] Finished assignment for group at generation 46: {consumer-test_novel_dy_active-2-32b27c7d-6d99-4e79-bd19-51275bc50916=Assignment(partitions=[testNovelActive-0])}
[traceId=] 2024-03-07 16:45:06.243 - INFO org.springframework.kafka.KafkaListenerEndpointContainer#1-0-C-1:o.a.k.c.c.i.ConsumerCoordinator:761 - [Consumer clientId=consumer-test_story_dy_active-3, groupId=test_story_dy_active] Successfully synced group in generation Generation{generationId=37, memberId='consumer-test_story_dy_active-3-f8be6b17-f994-487c-83ab-9e303d668b7d', protocol='range'}
[traceId=] 2024-03-07 16:45:06.243 - INFO org.springframework.kafka.KafkaListenerEndpointContainer#0-0-C-1:o.a.k.c.c.i.ConsumerCoordinator:761 - [Consumer clientId=consumer-test_novel_dy_active-2, groupId=test_novel_dy_active] Successfully synced group in generation Generation{generationId=46, memberId='consumer-test_novel_dy_active-2-32b27c7d-6d99-4e79-bd19-51275bc50916', protocol='range'}
[traceId=] 2024-03-07 16:45:06.243 - INFO org.springframework.kafka.KafkaListenerEndpointContainer#2-0-C-1:o.a.k.c.c.i.ConsumerCoordinator:761 - [Consumer clientId=consumer-test_story_dy_pay-1, groupId=test_story_dy_pay] Successfully synced group in generation Generation{generationId=46, memberId='consumer-test_story_dy_pay-1-75482434-1733-4062-82d9-f4b3c998bf2c', protocol='range'}
[traceId=] 2024-03-07 16:45:06.244 - INFO org.springframework.kafka.KafkaListenerEndpointContainer#0-0-C-1:o.a.k.c.c.i.ConsumerCoordinator:280 - [Consumer clientId=consumer-test_novel_dy_active-2, groupId=test_novel_dy_active] Notifying assignor about the new Assignment(partitions=[testNovelActive-0])
[traceId=] 2024-03-07 16:45:06.244 - INFO org.springframework.kafka.KafkaListenerEndpointContainer#1-0-C-1:o.a.k.c.c.i.ConsumerCoordinator:280 - [Consumer clientId=consumer-test_story_dy_active-3, groupId=test_story_dy_active] Notifying assignor about the new Assignment(partitions=[testStoryNovelActive-0])
[traceId=] 2024-03-07 16:45:06.244 - INFO org.springframework.kafka.KafkaListenerEndpointContainer#2-0-C-1:o.a.k.c.c.i.ConsumerCoordinator:280 - [Consumer clientId=consumer-test_story_dy_pay-1, groupId=test_story_dy_pay] Notifying assignor about the new Assignment(partitions=[testStoryNovelpay-0])
[traceId=] 2024-03-07 16:45:06.250 - INFO org.springframework.kafka.KafkaListenerEndpointContainer#1-0-C-1:o.a.k.c.c.i.ConsumerCoordinator:292 - [Consumer clientId=consumer-test_story_dy_active-3, groupId=test_story_dy_active] Adding newly assigned partitions: testStoryNovelActive-0
[traceId=] 2024-03-07 16:45:06.250 - INFO org.springframework.kafka.KafkaListenerEndpointContainer#0-0-C-1:o.a.k.c.c.i.ConsumerCoordinator:292 - [Consumer clientId=consumer-test_novel_dy_active-2, groupId=test_novel_dy_active] Adding newly assigned partitions: testNovelActive-0
[traceId=] 2024-03-07 16:45:06.250 - INFO org.springframework.kafka.KafkaListenerEndpointContainer#2-0-C-1:o.a.k.c.c.i.ConsumerCoordinator:292 - [Consumer clientId=consumer-test_story_dy_pay-1, groupId=test_story_dy_pay] Adding newly assigned partitions: testStoryNovelpay-0
[traceId=] 2024-03-07 16:45:06.277 - INFO org.springframework.kafka.KafkaListenerEndpointContainer#2-0-C-1:o.a.k.c.c.i.ConsumerCoordinator:851 - [Consumer clientId=consumer-test_story_dy_pay-1, groupId=test_story_dy_pay] Setting offset for partition testStoryNovelpay-0 to the committed offset FetchPosition{offset=3, offsetEpoch=Optional[0], currentLeader=LeaderAndEpoch{leader=Optional[172.17.255.113:9092 (id: 779 rack: null)], epoch=absent}}
[traceId=] 2024-03-07 16:45:06.277 - INFO org.springframework.kafka.KafkaListenerEndpointContainer#1-0-C-1:o.a.k.c.c.i.ConsumerCoordinator:851 - [Consumer clientId=consumer-test_story_dy_active-3, groupId=test_story_dy_active] Setting offset for partition testStoryNovelActive-0 to the committed offset FetchPosition{offset=25, offsetEpoch=Optional[0], currentLeader=LeaderAndEpoch{leader=Optional[172.17.255.113:9092 (id: 779 rack: null)], epoch=absent}}
[traceId=] 2024-03-07 16:45:06.277 - INFO org.springframework.kafka.KafkaListenerEndpointContainer#0-0-C-1:o.a.k.c.c.i.ConsumerCoordinator:851 - [Consumer clientId=consumer-test_novel_dy_active-2, groupId=test_novel_dy_active] Setting offset for partition testNovelActive-0 to the committed offset FetchPosition{offset=0, offsetEpoch=Optional.empty, currentLeader=LeaderAndEpoch{leader=Optional[172.17.255.113:9092 (id: 779 rack: null)], epoch=absent}}
[traceId=] 2024-03-07 16:45:06.279 - INFO org.springframework.kafka.KafkaListenerEndpointContainer#1-0-C-1:o.s.k.l.KafkaMessageListenerContainer:292 - test_story_dy_active: partitions assigned: [testStoryNovelActive-0]
[traceId=] 2024-03-07 16:45:06.279 - INFO org.springframework.kafka.KafkaListenerEndpointContainer#0-0-C-1:o.s.k.l.KafkaMessageListenerContainer:292 - test_novel_dy_active: partitions assigned: [testNovelActive-0]
[traceId=] 2024-03-07 16:45:06.279 - INFO org.springframework.kafka.KafkaListenerEndpointContainer#2-0-C-1:o.s.k.l.KafkaMessageListenerContainer:292 - test_story_dy_pay: partitions assigned: [testStoryNovelpay-0]
[traceId=] 2024-03-07 16:45:11.253 - INFO org.springframework.kafka.KafkaListenerEndpointContainer#2-0-C-1:c.l.m.a.s.StoryNovelPayConsumer:32 - media.pay.story.onMessage start, data={"clientInfo":{"pkv":1,"platformId":601},"createTime":1709800560175,"extraData":{},"id":"17e45093-f226-4ee3-a6c8-c3bf363f61a6","openId":"_0001oR1eBGI2jG-UEcOlP4xI1qhuRLIbuo2","productId":"1","userId":3,"userUploadEvent":2}
[traceId=] 2024-03-07 16:45:11.690 - INFO org.springframework.kafka.KafkaListenerEndpointContainer#2-0-C-1:c.l.m.a.s.StoryNovelPayConsumer:39 - media.pay.story.topic=testStoryNovelpay, bookStoreEvent={"clientInfo":{"pkv":1,"platformId":601},"createTime":1709800560175,"extraData":{},"id":"17e45093-f226-4ee3-a6c8-c3bf363f61a6","openId":"_0001oR1eBGI2jG-UEcOlP4xI1qhuRLIbuo2","productId":"1","userId":3,"userUploadEvent":2}
[traceId=] 2024-03-07 16:45:12.921 -ERROR org.springframework.kafka.KafkaListenerEndpointContainer#2-0-C-1:c.l.m.a.s.StoryNovelPayConsumer:46 - story.novel.pay.onMessage failed, data={"clientInfo":{"pkv":1,"platformId":601},"createTime":1709800560175,"extraData":{},"id":"17e45093-f226-4ee3-a6c8-c3bf363f61a6","openId":"_0001oR1eBGI2jG-UEcOlP4xI1qhuRLIbuo2","productId":"1","userId":3,"userUploadEvent":2}, costTime=6547 ms
java.lang.NullPointerException: null
at com.lwby.marketing.att.storynovel.handle.ParameterSetupStoryNovelFlow.process(ParameterSetupStoryNovelFlow.java:47)
at com.lwby.marketing.att.storynovel.handle.ParameterSetupStoryNovelFlow.process(ParameterSetupStoryNovelFlow.java:18)
at com.lwby.marketing.flow.FlowExecutor.executeNormalNode(FlowExecutor.java:51)
at com.lwby.marketing.flow.FlowExecutor.execute(FlowExecutor.java:32)
at com.lwby.marketing.att.storynovel.StoryNovelPayConsumer.onMessage(StoryNovelPayConsumer.java:44)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:169)
at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:119)
at org.springframework.kafka.listener.adapter.HandlerAdapter.invoke(HandlerAdapter.java:56)
at org.springframework.kafka.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:347)
at org.springframework.kafka.listener.adapter.RecordMessagingMessageListenerAdapter.onMessage(RecordMessagingMessageListenerAdapter.java:92)
at org.springframework.kafka.listener.adapter.RecordMessagingMessageListenerAdapter.onMessage(RecordMessagingMessageListenerAdapter.java:53)
at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.doInvokeOnMessage(KafkaMessageListenerContainer.java:2588)
at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.invokeOnMessage(KafkaMessageListenerContainer.java:2569)
at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.doInvokeRecordListener(KafkaMessageListenerContainer.java:2483)
at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.doInvokeWithRecords(KafkaMessageListenerContainer.java:2405)
at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.invokeRecordListener(KafkaMessageListenerContainer.java:2284)
at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.invokeListener(KafkaMessageListenerContainer.java:1958)
at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.invokeIfHaveRecords(KafkaMessageListenerContainer.java:1353)
at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.pollAndInvoke(KafkaMessageListenerContainer.java:1344)
at org.springframework.kafka.listener.KafkaMessageListenerContainer$ListenerConsumer.run(KafkaMessageListenerContainer.java:1236)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:266)
at java.util.concurrent.FutureTask.run(FutureTask.java)
at java.lang.Thread.run(Thread.java:748)
[traceId=] 2024-03-13 22:07:55.156 -ERROR org.springframework.kafka.KafkaListenerEndpointContainer#2-0-C-1:o.a.k.c.c.i.ConsumerCoordinator:1231 - [Consumer clientId=consumer-test_novel_dy_active-1, groupId=test_novel_dy_active] Offset commit failed on partition testNovelActive-0 at offset 0: The coordinator is not aware of this member.
[traceId=] 2024-03-13 22:07:55.156 -ERROR org.springframework.kafka.KafkaListenerEndpointContainer#1-0-C-1:o.a.k.c.c.i.ConsumerCoordinator:1231 - [Consumer clientId=consumer-test_story_dy_pay-3, groupId=test_story_dy_pay] Offset commit failed on partition testStoryNovelpay-0 at offset 12: The coordinator is not aware of this member.
[traceId=] 2024-03-13 22:12:20.027 -ERROR org.springframework.kafka.KafkaListenerEndpointContainer#1-0-C-1:o.a.k.c.c.i.ConsumerCoordinator:1231 - [Consumer clientId=consumer-test_story_dy_pay-3, groupId=test_story_dy_pay] Offset commit failed on partition testStoryNovelpay-0 at offset 12: The coordinator is not aware of this member.
[traceId=] 2024-03-13 22:12:20.028 -ERROR org.springframework.kafka.KafkaListenerEndpointContainer#2-0-C-1:o.a.k.c.c.i.ConsumerCoordinator:1231 - [Consumer clientId=consumer-test_novel_dy_active-1, groupId=test_novel_dy_active] Offset commit failed on partition testNovelActive-0 at offset 0: The coordinator is not aware of this member.
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -102,6 +102,11 @@ ...@@ -102,6 +102,11 @@
<artifactId>spring-kafka</artifactId> <artifactId>spring-kafka</artifactId>
<version>2.8.1</version> <version>2.8.1</version>
</dependency> </dependency>
<dependency>
<groupId>commons-httpclient</groupId>
<artifactId>commons-httpclient</artifactId>
<version>3.1</version>
</dependency>
</dependencies> </dependencies>
<build> <build>
......
...@@ -6,7 +6,8 @@ public enum AttributionStatus { ...@@ -6,7 +6,8 @@ public enum AttributionStatus {
NORMAL_DEDUCTION_CALLBACK(4,"正常扣量"), NORMAL_DEDUCTION_CALLBACK(4,"正常扣量"),
OLDUSER_DEDUCTION_CALLBACK(7,"老用户扣量"), OLDUSER_DEDUCTION_CALLBACK(7,"老用户扣量"),
IP_CALLBACK(9,"IP归因"), IP_CALLBACK(9,"IP归因"),
PAY(10,"付费回传"); PAY(10,"付费回传"),
BEHAVIOR(8,"关键行为");
public int id; public int id;
......
...@@ -23,6 +23,9 @@ public class UniversalProcess { ...@@ -23,6 +23,9 @@ public class UniversalProcess {
@Resource @Resource
public JdbcTemplate lwbyJdbcTemplate; public JdbcTemplate lwbyJdbcTemplate;
@Resource
public JdbcTemplate videoJdbcTemplate;
@Resource(name = "novelKafka") @Resource(name = "novelKafka")
public KafkaTemplate<String, String> novelKafkaTemplate; public KafkaTemplate<String, String> novelKafkaTemplate;
...@@ -47,6 +50,15 @@ public class UniversalProcess { ...@@ -47,6 +50,15 @@ public class UniversalProcess {
redisTemplate.opsForValue().set(key,value,expires, TimeUnit.SECONDS); redisTemplate.opsForValue().set(key,value,expires, TimeUnit.SECONDS);
} }
public void del(String key) {
redisTemplate.delete(key);
}
public void hset(String key, String field, int expire, String value) {
redisTemplate.opsForHash().put(key,field,value);
redisTemplate.expire(key,expire,TimeUnit.SECONDS);
}
public <T> T get(Class<T> clazz, String key) { public <T> T get(Class<T> clazz, String key) {
String value = redisTemplate.opsForValue().get(key); String value = redisTemplate.opsForValue().get(key);
if(!Objects.isNull(value)){ if(!Objects.isNull(value)){
......
...@@ -8,7 +8,7 @@ import com.lwby.marketing.att.AttributionStatus; ...@@ -8,7 +8,7 @@ import com.lwby.marketing.att.AttributionStatus;
*/ */
public enum CallBackType { public enum CallBackType {
active(0,"ocpc_result", AttributionStatus.ACTIVE_CALLBACK),pay(2,"ocpc_pay",AttributionStatus.PAY); active(0,"ocpc_result", AttributionStatus.ACTIVE_CALLBACK),pay(2,"ocpc_pay",AttributionStatus.PAY),behavior(3,"ocpc_behavior",AttributionStatus.BEHAVIOR);
private Integer type; private Integer type;
......
package com.lwby.marketing.att.dyvideo;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.lwby.marketing.vo.StoreUserUploadEventBO;
import com.lwby.marketing.vo.StoryNovelAction;
import lombok.extern.slf4j.Slf4j;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.List;
/**
* @author songxinyu
* @version DyVideoActiveConsumer.java, v 0.1 2024年03月21日 17:40 songxinyu Exp $
*/
@Slf4j
@Component
public class DyVideoActiveConsumer {
@Resource
DyVideoFlowExecutor dyVideoFlowExecutor;
private static final Logger DYVIDEO_SYS_LOG = LoggerFactory.getLogger("dyvideo.sys");
private static final Logger DYVIDEO_ERROR_LOG = LoggerFactory.getLogger("dyvideo.error");
@KafkaListener(topics = {"${system.consumer.dyvideo.active.topic}"} ,containerFactory = "kafkaListenerContainerFactoryStoryActive")
public void onMessage(List<ConsumerRecord<String, String>> datas) {
long begin = System.currentTimeMillis();
if (DYVIDEO_SYS_LOG.isInfoEnabled()) {
DYVIDEO_SYS_LOG.info("media.active.dyVideo.onMessage start ,size = {}", datas.size());
}
for (ConsumerRecord<String, String> data : datas) {
try {
if (data == null) {
log.warn("media.active.dyVideo.onMessage listen 消费数据为null");
return;
}
DYVIDEO_SYS_LOG.info("media.active.dyVideo.onMessage start, data={}", data == null ? null : data.value());
StoreUserUploadEventBO event = JSONObject.parseObject(data.value(), StoreUserUploadEventBO.class);
DYVIDEO_SYS_LOG.info("media.active.dyVideo.topic={}, bookStoreEvent={}", data.topic(), JSON.toJSONString(event));
StoryNovelAction action = new StoryNovelAction(event.getClientInfo(), event.getUserId(), event.getWechatOpenId(),
event.getUserUploadEvent());
dyVideoFlowExecutor.getExecutorByStory().execute(action);
} catch (Throwable e) {
DYVIDEO_ERROR_LOG.error("dy.video.active.onMessage failed, data={}, costTime={} ms", data.value(),
System.currentTimeMillis() - begin, e);
}
}
}
}
package com.lwby.marketing.att.dyvideo;
import com.lwby.marketing.flow.FlowExecutor;
import com.lwby.marketing.flow.Rule;
import com.lwby.marketing.vo.StoryNovelAction;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
@Component
public class DyVideoFlowExecutor {
@Resource
ApplicationContext ctx;
FlowExecutor<StoryNovelAction> executorByStory;
@PostConstruct
public void init(){
executorByStory = new FlowExecutor<>(ctx, Rule.create().THEN("dyvideo_setup").THEN("dyvideo_store").THEN("dyvideo_checkerfirst").SWITCH("dyvideo_behavior","dyvideo_dedu").THEN("dyvideo_uploadcall"));
}
public FlowExecutor<StoryNovelAction> getExecutorByStory(){
return this.executorByStory;
}
}
package com.lwby.marketing.att.dyvideo;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alicp.jetcache.anno.CacheRefresh;
import com.alicp.jetcache.anno.CacheType;
import com.alicp.jetcache.anno.Cached;
import com.lwby.marketing.att.AttributionStatus;
import com.lwby.marketing.att.UniversalProcess;
import com.lwby.marketing.att.bystory.CallBackType;
import com.lwby.marketing.att.novel.AttributionType;
import com.lwby.marketing.vo.AppChannelVO;
import com.lwby.marketing.vo.DeliveryDeviceInfo;
import com.lwby.marketing.vo.StoryNovelAction;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.kafka.support.SendResult;
import org.springframework.stereotype.Component;
import org.springframework.util.concurrent.ListenableFuture;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
@Slf4j
@Component
public class DyVideoUniversalProcess extends UniversalProcess {
private static final Logger DYVIDEO_SYS_LOG = LoggerFactory.getLogger("dyvideo.sys");
private static final Logger DYVIDEO_ERROR_LOG = LoggerFactory.getLogger("dyvideo.error");
/**
* 通知处理结果
*/
public void notifyResult(StoryNovelAction action,String topic, AttributionStatus status) {
DeliveryDeviceInfo ddi = action.getDeliveryDeviceInfo();
if (Objects.isNull(ddi)) {
ddi = new DeliveryDeviceInfo();
String channelStr = String.valueOf(action.getChannelId());
ddi.setMedia(MediaMapping.getMediaNameByChannelId(channelStr));
ddi.setAd_plan_id("0");
ddi.setAd_group_id("0");
ddi.setAd_creative_id("0");
ddi.setPlatform_id(String.valueOf(action.getPlatformId()));
ddi.setDj_channel(channelStr);
}
ddi.setIs_call(status.id);
ddi.setUserId(action.getUserId());
ddi.setDevice_id(String.valueOf(action.getUserId()));
ddi.setActive_time(System.currentTimeMillis());
ddi.setChannel(String.valueOf(action.getChannelId()));
ddi.setUserId(action.getUserId());
String jsonString = JSONObject.toJSONString(ddi);
ListenableFuture<SendResult<String, String>> active_result = novelKafkaTemplate.send(topic, jsonString);
active_result.addCallback(
result -> DYVIDEO_SYS_LOG.info("归因成功[{}],归因类型[{}]", jsonString, status.desc),
ex -> DYVIDEO_ERROR_LOG.error("归因失败[{}],归因类型[{}]", jsonString, status.desc, ex)
);
}
public String getTotalCountKey(AttributionType attributionType, int platformId, Long channelOrPlanId ,int sprDedu, String dateStr) {
return String.format("%s_total_%d_%d_%d_%s", attributionType, platformId, channelOrPlanId, sprDedu, dateStr);
}
public String getCallbackCountKey(AttributionType attributionType, int platformId, Long channelOrPlanId, int sprDedu, String dateStr) {
return String.format("%s_callback_%d_%d_%d_%s", attributionType, platformId, channelOrPlanId, sprDedu, dateStr);
}
public String getFirstCheckerKey(StoryNovelAction action) {
return Objects.equals(action.getType(), CallBackType.active.getType())
? String.format("fc_%d_%d_%s_%s", action.getUserId(), action.getPlatformId(),action.getMediaName(),action.getCurrentDateStr())
: String.format("fc_%d_%d_%s", action.getUserId(), action.getPlatformId(),action.getMediaName());
}
public String getDyAccessToken(String client_id, String client_secret,String dyTokenUrl) {
Map<String,String> upMap = new HashMap<>();
upMap.put("client_key",client_id);
upMap.put("client_secret",client_secret);
upMap.put("grant_type","client_credential");
String mapAction = JSONObject.toJSONString(upMap);
String accessToken = "";
try {
String result = HttpUtil.post(dyTokenUrl, mapAction);
Map data = (Map) JSON.parseObject(result).get("data");
Integer resultCode = (Integer) data.get("error_code");
if (resultCode == 0) {
//成功
accessToken = (String) data.get("access_token");
Integer expiresIn = (Integer) data.get("expires_in");
String tokenDy = "token_dy_" + client_id;
set(tokenDy, Integer.parseInt(String.valueOf(expiresIn)),accessToken);
} else {
log.warn("dy_access_token_error,code={},resultdy={}", resultCode, JSONObject.toJSONString(result));
}
} catch (Throwable e) {
e.printStackTrace();
}
return accessToken;
}
/******************************************** JDBC *************************************************************/
@Cached(name="appchannel_dy_video", cacheType = CacheType.LOCAL)
@CacheRefresh(refresh = 300)
public AppChannelVO getAppChannelByPlatformAndChannel(int platformId,Long channelId) {
try {
RowMapper<AppChannelVO> rowMapper = BeanPropertyRowMapper.newInstance(AppChannelVO.class);
return lwbyJdbcTemplate.queryForObject(String.format("select id,ecpm_avg_count,motivation_count,ecpm_per_count,spr_dedu "
+ "from app_channel where channel_id=%d and platform_id=%d",channelId,platformId),rowMapper);
} catch (EmptyResultDataAccessException e) {
return null;
}
}
}
package com.lwby.marketing.att.dyvideo.handle;
import com.lwby.marketing.att.dyvideo.DyVideoUniversalProcess;
import com.lwby.marketing.flow.NodeFlow;
import com.lwby.marketing.vo.StoryNovelAction;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
@Component("dyvideo_checkerfirst")
public class CheckerDyVideoFirstFlow extends NodeFlow<StoryNovelAction> {
@Resource
DyVideoUniversalProcess up;
@Override
public void process(StoryNovelAction action) {
if(up.exists(up.getFirstCheckerKey(action))){
action.stop(true);
}
}
}
\ No newline at end of file
package com.lwby.marketing.att.dyvideo.handle;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.lwby.marketing.att.dyvideo.DyVideoUniversalProcess;
import com.lwby.marketing.flow.NodeSwitchFlow;
import com.lwby.marketing.po.VideoUpload;
import com.lwby.marketing.util.CacheKeyUtils;
import com.lwby.marketing.util.HttpUtil;
import com.lwby.marketing.vo.AppChannelVO;
import com.lwby.marketing.vo.StoryNovelAction;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.*;
import java.util.concurrent.TimeUnit;
/**
* @author songxinyu
* @version PaySpduFlow.java, v 0.1 2024年03月04日 18:46 songxinyu Exp $
*/
@Slf4j
@Component("dyvideo_behavior")
public class DyvideoBehaviorFlow extends NodeSwitchFlow<StoryNovelAction> {
private static final Logger DYVIDEO_SYS_LOG = LoggerFactory.getLogger("dyvideo.sys");
@Resource
DyVideoUniversalProcess up;
@Autowired
private Environment env;
private static final String tokenDyDevUrl = "https://open-sandbox.douyin.com/oauth/client_token/";
private static final String tokenDyProdUrl = "https://open.douyin.com/oauth/client_token/";
SimpleDateFormat dfh = new SimpleDateFormat("yyyy-MM-dd");//设置日期格式
private static final String url = "https://open.douyin.com/api/traffic/v1/rt_ecpm/query/";
@Override
public boolean checked(StoryNovelAction action) {
return action.getType() == 3;
}
@Override
public void process(StoryNovelAction action) {
VideoUpload videoUpload = action.getVideoUpload();
long userId = action.getUserId();
long activeTime = videoUpload.getActiveTime();
long currentTime = System.currentTimeMillis();
long hour = TimeUnit.MILLISECONDS.toHours(currentTime - activeTime);
if (hour > 6) {
log.info("DyvideoBehaviorFlow expeed six hour ,videoUpload={},userId={}",JSON.toJSONString(videoUpload),userId);
action.stop(true);
return;
}
int platformId = action.getPlatformId();
Long channelId = action.getChannelId();
AppChannelVO appChannel = up.getAppChannelByPlatformAndChannel(platformId,channelId);
//处理关键行为上报
Integer ecpmAvgModelCount = null ;
Integer pecpmModelCount = null;
Integer motivateModelCount = null ;
String media = action.getMediaName();
String openId = action.getOpenId();
if (Objects.nonNull(appChannel) && ((Objects.nonNull(appChannel.getEcpmAvgCount()) && Objects.nonNull(appChannel.getMotivationCount()))
|| (Objects.nonNull(appChannel.getEcpmPerCount()) && Objects.nonNull(appChannel.getMotivationCount())))) {
if (Objects.nonNull(appChannel.getEcpmAvgCount()) && Objects.nonNull(appChannel.getMotivationCount())) {
ecpmAvgModelCount = appChannel.getEcpmAvgCount().intValue();
motivateModelCount = appChannel.getMotivationCount().intValue();
}
if (Objects.nonNull(appChannel.getEcpmPerCount()) && Objects.nonNull(appChannel.getMotivationCount())) {
pecpmModelCount = appChannel.getEcpmPerCount().intValue();
motivateModelCount = appChannel.getMotivationCount().intValue();
}
DYVIDEO_SYS_LOG.info("DyvideoBehaviorFlow.cacheModel in table is set value,djChanel={},userId={},ecpmAvgModelCount={},pecpmModelCount={},motivateModelCount={}",channelId,userId,ecpmAvgModelCount,pecpmModelCount,motivateModelCount);
} else {
DYVIDEO_SYS_LOG.info("DyvideoBehaviorFlow.cacheModel in table is not set value,djChanel={},userId={}",channelId,userId);
action.stop(true);
return;
}
JSONObject dyMarketPlatformAppIdJson = JSON.parseObject(
"{\n"
+ " \"400\": \"ttf2f6844b6dc9702901_d4ac08a22f80f73256836fdd9655dbb0b6e6de7c\",\n"
+ " \"412\": \"ttd3dda5604ce230b401_5aac82a8c76db9c54f187dea7b43b58b233459db\"\n"
+ "}");
String platformKey = String.valueOf(platformId);
//走平台
String dyMarketPlatformAppId = dyMarketPlatformAppIdJson.getString(platformKey);
List<String> dyMarketPlatformAppIdList = new ArrayList<>();
if (dyMarketPlatformAppId != null) {
dyMarketPlatformAppIdList = Arrays.asList(dyMarketPlatformAppId.split("_"));
String tokenDy = "token_dy_" + dyMarketPlatformAppIdList.get(0);
String accessToken = null;
if (up.exists(tokenDy)) {
accessToken = up.get(String.class, tokenDy);
} else {
accessToken = up.getDyAccessToken(dyMarketPlatformAppIdList.get(0), dyMarketPlatformAppIdList.get(1),
Objects.equals(env,"prod") ? tokenDyProdUrl : tokenDyDevUrl);
}
if (accessToken != null) {
//平均ecpm次数
Integer ecpmAvgCount = null;
//每次ecpm次数
Integer pecpmCount = null;
//激励视频次数
Integer motivateCount = null;
//激励视频总ecpm次数
Integer tvcCount = null;
LocalDateTime now = LocalDateTime.now(); // 获取当前日期时间
LocalTime six = LocalTime.of(6, 0, 0); // 获取当天6点的时间
Date date = new Date();
Map<String, Integer> resultCountMap = null;
if (now.toLocalTime().isBefore(six)) {
//当天6点之前,查两天,先查昨天的ecpm指标
Calendar calendar = Calendar.getInstance(); // 获取日历对象
calendar.setTime(date); // 设置时间
calendar.add(Calendar.DAY_OF_MONTH, -1); // 将时间减去一天
Date day = calendar.getTime();
resultCountMap = getResultCountList(day, openId, accessToken, tvcCount, motivateCount, pecpmCount,
pecpmModelCount, userId, tokenDy, dyMarketPlatformAppIdList);
if (resultCountMap != null && resultCountMap.size() != 0) {
tvcCount = resultCountMap.get("tvc");
if (tvcCount != null) {
tvcCount = tvcCount / 100;
}
motivateCount = resultCountMap.get("motivate");
pecpmCount = resultCountMap.get("pecpm");
}
}
//查询今天的ecpm指标
resultCountMap = getResultCountList(date, openId, accessToken, tvcCount, motivateCount, pecpmCount,
pecpmModelCount, userId, tokenDy, dyMarketPlatformAppIdList);
if (resultCountMap != null && resultCountMap.size() != 0) {
tvcCount = resultCountMap.get("tvc");
if (tvcCount != null) {
tvcCount = tvcCount / 100;
}
motivateCount = resultCountMap.get("motivate");
pecpmCount = resultCountMap.get("pecpm");
}
if (Objects.nonNull(tvcCount) && Objects.nonNull(motivateCount)) {
if (Objects.nonNull(pecpmCount)) {
DYVIDEO_SYS_LOG.info("DyvideoBehaviorFlow pecpmcount not null,tvcCount={},motivateCount={},pecpmCount={},djChanel={},userId={}", tvcCount,
motivateCount, pecpmCount, channelId, userId);
}
Double ecpmAvgCountD = (double) tvcCount / motivateCount;
ecpmAvgCount = ecpmAvgCountD.intValue();
DYVIDEO_SYS_LOG.info("DyvideoBehaviorFlow.ecpm success,tvcCount={},motivateCount={},djChanel={},userId={}", tvcCount, motivateCount, channelId,
userId);
} else {
if (Objects.nonNull(pecpmCount) && Objects.nonNull(motivateCount)) {
DYVIDEO_SYS_LOG.info("DyvideoBehaviorFlow pempcount and motivate not null,tvcCount={},motivateCount={},pecpmCount={},djChanel={},userId={}",
tvcCount, motivateCount, pecpmCount, channelId, userId);
} else {
DYVIDEO_SYS_LOG.info("DyvideoBehaviorFlow tvcandmo not up to the standard,tvcCount={},motivateCount={},djChanel={},userId={}", tvcCount,
motivateCount, channelId, userId);
action.stop(true);
return;
}
}
if (Objects.nonNull(motivateModelCount) && Objects.nonNull(motivateCount)) {
if (motivateCount < motivateModelCount) {
DYVIDEO_SYS_LOG.info("DyvideoBehaviorFlow motivate not up to the standard,motivateCount={},motivateModelCount={},djChanel={},userId={}",
motivateCount, motivateModelCount, channelId, userId);
action.stop(true);
return;
}
videoUpload.setMotivateCount(String.valueOf(motivateCount));
}
if (Objects.nonNull(ecpmAvgModelCount) && Objects.nonNull(ecpmAvgCount)) {
if ((ecpmAvgCount < ecpmAvgModelCount)) {
DYVIDEO_SYS_LOG.info("DyvideoBehaviorFlow ecpm not up to the standard,ecpmAvgCount={},ecpmAvgModelCount={},djChanel={},userId={}",
ecpmAvgCount, ecpmAvgModelCount, channelId, userId);
action.stop(true);
return;
}
videoUpload.setEcpmAvgCount(String.valueOf(ecpmAvgCount));
}
if (Objects.nonNull(pecpmModelCount) && Objects.nonNull(motivateModelCount) && Objects.nonNull(motivateCount)) {
if (Objects.nonNull(pecpmCount)) {
if (pecpmCount < motivateModelCount) {
DYVIDEO_SYS_LOG.info(
"DyvideoBehaviorFlow pecpmCount not up to the standard,pecpmModelCount={},pecpmCount={},motivateModelCount={},motivateCount={},djChanel={},userId={}",
pecpmModelCount, pecpmCount, motivateModelCount, motivateCount, channelId, userId);
action.stop(true);
return;
}
videoUpload.setPecpmCount(String.valueOf(pecpmModelCount));
videoUpload.setPerecpmSize(String.valueOf(pecpmCount));
DYVIDEO_SYS_LOG.info(
"DyvideoBehaviorFlow pecpmCount up to the standard,pecpmModelCount={},pecpmCount={},motivateModelCount={},motivateCount={},djChanel={},userId={}",
pecpmModelCount, pecpmCount, motivateModelCount, motivateCount, channelId, userId);
} else {
DYVIDEO_SYS_LOG.info(
"DyvideoBehaviorFlow pecpmCount is null not to the standard,pecpmModelCount={},pecpmCount={},motivateModelCount={},motivateCount={},djChanel={},userId={}",
pecpmModelCount, pecpmCount, motivateModelCount, motivateCount, channelId, userId);
action.stop(true);
return;
}
}
} else {
action.stop(true);
}
} else {
action.stop(true);
}
}
public Map<String,Integer> getResultCountList(Date day,String openid,String accessToken,Integer tvcCount,Integer motivateCount,Integer pecpmCount,Integer pecpmModelCount,Long userId,String tokenDy,List<String> dyMarketPlatformAppIdList) {
int pageNumer = 1;
Map<String,Integer> resultCountMap = new HashMap<>();
String upcBehaviorKey = CacheKeyUtils.getVideoBehavoirKey(userId);
String cursor = null;
for (int i=1 ; i<= pageNumer ; i++) {
Map<String,Object> mp = new HashMap<>();
mp.put("open_id",openid);
mp.put("date_hour",dfh.format(day));
if (cursor != null) {
mp.put("cursor",cursor);
}
String mapAction = JSONObject.toJSONString(mp);
try {
String result = HttpUtil.postDy(url, mapAction,accessToken);
Integer resultCode = (Integer) JSON.parseObject(result).get("err_no");
if (resultCode == 0) {
Map dataMap = (Map) JSON.parseObject(result).get("data");
List<JSONObject> records = (List<JSONObject>)dataMap.get("records");
String next_cursor = (String)dataMap.get("next_cursor");
if (records != null && records.size()>0) {
if (Objects.isNull(tvcCount)) {
tvcCount = 0;
}
if (Objects.isNull(motivateCount)) {
motivateCount = 0;
}
if (Objects.isNull(pecpmCount)) {
pecpmCount = 0;
}
motivateCount += records.size();
for(JSONObject jsonObject : records) {
String cost = jsonObject.getString("cost");
Integer costI = Integer.parseInt(cost);
Double c = (double)(costI / 100);
int ct = c.intValue();
if (pecpmModelCount != null) {
if (ct>=pecpmModelCount) {
pecpmCount ++;
}
}
tvcCount += costI;
}
up.hset(upcBehaviorKey,"tvc",60 * 60 * 24 * 3,JSON.toJSONString(tvcCount));
up.hset(upcBehaviorKey,"mvc",60 * 60 * 24 * 3,JSON.toJSONString(motivateCount));
up.hset(upcBehaviorKey,"vec",60 * 60 * 24 * 3,JSON.toJSONString(pecpmCount));
}
DYVIDEO_SYS_LOG.info("DyvideoBehaviorFlow.douyin code succ,userId={},result={}",userId,JSON.toJSONString(result));
if (records != null && records.size() == 500) {
pageNumer ++;
cursor = next_cursor;
}
} else {
DYVIDEO_SYS_LOG.info("DouyinBehaviorKafkaConsumer.douyin code error,userId={},result={}",userId,JSON.toJSONString(result));
if (resultCode == 28001008) {
//删除授权过期token
up.del(tokenDy);
up.getDyAccessToken(dyMarketPlatformAppIdList.get(0), dyMarketPlatformAppIdList.get(1), Objects.equals(env,"prod") ? tokenDyProdUrl : tokenDyDevUrl);
DYVIDEO_SYS_LOG.info("DyvideoBehaviorFlow.douyin code auth token expired,userId={},result={}",userId,JSON.toJSONString(result));
}
return null;
}
resultCountMap.put("tvc",tvcCount);
resultCountMap.put("motivate",motivateCount);
resultCountMap.put("pecpm",pecpmCount);
} catch (Throwable e) {
e.printStackTrace();
}
}
return resultCountMap;
}
}
package com.lwby.marketing.att.dyvideo.handle;
import com.lwby.marketing.att.AttributionStatus;
import com.lwby.marketing.att.dyvideo.DyVideoUniversalProcess;
import com.lwby.marketing.att.novel.AttributionType;
import com.lwby.marketing.flow.NodeSwitchFlow;
import com.lwby.marketing.vo.AppChannelVO;
import com.lwby.marketing.vo.StoryNovelAction;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.concurrent.ThreadLocalRandom;
/**
* @author songxinyu
* @version PaySpduFlow.java, v 0.1 2024年03月04日 18:46 songxinyu Exp $
*/
@Slf4j
@Component("dyvideo_dedu")
public class DyvideoDeduFlow extends NodeSwitchFlow<StoryNovelAction> {
private static final Logger DYVIDEO_SYS_LOG = LoggerFactory.getLogger("dyvideo.sys");
@Resource
DyVideoUniversalProcess up;
@Override
public boolean checked(StoryNovelAction action) {
return action.getType() == 3;
}
@Override
public void process(StoryNovelAction action) {
int platformId = action.getPlatformId();
Long channelId = action.getChannelId();
AppChannelVO appChannel = up.getAppChannelByPlatformAndChannel(platformId,channelId);
Integer sprDedu = appChannel.getSprDedu();
//等于空 或 100直接回传
if (sprDedu == null || sprDedu == 100) {
return;
}
//总数
String channelTotal = up.getTotalCountKey(AttributionType.CHANNEL, action.getPlatformId(), action.getChannelId(), sprDedu, action.getCurrentDateStr());
//回传
String channelCallback = up.getCallbackCountKey(AttributionType.CHANNEL, action.getPlatformId(), action.getChannelId(), sprDedu, action.getCurrentDateStr());
long channelTotalCount = up.incrby(channelTotal, 0, 60 * 60 * 24);
long channelCallbackCount = up.incrby(channelCallback, 0, 60 * 60 * 24);
up.incrby(channelTotal, 1);
if (isCallback(channelTotalCount, channelCallbackCount, sprDedu)) {
//回传,回传个数 + 1
up.incrby(channelCallback, 1);
DYVIDEO_SYS_LOG.info(
"ChannelAttributionFlow.process0.deduction doing dynamic, platformId = {}, channel = {}, planId={}, sprDedu = {}, channelTotalCount = {}, channelCallbackCount = {}, v = {}",
action.getPlatformId(), action.getChannelId(),action.getPlanId(), sprDedu, channelTotalCount, channelCallbackCount, 1);
} else {
up.notifyResult(action,"ocpc_behavior_test", AttributionStatus.NORMAL_DEDUCTION_CALLBACK);
up.set(up.getFirstCheckerKey(action),60 * 60 * 24,"1");
DYVIDEO_SYS_LOG.info(
"ChannelAttributionFlow.process0.deduction doing dynamic, platformId = {}, channel = {}, planId={}, sprDedu = {}, channelTotalCount = {}, channelCallbackCount = {}, v = {}",
action.getPlatformId(), action.getChannelId(),action.getPlanId(), sprDedu, channelTotalCount, channelCallbackCount, 0);
}
}
private boolean isCallback(long channelTotalCount, long channelCallbackCount, Integer sprDedu) {
if (channelTotalCount == 0) {
//首次随机
return ThreadLocalRandom.current().nextInt(1, 3) == 1;
}
//计算回传率
BigDecimal divide = new BigDecimal(channelCallbackCount).divide(new BigDecimal(channelTotalCount), 4, RoundingMode.HALF_UP);
//比较回传率和扣量比例,决定是否回传
double percent = (double) Math.round(sprDedu * 100 / 100.0) / 100;
return divide.compareTo(BigDecimal.valueOf(percent).setScale(4, RoundingMode.HALF_UP)) != 1;
}
}
package com.lwby.marketing.att.dyvideo.handle;
import com.lwby.marketing.att.bystory.CallBackType;
import com.lwby.marketing.att.dyvideo.DyVideoUniversalProcess;
import com.lwby.marketing.flow.NodeFlow;
import com.lwby.marketing.notify.Media;
import com.lwby.marketing.notify.media.Platform;
import com.lwby.marketing.po.VideoUpload;
import com.lwby.marketing.util.DateTimUtils;
import com.lwby.marketing.util.NumberUtils;
import com.lwby.marketing.vo.ClientInfo;
import com.lwby.marketing.vo.DeliveryDeviceInfo;
import com.lwby.marketing.vo.StoryNovelAction;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.Objects;
import java.util.UUID;
@Slf4j
@Component("dyvideo_setup")
public class ParameterSetupDyVideoFlow extends NodeFlow<StoryNovelAction> {
@Resource
DyVideoUniversalProcess up;
@Override
public void process(StoryNovelAction action) {
ClientInfo clientInfo = action.getClientInfo();
String openId = action.getOpenId();
//平台ID
Integer platformId = clientInfo.getPlatformId();
//VO对像
DeliveryDeviceInfo deliveryDeviceInfo = null;
//String s = "{\"creativeId\":\"112331\",\"creativeType\":\"3\",\"adid\":\"12321\","
// + "\"clickId\":\"12312143232\",\"channel\":\"216011231\",\"bookId\":\"4322111\","
// + "\"media\":\"jrtt\",\"clickTime\":123123123,\"code\":\"12ede3e231\"}";;
//StoryLogin storyLogin = JSONObject.parseObject(s,StoryLogin.class);
//匹配OpenId
VideoUpload videoUpload = up.get(VideoUpload.class,assembleKey(openId));
action.setVideoUpload(videoUpload);
//StoryNovelAction对像参数填充
action.setPlatformId(platformId);
action.setUserId(action.getUserId());
action.setCurrentDateStr(DateTimUtils.getCurrentDateString());
if (CallBackType.active.getType().equals(0)) {
action.setChannelId((long)action.getClientInfo().getChannel());
}
//非商店吊起参数设置
if (Objects.nonNull(videoUpload)) {
deliveryDeviceInfo = new DeliveryDeviceInfo();
deliveryDeviceInfo.setAd_creative_id(videoUpload.getCreativeId());
deliveryDeviceInfo.setPlatform_id(String.valueOf(clientInfo.getPlatformId()));
deliveryDeviceInfo.setCallback_param(videoUpload.getClickId());
deliveryDeviceInfo.setUuid(UUID.randomUUID().toString());
deliveryDeviceInfo.setDj_channel(videoUpload.getChannel());
deliveryDeviceInfo.setPromotion_id(videoUpload.getAdid());
deliveryDeviceInfo.setVideoResourceId(videoUpload.getVideoResourceId());
action.setDeliveryDeviceInfo(deliveryDeviceInfo);
action.setChannelId(NumberUtils.parseLong(videoUpload.getChannel()));
action.setPlanId(NumberUtils.parseLong((videoUpload.getAdid())));
action.setMediaName(videoUpload.getMedia());
action.setMedia(Media.getMedia(action.getMediaName(), Platform.DY_VIDEO));
}
}
public String assembleKey(String openId) {
return String.format("story:upload:%s", openId);
}
}
package com.lwby.marketing.att.dyvideo.handle;
import com.lwby.marketing.att.AttributionStatus;
import com.lwby.marketing.att.bystory.CallBackType;
import com.lwby.marketing.att.dyvideo.DyVideoUniversalProcess;
import com.lwby.marketing.flow.NodeFlow;
import com.lwby.marketing.vo.StoryNovelAction;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.Objects;
@Component("dyvideo_store")
public class StoreDyVideoAttributionFlow extends NodeFlow<StoryNovelAction> {
@Resource
DyVideoUniversalProcess up;
@Override
public void process(StoryNovelAction action) {
//商店归因通知
if(Objects.isNull(action.getDeliveryDeviceInfo())){
if (action.getType().equals(CallBackType.active.getType())) {
up.notifyResult(action,"ocpc_result", AttributionStatus.STORE_CALLBACK);
}
action.stop(true); //结束后面所有执行流程
}
}
}
\ No newline at end of file
package com.lwby.marketing.att.dyvideo.handle;
import com.lwby.marketing.att.bystory.CallBackType;
import com.lwby.marketing.att.dyvideo.DyVideoUniversalProcess;
import com.lwby.marketing.flow.NodeFlow;
import com.lwby.marketing.vo.StoryNovelAction;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* @author songxinyu
* @version ActiveCallFlow.java, v 0.1 2024年03月04日 18:28 songxinyu Exp $
*/
@Component("dyvideo_uploadcall")
public class UploadDyVideoCallFlow extends NodeFlow<StoryNovelAction> {
@Resource
DyVideoUniversalProcess up;
@Override
public void process(StoryNovelAction action) {
CallBackType type = CallBackType.getCallBackTypeByType(action.getType());
boolean success = action.getMedia().notify(action);
if (success) {
action.getVideoUpload().setActiveTime(System.currentTimeMillis());
up.notifyResult(action, type.getTopic(),type.getStatus());
up.set(up.getFirstCheckerKey(action),60 * 60 * 24,"1");
}
}
}
...@@ -22,4 +22,10 @@ public class DataSourceConfig { ...@@ -22,4 +22,10 @@ public class DataSourceConfig {
DataSource marketingDataSource() { DataSource marketingDataSource() {
return DataSourceBuilder.create().build(); return DataSourceBuilder.create().build();
} }
@Bean(name = "videoDataSource")
@ConfigurationProperties("spring.datasource.video")
DataSource videoDataSource() {
return DataSourceBuilder.create().build();
}
} }
...@@ -19,4 +19,9 @@ public class JdbcTemplateConfig { ...@@ -19,4 +19,9 @@ public class JdbcTemplateConfig {
return new JdbcTemplate(dataSource); return new JdbcTemplate(dataSource);
} }
@Bean(name = "videoJdbcTemplate")
JdbcTemplate videoJdbc(@Qualifier("videoDataSource") DataSource dataSource){
return new JdbcTemplate(dataSource);
}
} }
...@@ -7,7 +7,7 @@ public abstract class DYNotify extends BaseNotiry { ...@@ -7,7 +7,7 @@ public abstract class DYNotify extends BaseNotiry {
public boolean delivery(Action action) { public boolean delivery(Action action) {
//TODO;抖音短剧加入后,需要重构StoryNovelAction //TODO;抖音短剧加入后,需要重构StoryNovelAction
StoryNovelAction storyNovelAction = (StoryNovelAction)action; StoryNovelAction storyNovelAction = (StoryNovelAction)action;
return storyNovelAction.getType() == 0?active(storyNovelAction):pay(storyNovelAction); return storyNovelAction.getType() == 0?active(storyNovelAction): (storyNovelAction.getType() == 2 ? pay(storyNovelAction):behavior(storyNovelAction));
} }
public abstract boolean active(StoryNovelAction na); public abstract boolean active(StoryNovelAction na);
...@@ -15,4 +15,6 @@ public abstract class DYNotify extends BaseNotiry { ...@@ -15,4 +15,6 @@ public abstract class DYNotify extends BaseNotiry {
public abstract boolean pay(StoryNovelAction na); public abstract boolean pay(StoryNovelAction na);
public abstract boolean behavior(StoryNovelAction na);
} }
...@@ -4,6 +4,7 @@ package com.lwby.marketing.notify; ...@@ -4,6 +4,7 @@ package com.lwby.marketing.notify;
import com.lwby.marketing.flow.Action; import com.lwby.marketing.flow.Action;
import com.lwby.marketing.notify.media.Platform; import com.lwby.marketing.notify.media.Platform;
import com.lwby.marketing.notify.media.gdt.NovelGDTNotify; import com.lwby.marketing.notify.media.gdt.NovelGDTNotify;
import com.lwby.marketing.notify.media.jrtt.DyVideoJRTTNotify;
import com.lwby.marketing.notify.media.jrtt.NovelJRTTNotify; import com.lwby.marketing.notify.media.jrtt.NovelJRTTNotify;
import com.lwby.marketing.notify.media.jrtt.StoryJRTTNotify; import com.lwby.marketing.notify.media.jrtt.StoryJRTTNotify;
...@@ -15,7 +16,8 @@ import java.util.stream.Collectors; ...@@ -15,7 +16,8 @@ import java.util.stream.Collectors;
public enum Media { public enum Media {
NOVEL_GDT("gdt", Platform.NOVEL, "广点通",new NovelGDTNotify()), NOVEL_GDT("gdt", Platform.NOVEL, "广点通",new NovelGDTNotify()),
NOVEL_JRTT("jrtt", Platform.NOVEL, "今日头条",new NovelJRTTNotify()), NOVEL_JRTT("jrtt", Platform.NOVEL, "今日头条",new NovelJRTTNotify()),
DY_STORY_JRTT("jrtt", Platform.DY_STORY, "今日头条",new StoryJRTTNotify()); DY_STORY_JRTT("jrtt", Platform.DY_STORY, "今日头条",new StoryJRTTNotify()),
DY_VIDEO_JRTT("jrtt", Platform.DY_VIDEO, "今日头条",new DyVideoJRTTNotify());
final String name; final String name;
final Platform platform; final Platform platform;
......
package com.lwby.marketing.notify.media.jrtt;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.lwby.marketing.notify.DYNotify;
import com.lwby.marketing.notify.media.jrtt.dto.JrttAttributeRequest;
import com.lwby.marketing.vo.DeliveryDeviceInfo;
import com.lwby.marketing.vo.StoryNovelAction;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Slf4j
public class DyVideoJRTTNotify extends DYNotify {
public static final String ATTRIBUTE_URL = "https://analytics.oceanengine.com/api/v2/conversion";
private static final Logger DYVIDEO_SYS_LOG = LoggerFactory.getLogger("dyvideo.sys");
@Override
public boolean active(StoryNovelAction na) {
return notify(na,"active");
}
@Override
public boolean pay(StoryNovelAction na) {
return false;
}
@Override
public boolean behavior(StoryNovelAction na) {
return notify(na,"game_addiction");
}
public boolean notify(StoryNovelAction na,String eventType) {
DeliveryDeviceInfo ddi = na.getDeliveryDeviceInfo();
JrttAttributeRequest.Ad ad = new JrttAttributeRequest.Ad();
ad.setCallback(ddi.getCallback_param());
JrttAttributeRequest.Context context = new JrttAttributeRequest.Context();
context.setAd(ad);
JrttAttributeRequest request = JrttAttributeRequest.builder().context(context).event_type(eventType).timestamp(
System.currentTimeMillis()).build();
String userJson = JSONObject.toJSONString(request);
try {
String result = HttpUtil.post(ATTRIBUTE_URL, userJson);
Integer resultCode = (Integer) JSON.parseObject(result).get("code");
DYVIDEO_SYS_LOG.info("DyVideoJRTTNotify.video.{}.upload,result={},userId={},channel={},platform={}",eventType,JSON.toJSONString(result),na.getUserId(),na.getChannelId(),na.getPlatformId());
return resultCode == 0;
} catch (Exception e) {
return false;
}
}
}
...@@ -27,6 +27,11 @@ public class StoryJRTTNotify extends DYNotify { ...@@ -27,6 +27,11 @@ public class StoryJRTTNotify extends DYNotify {
return notify(na,"active_pay"); return notify(na,"active_pay");
} }
@Override
public boolean behavior(StoryNovelAction na) {
return false;
}
public boolean notify(StoryNovelAction na,String eventType) { public boolean notify(StoryNovelAction na,String eventType) {
DeliveryDeviceInfo ddi = na.getDeliveryDeviceInfo(); DeliveryDeviceInfo ddi = na.getDeliveryDeviceInfo();
......
package com.lwby.marketing.po;
import lombok.Data;
/**
* @author songxinyu
* @version VideoUpload.java, v 0.1 2024年01月29日 18:38 songxinyu Exp $
*/
@Data
public class VideoUpload {
private String adid;
private String creativeId;
private String creativeType;
private String clickId;
private String channel;
private String videoResourceId;
private String media;
private String code;
private String ecpmAvgCount;
private String motivateCount;
//每次ecpm达标
private String pecpmCount;
//达标次数,与激励视频阈值比较
private String perecpmSize;
private long activeTime;
private long clickTime;
}
package com.lwby.marketing.util;
/**
* @author songxinyu
* @version CacheKeyUtils.java, v 0.1 2024年03月22日 17:56 songxinyu Exp $
*/
public class CacheKeyUtils {
private static final String CACHE_BEHAVIOR_PREFIX = "up_c_";
public static String getVideoBehavoirKey(Long userId) {
return CACHE_BEHAVIOR_PREFIX + userId + "_fv";
}
}
package com.lwby.marketing.util;
import org.apache.commons.httpclient.DefaultHttpMethodRetryHandler;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.RequestEntity;
import org.apache.commons.httpclient.methods.StringRequestEntity;
import org.apache.commons.httpclient.params.HttpMethodParams;
import java.io.*;
/**
* @author songxinyu
* @version HttpUtil.java, v 0.1 2024年03月22日 17:58 songxinyu Exp $
*/
public class HttpUtil {
public static String postDy (String url, String toJson,String token) throws IOException {
HttpClient httpClient = new HttpClient();
PostMethod postMethod = new PostMethod(url);
RequestEntity se = new StringRequestEntity(toJson ,"application/json" ,"UTF-8");
postMethod.setRequestEntity(se);
postMethod.setRequestHeader("Content-Type","application/json");
postMethod.setRequestHeader("access-token",token);
//默认的重试策略
postMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler());
postMethod.getParams().setParameter(HttpMethodParams.SO_TIMEOUT, 5000);//设置超时时间
int httpStatus = httpClient.executeMethod(postMethod);
InputStream bodystreams = postMethod.getResponseBodyAsStream();
String body = convertStreamToString(bodystreams);
return body;
}
public static String convertStreamToString(InputStream is) throws UnsupportedEncodingException {
// BufferedReader reader = new BufferedReader(new InputStreamReader(is));//输出的中文乱码
BufferedReader reader = new BufferedReader(new InputStreamReader(is,"utf8")); //GBK
StringBuilder sb = new StringBuilder();
String line = null;
try {
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return sb.toString();
}
}
package com.lwby.marketing.vo;
import com.lwby.marketing.po.AppChannel;
import lombok.Data;
/**
* @author songxinyu
* @version AppChannelVO.java, v 0.1 2023年05月24日 14:05 songxinyu Exp $
*/
@Data
public class AppChannelVO extends AppChannel {
private Integer videoCount;
private Long mvCount;
private Long cpmCount;
//平均ecpm达标次数
private Long ecpmAvgCount;
//每次ecpm达标次数
private Long ecpmPerCount;
//激励视频次数
private Long motivationCount;
//arpu
private Double arpuCount;
}
...@@ -38,6 +38,8 @@ public class StoreUserUploadEventBO { ...@@ -38,6 +38,8 @@ public class StoreUserUploadEventBO {
*/ */
String orderObject; String orderObject;
String wechatOpenId;
/** /**
* 扩展数据 * 扩展数据
*/ */
...@@ -154,4 +156,12 @@ public class StoreUserUploadEventBO { ...@@ -154,4 +156,12 @@ public class StoreUserUploadEventBO {
public void setTotalValue(Double totalValue) { public void setTotalValue(Double totalValue) {
this.totalValue = totalValue; this.totalValue = totalValue;
} }
public String getWechatOpenId() {
return wechatOpenId;
}
public void setWechatOpenId(String wechatOpenId) {
this.wechatOpenId = wechatOpenId;
}
} }
...@@ -3,6 +3,7 @@ package com.lwby.marketing.vo; ...@@ -3,6 +3,7 @@ package com.lwby.marketing.vo;
import com.lwby.marketing.flow.Action; import com.lwby.marketing.flow.Action;
import com.lwby.marketing.notify.Media; import com.lwby.marketing.notify.Media;
import com.lwby.marketing.po.StoryLogin; import com.lwby.marketing.po.StoryLogin;
import com.lwby.marketing.po.VideoUpload;
import lombok.Data; import lombok.Data;
/** /**
...@@ -13,7 +14,10 @@ import lombok.Data; ...@@ -13,7 +14,10 @@ import lombok.Data;
public class StoryNovelAction extends Action { public class StoryNovelAction extends Action {
ClientInfo clientInfo; ClientInfo clientInfo;
//抖音故事会
StoryLogin storyLogin; StoryLogin storyLogin;
//抖音短剧
VideoUpload videoUpload;
DeliveryDeviceInfo deliveryDeviceInfo; DeliveryDeviceInfo deliveryDeviceInfo;
String openId; String openId;
int platformId; int platformId;
......
...@@ -14,6 +14,13 @@ spring: ...@@ -14,6 +14,13 @@ spring:
driver-class-name: com.mysql.cj.jdbc.Driver driver-class-name: com.mysql.cj.jdbc.Driver
initialSize: 2 initialSize: 2
minIdle: 2 minIdle: 2
video:
jdbc-url: jdbc:mysql://rm-2zeo09186ukqa8zh1.mysql.rds.aliyuncs.com:3306/video?zeroDateTimeBehavior=CONVERT_TO_NULL&characterEncoding=utf8&autoReconnect=true
username: lwby
password: VjxYfmY8J77ISChp
driver-class-name: com.mysql.cj.jdbc.Driver
initialSize: 2
minIdle: 2
redis: redis:
host: 172.17.243.150 host: 172.17.243.150
port: 6379 port: 6379
......
...@@ -35,6 +35,39 @@ ...@@ -35,6 +35,39 @@
<appender-ref ref="dystory_error" /> <appender-ref ref="dystory_error" />
</logger> </logger>
<!--抖音短剧小程序-->
<appender name="dyvideo_sys" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${LOG_DIR}/dyvideo_sys.log</File>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_DIR}/dyvideo_sys/dyvideo_sys.%d{yyyy-MM-dd}.log</fileNamePattern>
</rollingPolicy>
<encoder charset="UTF-8">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%level] [%thread] [%logger] [tr=%mdc{TRACE_ID:-0}] %msg %n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<logger name="dyvideo.sys" level="INFO" additivity="false">
<appender-ref ref="dyvideo_sys" />
</logger>
<appender name="dyvideo_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${LOG_DIR}/dyvideo_error.log</File>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_DIR}/dyvideo_error/dyvideo_error.%d{yyyy-MM-dd}.log</fileNamePattern>
</rollingPolicy>
<encoder charset="UTF-8">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%level] [%thread] [%logger] [tr=%mdc{TRACE_ID:-0}] %msg %n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<logger name="dyvideo.error" level="INFO" additivity="true">
<appender-ref ref="dyvideo_error" />
</logger>
<!--小说--> <!--小说-->
<appender name="novel_sys" class="ch.qos.logback.core.rolling.RollingFileAppender"> <appender name="novel_sys" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${LOG_DIR}/novel_sys.log</File> <File>${LOG_DIR}/novel_sys.log</File>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment