001 /** 002 * Copyright 2005-2013 The Kuali Foundation 003 * 004 * Licensed under the Educational Community License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.opensource.org/licenses/ecl2.php 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 package org.kuali.rice.ksb.messaging; 017 018 import java.sql.Timestamp; 019 020 import javax.persistence.Column; 021 import javax.persistence.Entity; 022 import javax.persistence.GeneratedValue; 023 import javax.persistence.Id; 024 import javax.persistence.NamedQueries; 025 import javax.persistence.NamedQuery; 026 import javax.persistence.Table; 027 import javax.persistence.Transient; 028 import javax.persistence.Version; 029 030 import org.hibernate.annotations.GenericGenerator; 031 import org.hibernate.annotations.Parameter; 032 import org.kuali.rice.core.api.config.CoreConfigHelper; 033 import org.kuali.rice.core.api.util.RiceUtilities; 034 import org.kuali.rice.core.framework.persistence.jpa.OrmUtils; 035 import org.kuali.rice.ksb.api.bus.ServiceConfiguration; 036 import org.kuali.rice.ksb.api.messaging.AsynchronousCall; 037 import org.kuali.rice.ksb.service.KSBServiceLocator; 038 import org.kuali.rice.ksb.util.KSBConstants; 039 040 /** 041 * A message which has been persisted to the data store. 042 * 043 * @author Kuali Rice Team (rice.collab@kuali.org) 044 */ 045 @Entity 046 @Table(name="KRSB_MSG_QUE_T") 047 //@Sequence(name="KRSB_MSG_QUE_S", property="routeQueueId") 048 @NamedQueries({ 049 @NamedQuery(name="PersistedMessage.FindAll", query="select pm from PersistedMessageBO pm"), 050 @NamedQuery(name="PersistedMessage.FindByServiceName", query="select pm from PersistedMessage pm where pm.serviceName = :serviceName and pm.methodName = :methodName"), 051 @NamedQuery(name="PersistedMessage.GetNextDocuments", query="select pm from PersistedMessage pm where pm.applicationId = :applicationId and pm.queueStatus <> :queueStatus and pm.ipNumber = :ipNumber order by queuePriority asc, routeQueueId asc, queueDate asc") 052 }) 053 public class PersistedMessageBO implements PersistedMessage { 054 055 private static final long serialVersionUID = -7047766894738304195L; 056 057 @Id 058 @GeneratedValue(generator="KRSB_MSG_QUE_S") 059 @GenericGenerator(name="KRSB_MSG_QUE_S",strategy="org.hibernate.id.enhanced.SequenceStyleGenerator",parameters={ 060 @Parameter(name="sequence_name",value="KRSB_MSG_QUE_S"), 061 @Parameter(name="value_column",value="id") 062 }) 063 @Column(name="MSG_QUE_ID") 064 private Long routeQueueId; 065 @Column(name="PRIO") 066 private Integer queuePriority; 067 @Column(name="STAT_CD") 068 private String queueStatus; 069 @Column(name="DT") 070 private Timestamp queueDate; 071 @Column(name="EXP_DT") 072 private Timestamp expirationDate; 073 @Column(name="RTRY_CNT") 074 private Integer retryCount; 075 @Version 076 @Column(name="VER_NBR") 077 private Integer lockVerNbr; 078 @Column(name="IP_NBR") 079 private String ipNumber; 080 @Column(name="SVC_NM") 081 private String serviceName; 082 @Column(name="APPL_ID") 083 private String applicationId; 084 @Column(name="SVC_MTHD_NM") 085 private String methodName; 086 @Transient 087 private AsynchronousCall methodCall; 088 @Transient 089 private PersistedMessagePayload payload; 090 @Column(name="APP_VAL_ONE") 091 private String value1; 092 @Column(name="APP_VAL_TWO") 093 private String value2; 094 095 public PersistedMessageBO() { 096 // default constructor 097 } 098 099 public static PersistedMessageBO buildMessage(ServiceConfiguration serviceConfiguration, AsynchronousCall methodCall) { 100 PersistedMessageBO message = new PersistedMessageBO(); 101 message.setPayload(new PersistedMessagePayload(methodCall, message)); 102 message.setIpNumber(RiceUtilities.getIpNumber()); 103 message.setServiceName(serviceConfiguration.getServiceName().toString()); 104 message.setQueueDate(new Timestamp(System.currentTimeMillis())); 105 if (serviceConfiguration.getPriority() == null) { 106 message.setQueuePriority(KSBConstants.ROUTE_QUEUE_DEFAULT_PRIORITY); 107 } else { 108 message.setQueuePriority(serviceConfiguration.getPriority()); 109 } 110 message.setQueueStatus(KSBConstants.ROUTE_QUEUE_QUEUED); 111 message.setRetryCount(0); 112 if (serviceConfiguration.getMillisToLive() > 0) { 113 message.setExpirationDate(new Timestamp(System.currentTimeMillis() + serviceConfiguration.getMillisToLive())); 114 } 115 message.setApplicationId(CoreConfigHelper.getApplicationId()); 116 message.setMethodName(methodCall.getMethodName()); 117 return message; 118 } 119 120 //@PrePersist 121 public void beforeInsert(){ 122 OrmUtils.populateAutoIncValue(this, KSBServiceLocator.getMessageEntityManagerFactory().createEntityManager()); 123 } 124 125 @Override 126 public String getApplicationId() { 127 return this.applicationId; 128 } 129 130 public void setApplicationId(String applicationId) { 131 this.applicationId = applicationId; 132 } 133 134 @Override 135 public String getIpNumber() { 136 return this.ipNumber; 137 } 138 139 public void setIpNumber(String ipNumber) { 140 this.ipNumber = ipNumber; 141 } 142 143 @Override 144 public Timestamp getQueueDate() { 145 return this.queueDate; 146 } 147 148 @Override 149 public Integer getQueuePriority() { 150 return this.queuePriority; 151 } 152 153 @Override 154 public String getQueueStatus() { 155 return this.queueStatus; 156 } 157 158 @Override 159 public Integer getRetryCount() { 160 return this.retryCount; 161 } 162 163 164 public void setQueueDate(Timestamp timestamp) { 165 this.queueDate = timestamp; 166 } 167 168 public void setQueuePriority(Integer integer) { 169 this.queuePriority = integer; 170 } 171 172 public void setQueueStatus(String string) { 173 this.queueStatus = string; 174 } 175 176 public void setRetryCount(Integer integer) { 177 this.retryCount = integer; 178 } 179 180 181 public Integer getLockVerNbr() { 182 return this.lockVerNbr; 183 } 184 185 public void setLockVerNbr(Integer lockVerNbr) { 186 this.lockVerNbr = lockVerNbr; 187 } 188 189 @Override 190 public Long getRouteQueueId() { 191 return this.routeQueueId; 192 } 193 194 public void setRouteQueueId(Long queueSequence) { 195 this.routeQueueId = queueSequence; 196 } 197 198 @Override 199 public String getServiceName() { 200 return this.serviceName; 201 } 202 203 public void setServiceName(String serviceName) { 204 this.serviceName = serviceName; 205 } 206 207 public String toString() { 208 return "[RouteQueue: " + ", routeQueueId=" + this.routeQueueId + ", ipNumber=" + this.ipNumber 209 + "applicationId=" + this.applicationId + ", serviceName=" + this.serviceName + ", methodName=" + methodName 210 + ", queueStatus=" + this.queueStatus + ", queuePriority=" + this.queuePriority 211 + ", queueDate=" + this.queueDate + "]"; 212 } 213 214 @Override 215 public AsynchronousCall getMethodCall() { 216 return this.methodCall; 217 } 218 219 public void setMethodCall(AsynchronousCall methodCall) { 220 this.methodCall = methodCall; 221 } 222 223 @Override 224 public String getMethodName() { 225 return this.methodName; 226 } 227 228 public void setMethodName(String methodName) { 229 this.methodName = methodName; 230 } 231 232 @Override 233 public Timestamp getExpirationDate() { 234 return this.expirationDate; 235 } 236 237 public void setExpirationDate(Timestamp expirationDate) { 238 this.expirationDate = expirationDate; 239 } 240 241 @Override 242 public PersistedMessagePayload getPayload() { 243 if (this.payload == null) { 244 if (this.getRouteQueueId() == null) { 245 return null; 246 } this.payload = KSBServiceLocator.getMessageQueueService().findByPersistedMessageByRouteQueueId(this.getRouteQueueId()); 247 } 248 return this.payload; 249 } 250 251 public void setPayload(PersistedMessagePayload payload) { 252 this.payload = payload; 253 } 254 255 @Override 256 public String getValue1() { 257 return this.value1; 258 } 259 260 public void setValue1(String value1) { 261 this.value1 = value1; 262 } 263 264 @Override 265 public String getValue2() { 266 return this.value2; 267 } 268 269 public void setValue2(String value2) { 270 this.value2 = value2; 271 } 272 273 }