/** 基类实现消息监听接口,加上打印metaq监控日志的方法 */ @Override public ConsumeConcurrentlyStatus consumeMessage( List<MessageExt> msgs, ConsumeConcurrentlyContext context) { long startTime = System.currentTimeMillis(); logger.info("receive_message:{}", msgs.toString()); if (msgs == null || msgs.size() < 1) { logger.error("receive empty msg!"); return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; } List<Serializable> msgList = new ArrayList<>(); for (MessageExt message : msgs) { msgList.add(decodeMsg(message)); } final int reconsumeTimes = msgs.get(0).getReconsumeTimes(); MsgObj msgObj = new MsgObj(); msgObj.setReconsumeTimes(reconsumeTimes); msgObj.setMsgList(msgList); msgObj.setContext(context); context.setDelayLevelWhenNextConsume(getDelayLevelWhenNextConsume(reconsumeTimes)); ConsumeConcurrentlyStatus status = doConsumeMessage(msgObj); logger.info( "ConsumeConcurrentlyStatus:{}|cost:{}", status, System.currentTimeMillis() - startTime); return status; }
/** * 返回响应结果 * * @param response * @return */ public static RestResponse returnResponse( BaseRestRequest request, RestResponse response, RestServiceMapping serviceMapping, RestServiceConfiguration configuration) { String cmd = request.getRestRequest().getCmd(); // 调用后置拦截器 List<RestRequestAfterInterceptor> requestAfterInterceptors = configuration.getRequestAfterInterceptors(); for (RestRequestAfterInterceptor requestInterceptor : requestAfterInterceptors) { String requestInterceptorName = requestInterceptor.getName(); logger.debug( "REST_AFTER_INTERCEPTOR_START, cmd: {}, name: {}", cmd, requestInterceptorName + "|" + requestInterceptor.getClass().getName()); try { requestInterceptor.setConfiguration(configuration); requestInterceptor.execute(serviceMapping, request, response); } catch (Exception e) { response.setException(e); logger.warn("执行拦截器 {} 失败", requestInterceptorName, e); } logger.debug( "REST_AFTER_INTERCEPTOR_COMPLETE, cmd: {}, name: {}", cmd, requestInterceptorName + "|" + requestInterceptor.getClass().getName()); } return response; }
protected ConsumeConcurrentlyStatus exceptionConsumeConcurrentlyStatus( TransactionStatus status, Throwable e, MsgObj msgObj, int maxRetryCount) { logger.error("mq consume failed", e); status.setRollbackOnly(); if (msgObj.getReconsumeTimes() >= maxRetryCount) { logger.error( "retryCount: {}, msgs: {}, context: {}", maxRetryCount, msgObj, msgObj.getContext()); msgObj.setErrorMsg(e.getMessage()); doLogErrorConsumeMessage(msgObj); return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; } else { return ConsumeConcurrentlyStatus.RECONSUME_LATER; } }
public void destroy() { if (consumer != null) { consumer.shutdown(); logger.info( "consumer shutdown! topic={0},subExpression={1},group={2}", topic.getTopic(), subExpression, group); } }
private Serializable decodeMsg(MessageExt msg) { if (msg == null) { return null; } // 1.反序列化 try { return HessianUtils.decode(msg.getBody()); } catch (IOException e) { logger.error("反序列化出错!" + e.getMessage(), e); return null; } }
protected static void recordToErrorCounter(String cmd) { String today = DateUtil.format(new Date(), "yyyyMMdd"); try { RedisUtil.incr(ERROR_COUNT_KEY + today); } catch (Exception e) { logger.warn("记录api返回错误请求的次数失败, today: {}", today, e); } try { RedisUtil.incr(ERROR_COUNT_KEY + today + ":cmd:" + cmd); } catch (Exception e) { logger.warn("记录cmd: {}, today: {} 返回错误请求的次数失败", cmd, today, e); } }
public void addRioxxVersionSection(List upload, Item item) throws WingException { String version = item.getMetadata("rioxxterms.version"); if (StringUtils.isNotBlank(version) && !"NA".equals(version)) { try { DCInputsReader a = new DCInputsReader(); java.util.List<String> pairs = a.getPairs("rioxxterms_version"); int humanReadable = pairs.indexOf(version) - 1; version = pairs.get(humanReadable); } catch (DCInputsReaderException e) { log.error(e.getMessage(), e); } upload .addItem("upload-rioxx-version-warning", "upload-rioxx-version-warning") .addContent(T_rioxx_version.parameterize(version)); } }
public static void handleException(RestRequest request, RestResponse response, Throwable ex) { Throwable rootCause = ExceptionUtils.getRootCause(ex); rootCause = rootCause == null ? ex : rootCause; logger.error("捕获到Rest异常:request={}", request, rootCause); RestError restError = new RestError(); restError.setErrorCode(2); if (ex instanceof RestServiceException) { RestServiceException rse = (RestServiceException) ex; if (rse.getErrorCode() != 0) { restError.setErrorCode(rse.getErrorCode()); } restError.setErrorInfo(rse.getMessage()); } else { restError.setErrorInfo(RestApiConstants.DEFAULT_ERROR_INFO); if (request.isDebug()) { String stackTrace = ExceptionUtils.getStackTrace(rootCause); // 截取有用的部分 stackTrace = StringUtils.substringBefore(stackTrace, RestApiConstants.STACK_TRACE_BEFORE); response.setDebugInfo(stackTrace); } // 统计响应结果 recordToErrorCounter(request.getCmd()); } response.setStatusCode(500); response.setError(restError); response.setResponseTime(new Date()); }
public void init() throws MQClientException { nameServer = PropertyFileUtil.get("rocketmq.namesrv.domain"); if (StringUtils.isBlank(nameServer)) { logger.warn("【MQ init】property rocketmq.namesrv.domain not found"); return; } if ("localTest".equals(nameServer)) { logger.warn("【MQ init】localTest"); return; } if (StringUtils.isBlank(System.getProperty("rocketmq.namesrv.domain"))) { System.setProperty("rocketmq.namesrv.domain", nameServer); } topicType = getTopic(); topic = RocketMqUtils.getTopic(topicType); if (StringUtils.isBlank(group)) { group = "S_" + topic.getTopic() + "_" + topic.getTags(); } consumer = new DefaultMQPushConsumer(group); consumer.setNamesrvAddr(nameServer); consumer.setMessageModel(getMessageModel()); consumer.setConsumeThreadMin(minConsumeThread); consumer.setConsumeThreadMax(maxConsumeThread); // 可以不设置 设置后可以起多个 消费端 try { consumer.setInstanceName("DEFAULT_CONSUMER-" + InetAddress.getLocalHost().getHostName()); } catch (UnknownHostException e) { logger.error("getHostName error", e); } // 设置订阅的topic 设置订阅过滤表达式 if (StringUtils.isBlank(subExpression)) { subExpression = topic.getTags(); consumer.subscribe(topic.getTopic(), subExpression); } else { consumer.subscribe(topic.getTopic(), subExpression); } try { consumer.registerMessageListener(this); consumer.start(); } catch (MQClientException e) { logger.error( "consumer start error!topic={},subExpression={},group={}", topic.getTopic(), subExpression, group, e); } logger.info( "consumer start! topic={},subExpression={},group={}", topic.getTopic(), subExpression, group); }
/** * This is a step of the item submission processes. The upload stages allow the user to upload files * into the submission. The form is optimized for one file, but allows the user to upload more if * needed. * * <p>The form is broken up into three sections: * * <p>Part A: Ask the user to upload a file Part B: List previously uploaded files Part C: The * standard action bar * * @author Scott Phillips * @author Tim Donohue (updated for Configurable Submission) */ public class UploadStep extends AbstractSubmissionStep { private static Logger log = Logger.getLogger(UploadStep.class); /** Language Strings for Uploading * */ protected static final Message T_head = message("xmlui.Submission.submit.UploadStep.head"); protected static final Message T_file = message("xmlui.Submission.submit.UploadStep.file"); protected static final Message T_file_help = message("xmlui.Submission.submit.UploadStep.file_help"); protected static final Message T_file_error = message("xmlui.Submission.submit.UploadStep.file_error"); protected static final Message T_upload_error = message("xmlui.Submission.submit.UploadStep.upload_error"); protected static final Message T_virus_checker_error = message("xmlui.Submission.submit.UploadStep.virus_checker_error"); protected static final Message T_virus_error = message("xmlui.Submission.submit.UploadStep.virus_error"); protected static final Message T_description = message("xmlui.Submission.submit.UploadStep.description"); protected static final Message T_description_help = message("xmlui.Submission.submit.UploadStep.description_help"); protected static final Message T_submit_upload = message("xmlui.Submission.submit.UploadStep.submit_upload"); protected static final Message T_head2 = message("xmlui.Submission.submit.UploadStep.head2"); protected static final Message T_column0 = message("xmlui.Submission.submit.UploadStep.column0"); protected static final Message T_column1 = message("xmlui.Submission.submit.UploadStep.column1"); protected static final Message T_column2 = message("xmlui.Submission.submit.UploadStep.column2"); protected static final Message T_column3 = message("xmlui.Submission.submit.UploadStep.column3"); protected static final Message T_column4 = message("xmlui.Submission.submit.UploadStep.column4"); protected static final Message T_column5 = message("xmlui.Submission.submit.UploadStep.column5"); protected static final Message T_column6 = message("xmlui.Submission.submit.UploadStep.column6"); protected static final Message T_unknown_name = message("xmlui.Submission.submit.UploadStep.unknown_name"); protected static final Message T_unknown_format = message("xmlui.Submission.submit.UploadStep.unknown_format"); protected static final Message T_supported = message("xmlui.Submission.submit.UploadStep.supported"); protected static final Message T_known = message("xmlui.Submission.submit.UploadStep.known"); protected static final Message T_unsupported = message("xmlui.Submission.submit.UploadStep.unsupported"); protected static final Message T_submit_edit = message("xmlui.Submission.submit.UploadStep.submit_edit"); protected static final Message T_checksum = message("xmlui.Submission.submit.UploadStep.checksum"); protected static final Message T_submit_remove = message("xmlui.Submission.submit.UploadStep.submit_remove"); protected static final Message T_rioxx_version = message("xmlui.Submission.submit.UploadStep.rioxx_version"); protected static final Message T_sherpa_consult = message("xmlui.aspect.sherpa.submission.consult"); protected static final Message T_sherpa_title = message("xmlui.aspect.sherpa.submission.title"); protected static final Message T_sherpa_journal = message("xmlui.aspect.sherpa.submission.journal"); protected static final Message T_sherpa_publisher = message("xmlui.aspect.sherpa.submission.publisher"); protected static final Message T_sherpa_colour = message("xmlui.aspect.sherpa.submission.colour"); protected static final Message T_sherpa_more = message("xmlui.aspect.sherpa.submission.more"); /** Global reference to edit file page (this is used when a user requests to edit a bitstream) */ private EditFileStep editFile = null; /** Establish our required parameters, abstractStep will enforce these. */ public UploadStep() { this.requireSubmission = true; this.requireStep = true; } /** Check if user has requested to edit information about an uploaded file */ public void setup(SourceResolver resolver, Map objectModel, String src, Parameters parameters) throws ProcessingException, SAXException, IOException { super.setup(resolver, objectModel, src, parameters); // If this page for editing an uploaded file's information // was requested, then we need to load EditFileStep instead! if (this.errorFlag == org.dspace.submit.step.UploadStep.STATUS_EDIT_BITSTREAM) { this.editFile = new EditFileStep(); this.editFile.setup(resolver, objectModel, src, parameters); } else { this.editFile = null; } } public void addBody(Body body) throws SAXException, WingException, UIException, SQLException, IOException, AuthorizeException { // If we are actually editing information of an uploaded file, // then display that body instead! if (this.editFile != null) { editFile.addBody(body); return; } // Get a list of all files in the original bundle Item item = submission.getItem(); Collection collection = submission.getCollection(); String actionURL = contextPath + "/handle/" + collection.getHandle() + "/submit/" + knot.getId() + ".continue"; boolean disableFileEditing = (submissionInfo.isInWorkflow()) && !ConfigurationManager.getBooleanProperty("workflow", "reviewer.file-edit"); Bundle[] bundles = item.getBundles("ORIGINAL"); Bitstream[] bitstreams = new Bitstream[0]; if (bundles.length > 0) { bitstreams = bundles[0].getBitstreams(); } // Part A: // First ask the user if they would like to upload a new file (may be the first one) Division div = body.addInteractiveDivision( "submit-upload", actionURL, Division.METHOD_MULTIPART, "primary submission"); div.setHead(T_submission_head); addSubmissionProgressList(div); List upload = null; if (!disableFileEditing) { // Only add the upload capabilities for new item submissions upload = div.addList("submit-upload-new", List.TYPE_FORM); upload.setHead(T_head); addRioxxVersionSection(upload, item); File file = upload.addItem().addFile("file"); file.setLabel(T_file); file.setHelp(T_file_help); file.setRequired(); // if no files found error was thrown by processing class, display it! if (this.errorFlag == org.dspace.submit.step.UploadStep.STATUS_NO_FILES_ERROR) { file.addError(T_file_error); } // if an upload error was thrown by processing class, display it! if (this.errorFlag == org.dspace.submit.step.UploadStep.STATUS_UPLOAD_ERROR) { file.addError(T_upload_error); } // if virus checking was attempted and failed in error then let the user know if (this.errorFlag == org.dspace.submit.step.UploadStep.STATUS_VIRUS_CHECKER_UNAVAILABLE) { file.addError(T_virus_checker_error); } // if virus checking was attempted and a virus found then let the user know if (this.errorFlag == org.dspace.submit.step.UploadStep.STATUS_CONTAINS_VIRUS) { file.addError(T_virus_error); } Text description = upload.addItem().addText("description"); description.setLabel(T_description); description.setHelp(T_description_help); Button uploadSubmit = upload.addItem().addButton("submit_upload"); uploadSubmit.setValue(T_submit_upload); } make_sherpaRomeo_submission(item, div); // Part B: // If the user has already uploaded files provide a list for the user. if (bitstreams.length > 0 || disableFileEditing) { Table summary = div.addTable("submit-upload-summary", (bitstreams.length * 2) + 2, 7); summary.setHead(T_head2); Row header = summary.addRow(Row.ROLE_HEADER); header.addCellContent(T_column0); // primary bitstream header.addCellContent(T_column1); // select checkbox header.addCellContent(T_column2); // file name header.addCellContent(T_column3); // size header.addCellContent(T_column4); // description header.addCellContent(T_column5); // format header.addCellContent(T_column6); // edit button for (Bitstream bitstream : bitstreams) { int id = bitstream.getID(); String name = bitstream.getName(); String url = makeBitstreamLink(item, bitstream); long bytes = bitstream.getSize(); String desc = bitstream.getDescription(); String algorithm = bitstream.getChecksumAlgorithm(); String checksum = bitstream.getChecksum(); Row row = summary.addRow(); // Add radio-button to select this as the primary bitstream Radio primary = row.addCell().addRadio("primary_bitstream_id"); primary.addOption(String.valueOf(id)); // If this bitstream is already marked as the primary bitstream // mark it as such. if (bundles[0].getPrimaryBitstreamID() == id) { primary.setOptionSelected(String.valueOf(id)); } if (!disableFileEditing) { // Workflow users can not remove files. CheckBox remove = row.addCell().addCheckBox("remove"); remove.setLabel("remove"); remove.addOption(id); } else { row.addCell(); } row.addCell().addXref(url, name); row.addCellContent(bytes + " bytes"); if (desc == null || desc.length() == 0) { row.addCellContent(T_unknown_name); } else { row.addCellContent(desc); } BitstreamFormat format = bitstream.getFormat(); if (format == null) { row.addCellContent(T_unknown_format); } else { int support = format.getSupportLevel(); Cell cell = row.addCell(); cell.addContent(format.getMIMEType()); cell.addContent(" "); switch (support) { case 1: cell.addContent(T_supported); break; case 2: cell.addContent(T_known); break; case 3: cell.addContent(T_unsupported); break; } } Button edit = row.addCell().addButton("submit_edit_" + id); edit.setValue(T_submit_edit); Row checksumRow = summary.addRow(); checksumRow.addCell(); Cell checksumCell = checksumRow.addCell(null, null, 0, 6, null); checksumCell.addHighlight("bold").addContent(T_checksum); checksumCell.addContent(" "); checksumCell.addContent(algorithm + ":" + checksum); } if (!disableFileEditing) { // Workflow users can not remove files. Row actionRow = summary.addRow(); actionRow.addCell(); Button removeSeleceted = actionRow.addCell(null, null, 0, 6, null).addButton("submit_remove_selected"); removeSeleceted.setValue(T_submit_remove); } upload = div.addList("submit-upload-new-part2", List.TYPE_FORM); } // Part C: // add standard control/paging buttons addControlButtons(upload); } /** Sherpa romeo submission support */ public void make_sherpaRomeo_submission(Item item, Division divIn) throws WingException { if (ConfigurationManager.getBooleanProperty( "webui.submission.sherparomeo-policy-enabled", true)) { SHERPASubmitService sherpaSubmitService = new DSpace().getSingletonService(SHERPASubmitService.class); if (sherpaSubmitService.hasISSNs(context, item)) { List div = divIn.addList("submit-upload-new", List.TYPE_FORM); div.setHead(T_sherpa_title); // Since sherpa web service doesn't work reliable with more than 1 issn, perform the service // for each issn Set<String> issns = sherpaSubmitService.getISSNs(context, item); Iterator<String> issnsIterator = issns.iterator(); int i = 0; while (issnsIterator.hasNext()) { SHERPAResponse shresp = sherpaSubmitService.searchRelatedJournalsByISSN(issnsIterator.next()); java.util.List<SHERPAJournal> journals = shresp.getJournals(); java.util.List<SHERPAPublisher> publishers = shresp.getPublishers(); if (CollectionUtils.isNotEmpty(journals)) { for (SHERPAJournal journ : journals) { SHERPAPublisher pub = publishers.get(0); List sherpaList = div.addList("sherpaList" + (i + 1), "simple", "sherpaList"); sherpaList .addItem() .addFigure( contextPath + "/static/images/" + (i == 0 ? "romeosmall" : "clear") + ".gif", "http://www.sherpa.ac.uk/romeo/", "sherpaLogo"); sherpaList.addItem().addHighlight("sherpaBold").addContent(T_sherpa_journal); sherpaList.addItem(journ.getTitle() + " (" + journ.getIssn() + ")"); sherpaList.addItem().addHighlight("sherpaBold").addContent(T_sherpa_publisher); sherpaList.addItemXref(pub.getHomeurl(), pub.getName()); sherpaList.addItem().addHighlight("sherpaBold").addContent(T_sherpa_colour); sherpaList .addItem() .addHighlight("sherpaStyle " + pub.getRomeocolour()) .addContent(message("xmlui.aspect.sherpa.submission." + pub.getRomeocolour())); sherpaList .addItem() .addXref( "http://www.sherpa.ac.uk/romeo/search.php?issn=" + journ.getIssn(), T_sherpa_more, "sherpaMoreInfo"); i = i + 1; } } } List sherpaList = div.addList("sherpaListEnd", "simple", "sherpaList"); sherpaList.addItem(T_sherpa_consult); } } } /** * Each submission step must define its own information to be reviewed during the final * Review/Verify Step in the submission process. * * <p>The information to review should be tacked onto the passed in List object. * * <p>NOTE: To remain consistent across all Steps, you should first add a sub-List object (with * this step's name as the heading), by using a call to reviewList.addList(). This sublist is the * list you return from this method! * * @param reviewList The List to which all reviewable information should be added * @return The new sub-List object created by this step, which contains all the reviewable * information. If this step has nothing to review, then return null! */ public List addReviewSection(List reviewList) throws SAXException, WingException, UIException, SQLException, IOException, AuthorizeException { // Create a new list section for this step (and set its heading) List uploadSection = reviewList.addList("submit-review-" + this.stepAndPage, List.TYPE_FORM); uploadSection.setHead(T_head); // Review all uploaded files Item item = submission.getItem(); Bundle[] bundles = item.getBundles("ORIGINAL"); Bitstream[] bitstreams = new Bitstream[0]; if (bundles.length > 0) { bitstreams = bundles[0].getBitstreams(); } for (Bitstream bitstream : bitstreams) { BitstreamFormat bitstreamFormat = bitstream.getFormat(); String name = bitstream.getName(); String url = makeBitstreamLink(item, bitstream); String format = bitstreamFormat.getShortDescription(); Message support = ReviewStep.T_unknown; if (bitstreamFormat.getSupportLevel() == BitstreamFormat.KNOWN) { support = T_known; } else if (bitstreamFormat.getSupportLevel() == BitstreamFormat.SUPPORTED) { support = T_supported; } org.dspace.app.xmlui.wing.element.Item file = uploadSection.addItem(); file.addXref(url, name); file.addContent(" - " + format + " "); file.addContent(support); } // return this new "upload" section return uploadSection; } /** * Returns canonical link to a bitstream in the item. * * @param item The DSpace Item that the bitstream is part of * @param bitstream The bitstream to link to * @returns a String link to the bitstream */ private String makeBitstreamLink(Item item, Bitstream bitstream) { String name = bitstream.getName(); StringBuilder result = new StringBuilder(contextPath); result.append("/bitstream/item/").append(String.valueOf(item.getID())); // append name although it isn't strictly necessary try { if (name != null) { result.append("/").append(Util.encodeBitstreamName(name, "UTF-8")); } } catch (UnsupportedEncodingException uee) { // just ignore it, we don't have to have a pretty // name on the end of the url because the sequence id will // locate it. However it means that links in this file might // not work.... } result.append("?sequence=").append(String.valueOf(bitstream.getSequenceID())); return result.toString(); } public void addRioxxVersionSection(List upload, Item item) throws WingException { String version = item.getMetadata("rioxxterms.version"); if (StringUtils.isNotBlank(version) && !"NA".equals(version)) { try { DCInputsReader a = new DCInputsReader(); java.util.List<String> pairs = a.getPairs("rioxxterms_version"); int humanReadable = pairs.indexOf(version) - 1; version = pairs.get(humanReadable); } catch (DCInputsReaderException e) { log.error(e.getMessage(), e); } upload .addItem("upload-rioxx-version-warning", "upload-rioxx-version-warning") .addContent(T_rioxx_version.parameterize(version)); } } }
static { m_logger = Logger.getLogger((Class) AchievementsView.class); }