我在一个支持全国网络上许多不同站点的大型组织工作.我们的供应商为我们在每个站点使用的硬件提供诊断工具.可通过Telnet访问诊断和报告.
问题是我们想要同时监控所有站点,目前我们只能一次检查一个站点(通过telnet).
我已经构建了一些Runtime.exec(String)用于向每个IP地址发送ping命令的东西.但现在我希望能够使用供应商的诊断和报告工具自动发送特定命令.有关最佳方法的任何想法吗?注意我们有一个混合系统 - 一些站点在防火墙后面,有些则没有.一个完整的解决方案将是理想的,但我也将满足于部分解决方案.
是否可以像获取由此返回的Process对象的输入和输出流Runtime.exec(String)并将我的命令发送到输入并读取输出上的响应一样简单?或者我应该连接到端口23(通常的telnet端口),然后表现为任何其他客户端 - 服务器系统.还是别的什么完全不同?
我正在继续尝试,只是在这一点集思广益......
代码:(删除敏感信息)
void exec(String ip)
{
Socket sock = null;
BufferedReader br = null;
PrintWriter pw = null;
try
{
sock = new Socket(ip, 23);
br = new BufferedReader(new InputStreamReader(sock.getInputStream()));
pw = new PrintWriter(sock.getOutputStream());
this.read(br);
System.out.println("Sending username");
pw.println("username");
this.read(br); // Always blocks here
System.out.println("Sending password");
pw.println("password");
this.read(br);
pw.close();
br.close();
sock.close();
}
catch(IOException e)
{
e.printStackTrace();
}
}
void read(BufferedReader br) throws IOException
{
char[] ca = …Run Code Online (Sandbox Code Playgroud) 我正在使用一个Transform对象来保存我的XML文件,但它似乎删除了空文本节点.有没有办法创建(并保持)带有空字符串即""的文本节点.
以下是我创建节点的方法:
Element type = doc.createElement("TYPE");
type.appendChild(doc.createTextNode(value));
Run Code Online (Sandbox Code Playgroud)
只是有时候value是一个空字符串"".当我用文本编辑器查看XML时,我看到了
<TYPE />
Run Code Online (Sandbox Code Playgroud)
代替
<TYPE></TYPE>
Run Code Online (Sandbox Code Playgroud)
在我读回这个XML文件并遍历节点后,<TYPE>元素根本没有任何子节点,即使我为它明确创建了一个#text节点!
编辑 - 感恩节快乐(我的加拿大同胞)
重要提示,我不是从一组已知的标签开始工作,而是我正在处理的程序使用文本节点的存在JTextField来为GUI 分配.只是有时候该字段是空的(不是空而是"").当我存储该字段然后将其读回时,GUI不再渲染JTextField,因为没有文本节点.所以我正在研究创建XML文档的方法,即使文档节点中没有任何内容,也可以创建文本节点.如果简单地无法用XML完成,那么我将不得不使用一个属性来标记可编辑的标签(有点像Andrey Breslav建议的那样),因此应该有一个JTextField分配.
我将尝试Mads Hansen关于不间断空间的建议.
有谁知道java.util.Date是如何序列化的?我的意思是向我解释每个字节到底是什么?我尝试写了一个很长的日期,我可以看到比赛,但还有其他人物,我只是没有得到.
我们的应用程序使用数据生成服务器请求,这意味着它从客户端到服 进行压力测试的团队使用捕获这些请求并修改它们的工具,问题是他们想要处理日期而我不知道如何解释字节流.我正在谈论的家伙似乎愿意学习,但到目前为止,我还没有找到任何我理解的指向他...
我使用的代码:
FileOutputStream fos = null;
ObjectOutputStream oos = null;
try
{
fos = new FileOutputStream("t.tmp");
oos = new ObjectOutputStream(fos);
Date today = new Date();
oos.writeLong(today.getTime());
oos.writeObject("Today");
oos.writeObject(today);
oos.close();
}
catch(FileNotFoundException e)
{
e.printStackTrace();
}
catch(IOException e)
{
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
编辑:
上面的输出是:
"¬í w ,áqÇ-t Todaysr java.util.DatehjKYt xpw ,áqÇ-x"
Run Code Online (Sandbox Code Playgroud)
长的是"w,áqÇ-"所以long和Date对象之间的东西是什么,即"hjKYt xp"
注意一些空白是不可打印的字符NULL,SOH,退格等.我理解这是重要的十六进制值.
编辑:
还有问题.由于某种原因,序列化的HTTP请求没有像我接受的答案那样序列化日期.非常接近,但仍然不同,我不知道为什么.甚至更奇怪的是,当我简单地序列化一个日期时,似乎工作得很好.在我们使用Websphere 6.1的工作中,以下是请求中发送内容的一些示例:
lr_start_transaction("20000101");
\\x0Ejava.util.Datehj\\x81\\x01KYt\\x19\\x03\\x00\\x00xpw\\x08\\x00\\x00\\x01,\\xE10\\x0BXxt\\x00\\x08
lr_start_transaction("20000102");
\\x0Ejava.util.Datehj\\x81\\x01KYt\\x19\\x03\\x00\\x00xpw\\x08\\x00\\x00\\x01,\\xE10>\\x9Dxt\\x00\\x08
lr_start_transaction("20000103");
\\x0Ejava.util.Datehj\\x81\\x01KYt\\x19\\x03\\x00\\x00xpw\\x08\\x00\\x00\\x01,\\xE10z\\xDBxt\\x00\\x08
Run Code Online (Sandbox Code Playgroud)
我已经能够识别大多数字段但不是实际时间!例如serialVersionUID是hj\\x81\\x01KYt\\x19
编辑(最终):
我找到了日期,但它没有在我预期的地方附近!我的样本很好,因为其他数据字段出现我认为日期已经完成 - 只是侥幸,我注意到我正在寻找的日期的十六进制模式!例:
lr_start_transaction("20000101");
\\x0Ejava.util.Datehj\\x81\\x01KYt\\x19\\x03\\x00\\x00xpw\\x08\\x00\\x00\\x01,\\xE10\\x0BXxt\\x00\\x08OTTST153t\\x00\\x06/Web2/t\\x00\\x044971t\\x00\\x0B12ce12f737d\\x00\\x00\\x01,\\xE10\\x0BXsq\\x00~\\x00\\x0Fw\\x08\\x00\\x00\\x00\\xDCk\\xE2T\\x80xt
Run Code Online (Sandbox Code Playgroud)
日期值正好在最后!
如果我有一个静态变量从一个使用单例模式的类中赋值,那么它是否会以某种方式要求所有可能为该静态变量赋值的类被加载?
我正在使用看起来像这样的代码(简化以保护公司数据):
private static DEVICE_FACTORY;
String factoryType = propertyFile.getDeviceFactoryType();
if(factoryType.equals("REAL"))
DEVICE_FACTORY = RealDeviceFactory.getInstance();
else
DEVICE_FACTORY = SimulatedDeviceFactory.getInstance();
Run Code Online (Sandbox Code Playgroud)
每种工厂的代码都是完全不同的项目.应用程序jar的生产版本不包含任何模拟类.我的问题是,当我尝试测试我的生产代码时,我得到了" NoClassDefFoundError"引起的" ClassNotFoundException".我已经确认该属性已正确设置为"REAL",因此我不知道为什么JVM甚至试图创建/加载模拟类...
编辑我将尝试创建一个明天演示问题的简化版本.堆栈跟踪(编辑为受保护的公司数据)如下:
java.lang.NoClassDefFoundError: my/package/SimulatedDeviceFactory
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Unknown Source)
at java.lang.Class.getMethod0(Unknown Source)
at java.lang.Class.getMethod(Unknown Source)
at sun.launcher.LauncherHelper.getMainMethod(Unknown Source)
at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)
Caused by: java.lang.ClassNotFoundException: my.package.SimulatedDeviceFactory
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
Run Code Online (Sandbox Code Playgroud)
可能是因为我在每种类型的设备工厂都使用单例模式,即使我不打算使用SimulatedDeviceFactory,因为我正在使用来自该类的静态方法调用,JVM认为它还需要加载它?
如果是这种情况,我可以使用反射和FQCN来快速解决这个问题......
我有以下SVG代码:
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="50%" height="50%">
<defs>
<radialGradient id="star_grad">
<stop offset="0%" style="stop-color: #faf589;"/>
<stop offset="50%" style="stop-color: #fbf300;"/>
<stop offset="100%" style="stop-color: #fbbc00;"/>
</radialGradient>
<filter id="star_filter">
<feTurbulence baseFrequency=".04" result="ripples" />
<feMerge>
<feMergeNode in="SourceGraphic" />
<feMergeNode in="ripples" />
</feMerge>
</filter>
</defs>
<circle cx="50%" cy="50%" r="25%" style="fill: url(#star_grad); filter: url(#star_filter);" />
Run Code Online (Sandbox Code Playgroud)
而且我得到了我想要的大部分内容但由于某种原因我无法弄清楚如何将滤镜应用于圆圈 - 它总是将它应用于边界框加上10%.我可以诉诸裁剪但更愿意学习如何仅将滤镜应用于我想要影响的形状......
注意它不必合并,我已经尝试过复合,运气也不多 - 我只想要一种最有效的方法将滤镜应用到没有剪裁的形状 - 如果可能的话.
我有一个带有一些 Javascript 的 PHP 页面,它在固定的时间间隔(5 秒)后更改 IMG 标签上的 SRC 属性。我循环浏览的图像数量是固定的。PHP 为所有图像 URL 构建一个字符串数组。图像很小,大多数小于 10k。
如何判断浏览器是否正在缓存图像,如果不是,我必须做些什么来确保浏览器确实缓存了它们?
有没有办法确定HTTPServletResponse内容的大小?我读了这个get-size-of-http-response-in-java问题,但遗憾的是我工作的地方我无法访问CommonsIO :(
响应内容由单个复杂对象组成,因此我考虑将其写入临时文件,然后检查该文件.当应用程序在生产中运行时,这不是我想要做的诊断,但是如果可能的话就想避免它.
PS我读了erickson的答案但它提到了输入流我想知道正在写出的对象的大小...如果writeObject()方法返回一个代表字节而不是void... 的数字,那将是非常好的
我有以下java.util.Timer但它似乎没有执行,我不知道为什么.
public static void main(String[] args)
{
Timer to = new Timer(true);
System.out.println("Now=" + System.currentTimeMillis());
to.schedule(new TimeOutTask("Short#1 - 250"), 250);
to.schedule(new TimeOutTask("Long - 10050"), 10050);
to.schedule(new TimeOutTask("Short#2 - 250"), 250);
to.schedule(new TimeOutTask("Medium - 5050"), 5050);
to.schedule(new TimeOutTask("Short#3 - 250"), 250);
}
Run Code Online (Sandbox Code Playgroud)
所有的TimeOutTask工作都是打印传递的字符串和当前时间.当守护程序标志为false时,应用程序不会终止,我看到:
Now=1297705592543
Short#1 - 250:1297705592793
Short#3 - 250:1297705592793
Short#2 - 250:1297705592793
Medium - 5050:1297705597605
Long - 10050:1297705602605
Run Code Online (Sandbox Code Playgroud)
如果为true,则应用程序终止,我看到:
Now=1297705249422
Run Code Online (Sandbox Code Playgroud)
我只是想找到一种方法来监控多个任务以达到超时目的; 我不希望监视超时的线程阻止应用程序终止.所以我想要守护进程但是当我把它作为守护进程时,我的任务似乎都没有执行?!?!
编辑:
有趣的是,我认为我的问题源于我孤立地尝试新想法的方式.如果我有一个真正的应用程序运行它将保持守护程序线程活着,因为这些线程只代表超时我不在乎它们是否完成主应用程序完成.
我将此代码添加到我的main方法的末尾以弹出框架并通过在不同时间关闭它来进行测试.如果我等待的时间足够长,我的所有线程都会执行,如果不这样做,那么即使某些任务没有执行,应用程序也会正常终止.
JFrame f = new JFrame("Test Frame");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
Run Code Online (Sandbox Code Playgroud)
感谢你的帮助.
可以说我有一个有两个方法的类calculateBonus(Account a)和calculatePenalty(Account a).
假设我将synchronized关键字添加到方法中或synchronized(this)在方法内部有一个块.这是否有效地意味着如果一个线程正在计算账户上的奖金,那么在奖金完成之前,其他线程是否可以计算其他账户的罚款?
处罚和奖金是多种多样和复杂的,账户可能同时收到.它们的计算顺序无关紧要(有一个截止日期,因此不会影响另一个的结果)但是我不会尝试同时在同一个帐户上计算两者,这一点至关重要(对于明显的数据)一致性原因,每个方法内部都有状态和审计跟踪信息更新.
设计我的代码的最佳方法是什么,以便我可以安全地最大化并行处理?
到目前为止我考虑过这些选项:
1)将计算奖金和罚金的代码放在不同的类中,并使用synchronized方法上的关键字.不喜欢这个想法,因为我希望将一些共享的复杂函数放在一起,它们不受IO限制并快速执行,因此不会影响性能.
2)同步传入的Account参数.如果我正确理解这意味着我无法计算在另一个线程中执行的另一个账户的奖金,直到在第一个线程中的第一个账户上计算奖金.但我可以计算在不同的线程在不同的帐户罚款-只是不相同的帐户.我最喜欢这个,但我想确保我理解正确.
3)为我想要同步的每个方法创建一个内部私有锁对象,一个用于奖励,另一个用于惩罚.如果正确理解这意味着只有一个线程可以一次计算奖金,但它不会阻止另一个线程同时计算同一账户的罚款.
现在我明白我必须小心避免死锁,我计划确保任何同步块内的任何内容都不依赖于对其他同步方法的调用.我还打算确保在计算中使用的影响最终值的任何局部变量都在synchronized块内.
我试图声明一个onclick方法,该方法将调用一个清除和重建显示的函数,显示所单击项目的更多细节.问题是onclick我尝试分配的方法在分配时执行,所以我看到的是其中一个项目的详细视图.
如果删除该i.node.onclick行,则会看到5个随机放置的项目,您可以将其悬停但不会单击.
HTML
<html>
<head>
<title>Raphael Play</title>
<script type="text/javascript" src="Raphael.js"></script>
<script type="text/javascript" src="Test.js"></script>
<style type="text/css">
#map
{
width: 500px;
border: 1px solid #aaa;
}
</style>
</head>
<body>
<div id="map"></div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
JavaScript的
var map;
var items = new Array();
window.onload = function()
{
map = new Raphael(document.getElementById('map'), 500, 500);
for(cnt = 0; cnt < 5; cnt++)
{
var x = 5 + Math.floor(Math.random() * 490);
var y = 5 + Math.floor(Math.random() * 490);
items[cnt] …Run Code Online (Sandbox Code Playgroud) java ×7
classloader ×1
concurrency ×1
html ×1
httpresponse ×1
io ×1
javascript ×1
php ×1
raphael ×1
svg ×1
svg-filters ×1
xml ×1