2016-12-01 26 views
0

我使用DSS 3.5.0和PostgreSQL,並且請求框中的一組操作不是以非常特殊的方式工作。我已經成功地在同一個項目中使用了包含數千個操作的請求框,包括非常類似於那些失敗的操作。其中一個大的請求框失敗了,花了一些時間尋找導致問題的操作之後,我們能夠將它減少到一組五個操作。DSS boxcarring跳過操作

問題

望着PostgreSQL的日誌,不執行由操作之一發出的查詢,因爲它永遠不會到達數據庫。

,我會打電話的操作O1O2O3O4O5和他們的查詢Q1Q2Q3Q4Q5。與請求播放並檢查所產生的數據庫日誌,我們結束了:

  • 請求對話框包含O1 - O2 - O3 - O4 - O5:數據庫中執行Q1 - Q2 - Q3 - Q5
  • 請求對話框包含O1 - O2 - O4 - O5:數據庫執行Q1 - Q2 - Q4 - Q5
  • 請求對話框包含O1 - O2 - O3 - O4:數據庫執行Q1 - Q2 - Q3 - Q4
  • 請求對話框包含O1 - O2 - O3 - O4 - O4 - O5:數據庫執行Q1 - Q2 - Q3 - Q5

所以,它看起來很奇怪,它似乎沒有遵循明確可辨的模式。

如果單獨發送到DSS或在兩個不同的請求框中,所有操作都會正確執行。操作的確切性質似乎並不直接與問題直接相關,因爲在其他情況下無數次使用相同的操作。查詢不是特別長或很複雜。

  • 操作1:更新表中的記錄甲
  • 操作2:刪除從表B中的記錄
  • 操作3:插入在表B中的記錄
  • 操作4:插入一個記錄在表甲
  • 操作5:在插入表B中的記錄(相同操作3)

錯誤和日誌

PostgreSQL出於操作5發出實際的錯誤信息是

ERROR: null value in column "element_id" violates not-null constraint 

這是預期的,因爲操作4(即消失的一個)插入稍後用於解析element_id操作5.

的值

PostgreSQL的日誌報告:

LOG: execute <unnamed>: BEGIN 
LOG: execute <unnamed>: UPDATE public.project_element SET element_uuid=$1,location_id=$2,from_revit=$3,name=$4,type=$5,model=NULLIF($6,0),parent_element=(SELECT PE.ELEMENT_ID FROM PROJECT_ELEMENT PE WHERE PE.PROJECT_ID = $7 AND (PE.ELEMENT_ID = $8 OR (PE.ELEMENT_UUID = $9 AND PE.ELEMENT_UUID IS NOT NULL))) ,left_border=$10,right_border=$11 WHERE element_id=$12 
DETAIL: parameters: $1 = '(element-uuid)', $2 = '85', $3 = '1', $4 = '(some-text)', $5 = '3', $6 = '0', $7 = '22', $8 = NULL, $9 = '(parent-uuid)', $10 = NULL, $11 = NULL, $12 = '9983' 
LOG: execute <unnamed>: DELETE FROM ELEMENT_PROPERTY WHERE ELEMENT_ID = (SELECT PE.ELEMENT_ID FROM PROJECT_ELEMENT PE WHERE PE.ELEMENT_ID = $1 AND PE.PROJECT_ID = $2) AND NAME = $3 
DETAIL: parameters: $1 = '9983', $2 = '22', $3 = 'num_ports' 
LOG: execute <unnamed>: INSERT INTO public.element_property(name,value,type,element_id) VALUES($1,$2,$3,(^M SELECT PE.ELEMENT_ID FROM PROJECT_ELEMENT PE WHERE PE.PROJECT_ID = $4 AND (PE.ELEMENT_ID = $5 OR (PE.ELEMENT_UUID = $6 AND PE.ELEMENT_UUID IS NOT NULL)))) 
DETAIL: parameters: $1 = 'num_ports', $2 = '48', $3 = '0', $4 = '22', $5 = NULL, $6 = '(element-uuid)' 
LOG: execute <unnamed>: INSERT INTO public.element_property(name,value,type,element_id) VALUES($1,$2,$3,(SELECT PE.ELEMENT_ID FROM PROJECT_ELEMENT PE WHERE PE.PROJECT_ID = $4 AND (PE.ELEMENT_ID = $5 OR (PE.ELEMENT_UUID = $6 AND PE.ELEMENT_UUID IS NOT NULL)))) 
DETAIL: parameters: $1 = 'port_num', $2 = '6', $3 = '0', $4 = '22', $5 = NULL, $6 = '(other-uuid)' 
ERROR: null value in column "element_id" violates not-null constraint 
DETAIL: Failing row contains (port_num, 6, 0, null). 
STATEMENT: INSERT INTO public.element_property(name,value,type,element_id) VALUES($1,$2,$3,(SELECT PE.ELEMENT_ID FROM PROJECT_ELEMENT PE WHERE PE.PROJECT_ID = $4 AND (PE.ELEMENT_ID = $5 OR (PE.ELEMENT_UUID = $6 AND PE.ELEMENT_UUID IS NOT NULL)))) 
LOG: execute S_2: BEGIN 
LOG: execute S_1: ROLLBACK 

DSS日誌,異常啓動,但我不知道它是否真的涉及到t他的問題。以下日誌從請求框開始到第一次投訴PostgreSQL返回的錯誤消息。此後DSS多次抱怨。

DEBUG - {org.apache.axis2.transport.http.AxisServlet} 
java.lang.NullPointerException 
    at javax.servlet.GenericServlet.getServletContext(GenericServlet.java:123) 
    at org.apache.axis2.transport.http.AxisServlet.createMessageContext(AxisServlet.java:715) 
    at org.apache.axis2.transport.http.AxisServlet$RestRequestProcessor.<init>(AxisServlet.java:819) 
    at org.apache.axis2.transport.http.AxisServlet.doPost(AxisServlet.java:227) 
    at org.wso2.carbon.core.transports.CarbonServlet.doPost(CarbonServlet.java:231) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:646) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) 
    at org.eclipse.equinox.http.servlet.internal.ServletRegistration.service(ServletRegistration.java:61) 
    at org.eclipse.equinox.http.servlet.internal.ProxyServlet.processAlias(ProxyServlet.java:128) 
    at org.eclipse.equinox.http.servlet.internal.ProxyServlet.service(ProxyServlet.java:68) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) 
    at org.wso2.carbon.tomcat.ext.servlet.DelegationServlet.service(DelegationServlet.java:68) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at org.wso2.carbon.ui.filters.CSRFPreventionFilter.doFilter(CSRFPreventionFilter.java:88) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at org.wso2.carbon.ui.filters.CRLFPreventionFilter.doFilter(CRLFPreventionFilter.java:59) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at org.wso2.carbon.tomcat.ext.filter.CharacterSetFilter.doFilter(CharacterSetFilter.java:61) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) 
    at org.wso2.carbon.tomcat.ext.valves.CompositeValve.continueInvocation(CompositeValve.java:99) 
    at org.wso2.carbon.tomcat.ext.valves.CarbonTomcatValve$1.invoke(CarbonTomcatValve.java:47) 
    at org.wso2.carbon.webapp.mgt.TenantLazyLoaderValve.invoke(TenantLazyLoaderValve.java:57) 
    at org.wso2.carbon.tomcat.ext.valves.TomcatValveContainer.invokeValves(TomcatValveContainer.java:47) 
    at org.wso2.carbon.tomcat.ext.valves.CompositeValve.invoke(CompositeValve.java:62) 
    at org.wso2.carbon.tomcat.ext.valves.CarbonStuckThreadDetectionValve.invoke(CarbonStuckThreadDetectionValve.java:159) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950) 
    at org.wso2.carbon.tomcat.ext.valves.CarbonContextCreatorValve.invoke(CarbonContextCreatorValve.java:57) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1074) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1739) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1698) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    at java.lang.Thread.run(Thread.java:744) 
DEBUG - Input contentType (application/json) {org.apache.axis2.builder.BuilderUtil} 
DEBUG - CharSetEncoding defaulted (UTF-8) {org.apache.axis2.builder.BuilderUtil} 
DEBUG - [MessageContext: logID=f9462531f982d008b3e2aacd88bfd07f4a7e4905c354170e] Checking for Service using target endpoint address : /services/iims {org.apache.axis2.dispatchers.RequestURIBasedServiceDispatcher} 
DEBUG - org.apache.axis2.i18n.resource::handleGetObject(servicefound) {org.apache.axis2.i18n.ProjectResourceBundle} 
DEBUG - [MessageContext: logID=f9462531f982d008b3e2aacd88bfd07f4a7e4905c354170e] Found AxisService : iims {org.apache.axis2.engine.AbstractDispatcher} 
DEBUG - Attempt to check for Operation using HTTP Location failed {org.apache.axis2.dispatchers.HTTPLocationBasedDispatcher} 
DEBUG - [MessageContext: logID=f9462531f982d008b3e2aacd88bfd07f4a7e4905c354170e] Attempted to check for Operation using target endpoint URI, but the operation fragment was missing {org.apache.axis2.dispatchers.RequestURIBasedOperationDispatcher} 
DEBUG - getAction (null) from [email protected] {org.apache.axis2.client.Options} 
DEBUG - SoapAction is (null) {org.apache.axis2.context.MessageContext} 
DEBUG - createSOAPEnvelope using Builder (class org.apache.axis2.json.JSONOMBuilder) selected from type (application/json) {org.apache.axis2.transport.TransportUtils} 
DEBUG - getAction (null) from [email protected] {org.apache.axis2.client.Options} 
DEBUG - SoapAction is (null) {org.apache.axis2.context.MessageContext} 
DEBUG - [MessageContext: logID=f9462531f982d008b3e2aacd88bfd07f4a7e4905c354170e] Checking for Operation using Action : null {org.apache.axis2.dispatchers.ActionBasedOperationDispatcher} 
DEBUG - [MessageContext: logID=f9462531f982d008b3e2aacd88bfd07f4a7e4905c354170e] Attempted to check for Operation using target endpoint URI, but the operation fragment was missing {org.apache.axis2.dispatchers.RequestURIBasedOperationDispatcher} 
DEBUG - Axis operation is null {org.apache.axis2.json.gson.JSONMessageHandler} 
DEBUG - No headers present corresponding to http://www.w3.org/2005/08/addressing {org.apache.axis2.handlers.addressing.AddressingInHandler} 
DEBUG - No headers present corresponding to http://schemas.xmlsoap.org/ws/2004/08/addressing {org.apache.axis2.handlers.addressing.AddressingInHandler} 
DEBUG - getAction (null) from [email protected] {org.apache.axis2.client.Options} 
DEBUG - SoapAction is (null) {org.apache.axis2.context.MessageContext} 
DEBUG - [MessageContext: logID=f9462531f982d008b3e2aacd88bfd07f4a7e4905c354170e] Checking for Operation using Action : null {org.apache.axis2.dispatchers.ActionBasedOperationDispatcher} 
DEBUG - getAction (null) from [email protected] {org.apache.axis2.client.Options} 
DEBUG - SoapAction is (null) {org.apache.axis2.context.MessageContext} 
DEBUG - [MessageContext: logID=f9462531f982d008b3e2aacd88bfd07f4a7e4905c354170e] Checking for Operation using Action : null {org.apache.axis2.dispatchers.ActionBasedOperationDispatcher} 
DEBUG - Get operation for request_box {org.apache.axis2.description.AxisService} 
DEBUG - Found axis operation: [email protected] {org.apache.axis2.description.AxisService} 
DEBUG - org.apache.axis2.i18n.resource::handleGetObject(operationfound) {org.apache.axis2.i18n.ProjectResourceBundle} 
DEBUG - [MessageContext: logID=f9462531f982d008b3e2aacd88bfd07f4a7e4905c354170e] Found AxisOperation : request_box {org.apache.axis2.engine.AbstractDispatcher} 
DEBUG - getAddressingRequirementParemeterValue: value: 'null' {org.apache.axis2.addressing.AddressingHelper} 
DEBUG - [MessageContext: logID=f9462531f982d008b3e2aacd88bfd07f4a7e4905c354170e] isReplyRedirected: ReplyTo is null. Returning false {org.apache.axis2.addressing.AddressingHelper} 
DEBUG - getAction (null) from [email protected] {org.apache.axis2.client.Options} 
DEBUG - Old WSAAction is (null) {org.apache.axis2.context.MessageContext} 
DEBUG - New WSAAction is (urn:request_boxResponse) {org.apache.axis2.context.MessageContext} 
DEBUG - setAction Old action is (null) {org.apache.axis2.client.Options} 
DEBUG - setAction New action is (urn:request_boxResponse) {org.apache.axis2.client.Options} 
DEBUG - messageID is null. {org.apache.axis2.context.ConfigurationContext} 
DEBUG - forceExpand: changing prefix from to {org.apache.axiom.om.impl.llom.OMSourcedElementImpl} 
DEBUG - DXXATransactionManager.begin() {org.wso2.carbon.dataservices.core.description.xa.DSSXATransactionManager} 
DEBUG - Creating data source connection {org.wso2.carbon.dataservices.core.description.config.SQLConfig} 
ERROR - ERROR: null value in column "element_id" violates not-null constraint_ Detalhe: Failing row contains (port_num, 6, 0, null). (Sanitized) {org.wso2.carbon.dataservices.core.description.query.SQLQuery} 
org.postgresql.util.PSQLException: ERROR: null value in column "element_id" violates not-null constraint 

實施

這是失敗的實際請求框(一些字段內容所取代,以降低噪聲):

{ 
    "request_box":{ 
    "update_project_element_operation":{ 
     "name":"(some-text)", 
     "element_id":9983, 
     "element_uuid":"(element-uuid)", 
     "from_revit":1, 
     "project_id":22, 
     "parent_element_uuid":"(parent-uuid)", 
     "type":3, 
     "location_id":85, 
     "model":0 
    }, 
    "delete_element_property_operation":{ 
     "name":"num_ports", 
     "element_id":9983, 
     "project_id":22 
    }, 
    "insert_element_property_operation":{ 
     "project_id":22, 
     "element_uuid":"(element-uuid)", 
     "name":"num_ports", 
     "value":"48" 
    }, 
    "insert_project_element_operation":{ 
     "name":"(this operation disappears)", 
     "element_id":0, 
     "element_uuid":"(other-uuid)", 
     "from_revit":1, 
     "project_id":22, 
     "parent_element_uuid":"(element-uuid)", 
     "type":10, 
     "location_id":85, 
     "model":0 
    }, 
    "insert_element_property_operation":{ 
     "project_id":22, 
     "element_uuid":"(other-uuid)", 
     "name":"port_num", 
     "value":"6" 
    } 
    } 
} 

我可以提供詳細表,查詢和操作定義如有必要。所有的操作都在之前使用過,如果單獨發佈或者在兩個不同的請求框中發佈,每個操作都可以工作。這似乎是直接與DSS boxcarring相關的問題。

任何想法?

回答

0

經過幾個星期的調查,包括與WSO2支持的直接聯繫,我們得出結論,這個不尋常的問題是由DSS內部的JSON到XML轉換引起的。這可能與JSON格式的請求框表示可以包含非唯一名稱(並且根據RFC 7159中的行爲在這種情況下不可預知並且實現定義)有關。應該注意的是,我們還使用了一個請求框,其中有成千上萬的重複名稱,沒有任何明顯的問題,所以它不是所有非唯一名稱未被正確處理的直接後果。

當我們嘗試XML中的相同請求框時,所有操作都正確執行。爲了避免更改應用程序,我們遵循WSO2的建議,並讓ESB將應用程序生成的JSON轉換爲XML。初步測試表明,在這種情況下,XML是正確生成的,但是我們決定稍微調整JSON生成器來發布操作對象數組,而不是包含具有非唯一名稱的成員的對象,以避免未定義的行爲和可能性JSON解析中的新的,不可預知的問題。

WSO2意識到這個問題,它可能會或可能不會被即將發佈的DSS修復。在此之前,避免請求框驚喜的更安全的方式似乎是在使用請求框向DSS發送事務時使用XML而不是JSON。